There are already two great answers, but Ī̲’d like to add information about the phrase “virtual terminal”. Generally, it means something that provides appearance/functionality of a terminal, i. e. a terminal-emulator in broad sense. But in early days of Linux (1994–95) is was used synonymously with “virtual console” (several unrelated user interfaces), by some developers. This usage persists in documentation; two different terms were (and are) used to refer to tty1, tty2… thingies. Nowadays (since ≈ 1996) “virtual terminal” may also refer to pty-based terminal emulators.
Linux’s vt (the driver of text mode system console) was the first piece of its kernel. It was initially used for connection to mainframes and in this sense it’s a “virtual terminal”, hence the name. The code controlling virtual consoles resides in vt.c as well. Linux kernel engineers consistently use the word “consoles” to denote tty1, tty2… and used “vc_” prefix for them. For example, there is a vc_allocate function. On the other hand, developers of such user-space tools as kbd and console-tools used “virtual console” (VC) and “virtual terminal” (VT) interchangeably. Ī̲ contacted Andries E. Brouwer and asked him to clarify terminology used by early developers (1994–95). Andries kindly provided some answers. He states that VT and VC are synonymous and “indivisible” abbreviations.
--> In general, a virtual console is a virtual terminal, but converse isn’t true. Those “virtual terminals” that are not virtual consoles are indeed pseudoterminals (as Andries states, these are not VT). Unlike virtual consoles, where the kernel provides terminal functionality for a console application, pseudoterminals use PTY “devices” to arrange communication between console applications and the terminal-making program that runs in userspace. Examples are X-based terminal emulators and sshd, that allocates a pseudotty for each login session. A pseudotty may not be called “console” – it’s a mistake.