VLMCSD-FLOPPY(7)

NAME
floppy144.vfd - a bootable floppy disk with Linux and vlmcsd(8)

DESCRIPTION
floppy144.vfd is an image of a bootable floppy that contains a minimal version of Linux and vlmcsd(8). It requires only 16 MB of RAM. Its primary purpose is to run vlmcsd(8) in a small virtual machine which makes it easy to use vlmcsd(8) to activate the virtual machine's host computer which is not possible in Windows 8.1 and up. The floppy image is a standard 3,5" floppy with 1.44 MB storage. It is formatted with a FAT12 filesystem. The floppy can be mounted to apply several customizations.

SUPPORTED HYPERVISORS
The floppy image has been tested with the following hypervisors:

    VMWare, VirtualBox, Hyper-V and QEMU
Others are likely to work.

SETUP
Create a new virtual machine. Assign 16 MB of RAM. Add a floppy drive and attach floppy144.vfd to this drive. Do not create a virtual hard disk. Setup the virtual machine to boot from a floppy drive (VirtualBox has floppy boot disabled by default). If possible, setup a virtual machine with plain old BIOS (not UEFI). If you created an UEFI virtual machine, enable the compatibility support mode (CSM) to allow a BIOS compatible boot. Set number of CPUs to 1. The Linux kernel is not capable of SMP. Remove IDE, SATA, SCSI and USB support if possible. The Linux kernel can't handle this and ignores any devices connected to these buses. Setup an ethernet card. The following models are supported:

    Intel PRO/1000
    AMD PCNET III
    AMD PCNET32
    VMWare vmxnet3 (paravirtualized driver used by VMWare)
    virtio (paravirtualized driver used by VirtualBox, QEMU, KVM and lguest)
Most hypervisors emulate an Intel PRO/1000 or AMD PCNET32 by default. Selecting a paravirtualized driver slightly improves performance. In VirtualBox you can simply select virtio in the network configuration dialog. VMWare requires that you add or change the VMX file. Use 'ethernet0.virtualDev = "vmxnet3"' in your VMWare config file. If you are using QEMU, you must also setup a TAP adapter. Port redirection does not work to activate your own computer.

CONFIGURATION
floppy144.vfd can be customized to fit your needs. This is done by editing the file syslinux.cfg on the floppy image. The floppy image must be mounted. Under Linux you can simply attach floppy144.vfd to a loop device which is mountable like any other block device. For Windows you must use some software that allows mounting a floppy image, e.g. OSFMount works under all Windows versions beginning with Windows XP up to Windows 10 (32- and 64-bit). The default syslinux.cfg file looks like this:

    prompt 0
    TIMEOUT 50
    default dhcp
    LABEL dhcp
    KERNEL bzImage
    APPEND vga=773 quiet initrd=initrd KBD=us LISTEN=[::]:1688,0.0.0.0:1688 TZ=UTC0 IPV4_CONFIG=DHCP NTP_SERVER=pool.ntp.org HOST_NAME=vlmcsd ROOT_PASSWORD=vlmcsd USER_NAME=user USER_PASSWORD=vlmcsd GUEST_PASSWORD=vlmcsd INETD=Y WINDOWS=06401-00206-271-395032-03-1033-9600.0000-1652016 OFFICE2010=06401-00096-199-204970-03-1033-9600.0000-1652016 OFFICE2013=06401-00206-234-921934-03-1033-9600.0000-1652016 HWID=36:4F:46:3A:88:63:D3:5F LABEL static
    KERNEL bzImage
    APPEND vga=773 quiet initrd=initrd KBD=fr LISTEN=[::]:1688,0.0.0.0:1688 TZ=CET-1CEST,M3.5.0,M10.5.0/3 IPV4_CONFIG=STATIC IPV4_ADDRESS=192.168.20.123/24 IPV4_GATEWAY=192.168.20.2 IPV4_DNS1=192.168.20.2 IPV4_DNS2=NONE NTP_SERVER=pool.ntp.org HOST_NAME=vlmcsd ROOT_PASSWORD=vlmcsd USER_NAME=user USER_PASSWORD=vlmcsd GUEST_PASSWORD=vlmcsd INETD=Y

There are two configurations in this files: dhcp (for configuring the IPv4 network via DHCP) and static (for a static IPv4 configuration). The kernel always boots the dhcp configuration without asking (lines 'prompt 0' and 'default dhcp'). You can simply change the default configuration to static and then customize the APPEND line in the static configuration. For more details how to customize the syslinux.cfg file see syslinux(1). Each APPPEND line contains one or more items seperated by spaces. All items are case-sensitive. The following parameters can be customized:

vga=vesa-video-mode
    Sets the VESA display mode for the virtual machine. The parameter is not optional. If you ommit it, you will not see anything on the screen. 773 means 1024x768 with 256 colors. See for more video modes. Note that all 16 color (4-bit) modes will not work. Use 8-bit (256 colors), 16-bit (65536 colors), 24-bit and 32-bit (> 16 Million colors) only. All modes above 1280x1024 are non-VESA-standard and vary for all (virtual) graphic cards.

quiet
    This causes the kernel not display the its log during boot. You may omit quiet but it doesn't make much sense. The boot log is actually very verbose and scrolls away from screen quickly. If any errors occur during boot, they will be displayed even if quiet is present in the APPEND line. You may evaluate the complete boot log later by using the dmesg command or the menu on /dev/tty8.

initrd=initial-ram-disk-file
    This defines the initial ram disk that the kernel will read. There is only one initial ram disk on the floppy thus leave initrd=initrd as it is.

KBD=keyboard-layout-name
    This allows you to select the keyboard layout. keyboard-layout-name is usually the ISO 3166-1 (top level domain) code for a country. A list of valid keyboard-layout-names can be accessed via the menu system on /dev/tty8 (press ALT-F8). Note, that this is a keyboard driver only. There is no Unicode font support in floppy144.vfd (due to the fact that the kernel uses a generic VESA framebuffer device only). Characters beyond ASCII work for Western European languages only but not Eastern European, Greek, Cyrillic, Arabic, Hebrew, CJK and other languages. There is no need in floppy144.vfd to enter any characters outside ASCII. The purpose of the keyboard maps are that you will find characters like dash, backslash, brackets, braces, etc. at the usual place on your keyboard.

LISTEN=PRIVATE[:tcp-port] | ip-address[:tcp-port][,ip-address[:tcp-port]][,...]
    One or more combinations of IP addresses and optional TCP port seperated by commas that vlmcsd(8) should listen on or PRIVATE to listen on all private IP addresses only. The default port is 1688. If you use an explicit port number, append it to the IP address seperated by a colon. If you use a port number and the IP address contains colons, you must enclose the IP address in brackets. For example 192.168.0.2,[fd00::dead:beef]:5678 causes vlmcsd(8) to listen on 192.168.0.2 port 1688 and fd00::dead:beef port 5678.

WINDOWS=epid
    Defines the ePID that is used for Windows activations. If you ommit this parameter, vlmcsd generates a random ePID when it is started.

OFFICE2010=epid
    Defines the ePID that is used for Office 2010 activations. If you ommit this parameter, vlmcsd(8) generates a random ePID when it is started.

OFFICE2013=epid
    Defines the ePID that is used for Office (versions 2013 and greater) activations. If you ommit this parameter, vlmcsd(8) generates a random ePID when it is started.

HWID=hwid
    Defines the HwId that is sent to clients. hwid must be specified as 16 hex digits that are interpreted as a series of 8 bytes (big endian). Any character that is not a hex digit will be ignored. This is for better readability.

TZ=posix-time-zone-string
    Set the time zone to posix-time-zone-string. It must conform to the specification. Simplified time zone strings like "Europe/London" or "America/Detroit" are not allowed. This has the very simple reason that there is no space on the floppy to store the time zone database. The string CET-1CEST,M3.5.0,M10.5.0/3 (most countries in Europe) reads as follows:

    CET The standard (winter) time zone has the name CET.

    -1  The standard time zone is one hour east of UTC. Negative numbers are east of UTC. Positive numbers are west of UTC.

    CEST
        The daylight saving (summer) time zone has the name CEST.

    M3.5.0
        Daylight saving time starts in the 3rd month (March) on the 5th (=last) occurence of weekday 0 (Sunday) at 2 o'clock (2 o'clock is a default value).

    M10.5.0/3
        Daylight saving time ends in the 10th month (October) on the 5th (=last) occurence of weekday 0 (Sunday) at 3 o'clock.

    If you don't have daylight saving time, things are easier. For Chinese Standard Time for example, just use CST-8 as the time zone string. On a Linux desktop system, you can use a command like strings /usr/share/zoneinfo/America/New_York | tail -n1. This should return EST5EDT,M3.2.0,M11.1.0. You can use the returned string for the TZ=posix-time-zone-string parameter.

IPV4_CONFIG=DHCP | STATIC
    This determines how you want to configure IPv4 networking. If you use IPV4_CONFIG=STATIC, you must supply additional paramaters to the APPEND command line.

IPV4_ADDRESS=ipv4-address/CIDR-mask
    Use ipv4-address with netmask CIDR-mask for static IPv4 configuration. The netmask must not be ommitted. For IPv4 address 192.168.12.17 with a netmask of 255.255.255.0 use 192.168.12.17/24. For IPv4 address 10.4.0.8 with a netmask of 255.255.0.0 use 10.4.0.8/16. This paramater is ignored, if you used IPV4_CONFIG=DHCP.

IPV4_GATEWAY=ipv4-address | NONE
    Use ipv4-address as the default gateway. This is usually the IPv4 address of your router. You may specify NONE explicitly for no gateway. In this case your virtual machine is only visible on its local LAN. This paramater is ignored, if you used IPV4_CONFIG=DHCP.

IPV4_DNS1=ipv4-address | NONE
    Use ipv4-address as the primary name server. In home networks this is often the IPv4 address of your router. You may specify NONE explicitly. If you specified NONE for both IPV4_DNS1= and IPV4_DNS2=, your virtual machine cannot resolve host names to IP addresses. While vlmcsd(8) works perfectly without DNS servers, you must use IP addresses when referring to a host, e.g. for specifying an NTP server. This paramater is ignored, if you used IPV4_CONFIG=DHCP.

IPV4_DNS2=ipv4-address | NONE
    Use ipv4-address as the secondary name server. It serves as a backup if the primary name server is not available. Home networks often don't have a secondary name server. In this case set this to NONE. This paramater is ignored, if you used IPV4_CONFIG=DHCP.

NTP_SERVER=host-name | ipv4-address | NONE
    This sets the name of a time server using the NTP protocol. If your virtualization environment reliably provides time, you can set this to NONE. Don't use a public time service like pool.ntp.org or time.nist.gov if you have a (at least somewhat reliable) NTP server in your LAN.

HOST_NAME=host-name
    Sets the local host name for your virtual machine. It can be a single name or a fully-qualified domain name FQDN. If you used IPV4_CONFIG=DHCP and your DHCP server returns a domain name, the domain part of an FQDN will be replaced by that name. This host name or host part of an FQDN will not replaced by a host name returned via DHCP. The host name is not important for the operation of floppy144.vfd.

ROOT_PASSWORD=password
    Sets the password of the root user.

USER_NAME=username
    Sets the name of for a general user with no special privileges. This user can login but can't do much.

USER_PASSWORD=password
    Sets the password for the user defined by USER_NAME=username.

GUEST_PASSWORD=password
    Sets the password for the pre-defined guest user. This user has the same priviliges (none) as the user defined by USER_NAME=username.

INETD=Y | N
    INETD=Y specifies that inetd(8) should automatically be started. That means you can telnet and ftp to your virtual machine.

OPERATION

  Diskless System
The floppy144.vfd virtual machine is a diskless system that works entirely from RAM. The file system is actually a RAM disk that is created from the initrd(4) file on the floppy image. Anything you'll do from inside the virtual machine, for instance editing a config file, will be lost when you reboot the machine. So, if you ever asked yourself if rm -fr / (root privileges required) really deletes all files from all mounted partitions, the floppy144.vfd VM is the right place to test it (Yes, it does). The VM uses a RAM disk, because the Linux kernel had to be stripped down to essential features to fit on a 1.44 MB floppy. It has no floppy driver, no disk file system drivers and no block layer (cannot use disks of any type).

  System startup
The kernel boots up very quickly and the init script (/sbin/init) waits 5 seconds. In these 5 seconds you can:

    Press 'm' to manually enter the time zone and the IPv4 parameters. These will be queried interactively.
    Press 't' to manually enter the time zone only.
    Press 's' to escape to a shell.
If you don't want to 5 seconds for continuing the init process, you can press any other key to speed things up. At the end of the init script you should see thatvlmcsd(8) has started. You should also see the IP addresses and all user names and passwords.

  Logging into the system
There are 5 local logins provided on /dev/tty2 to /dev/tty6. To switch to these logins, simply press ALT-F2 to ALT-F6. To return to the console on /dev/tty1, press ALT-F1. If inetd(8) is running you can also use telnet(1). This allows you use a terminal program (e.g. putty) that can utilize your keyboard layout, can be resized and has full UTF-8 support. The local terminals support US keyboard layout only. Please be aware that telnet(1) is unencrypted and everything including passwords is transmitted in clear text. There is not enough space for an ssh server like sshd(8) or dropbear(8). The floppy image only provides basic Unix commands. Type busybox or ll /bin to get a list. The only editor available is vi(1). If you don't like vi, you may transfer config files via ftp(1) edit them with the editor of your choice and transfer them back to the floppy144.vfd VM.

  The menu system
You'll find a menu system on /dev/tty8 (press ALT-F8 to see it). It allows you performing some administrative tasks and to view various system information. It is mainly for users that do not have much experience with Unix commands.

1) (Re)start vlmcsd
    Starts or restarts vlmcsd(8). This is useful if you changed /etc/vlmcsd.ini(5).

2) Stop vlmcsd
    Stops vlmcsd(8).

3) (Re)start inetd
    Starts or restarts inetd(8). If inetd(8) is restarted, current clients connected via telnet(1) or ftp(1) will not be dropped. They can continue their sessions. This is useful if you changed /etc/inetd.conf(5).

4) Stop inet
    Stops inetd(8). All clients connected via telnet(1) or ftp(1) will be dropped immediately.

5) Change the time zone
    Just in case you missed pressing 't' during system startup. This also restarts vlmcsd(8) if it was running to notify it that the time zone has changed. Restarting vlmcsd(8) allows currently connected clients to finish their activation.

k) Change keyboard layout
    This allows you to select a different keyboard layout.

6) Show all kernel boot parameters
    Shows all parameters passed to the kernel via syslinux.cfg. If you experience any unexpected behavior, you can use this to check if your APPEND line in syslinux.cfg is correct. The output is piped through less(1). So press 'q' to return to the menu.

7) Show boot log (dmesg)
    Shows the boot log of the kernel. The output is piped through less(1). So press 'q' to return to the menu.

8) Show TCP/IP configuration
    Shows the TCP/IP configuration, listening sockets and current TCP and UDP connections. Useful, if you problems with net connectivity. The output is piped through less(1). So press 'q' to return to the menu.

9) Show running processes
    Shows all processes including memory and CPU usage. Display will updated every second. Press 'q' or CTRL-C to return to the menu.

s) Shutdown
    Shuts down the floppy144.vfd virtual machine. Proper shutdown is not required. It is ok to use a hard power off in your virtualization program.

r) Reboot
    Reboots the floppy144.vfd virtual machine. Proper reboot is not required. It is ok to use a hard reset in your virtualization program.

PERMANENT CHANGES OF INITRD
If you want to change any file or script of the file system (e.g. the init script /sbin/init or /etc/vlmcsd.ini), you'll need to mount the floppy image, unpack the initrd(4) file, make any modfications you like, create a new initrd(4) file and copy it to the mounted floppy. To unpack the initrd(4) file you'll need xz(1) (or lzma(1) on older unix-like OSses) and cpio(1). These can be installed using your package manager on all major distros. It is ok to use the BSD version of cpio(1). No need to get the GNU version for BSD users. Provided the floppy is mounted in /mnt/floppy do the following:

Create an empty directory
    mkdir ~/vlmcsd-floppy-initrd

cd into that directory
    cd ~/vlmcsd-floppy-initrd

Unpack initrd
    cat /mnt/floppy/initrd | unlzma | cpio -i
After applying your changes build a new initrd(4) file:

cd into your directory
    cd ~/vlmcsd-floppy-initrd

Create the packed file
    find . | cpio -o -H newc | lzma > /mnt/floppy/initrd
Do not try to use 'lzma -9' to achive better compression. The kernel can't read the resulting file. While customizing the initrd(4) file works on almost any unix-like OS, it does not work on Windows even not with Cygwin. The reason is that the NTFS file system can't handle uids and gids. These cannot be preserved when unpacking the cpio(1) archive to NTFS. If you use the WSL subsystem of Windows 10 Redstone (Anniversary Update) and later, you must make sure to unpack the initrd(4) file to a directory on VolFs (normally everything that is not mounted under /mnt). The initrd(4) file can be on a VolFs or DriveFs.

FAQ

  On what distro is the floppy image based?
None. Besides the boot loader ldlinux.sys, there are only three binaries: The Linux kernel bzImage, busybox(1) and vlmcsdmulti-x86-musl-static. bzImage and busybox(1) have been compiled with carefully selected configuration parameters not found in any distro. This was neccesary to fit everything on a 1.44 MB floppy.

  Why is a rather old Linux kernel (3.12) used?
Linux 3.12 is the last kernel that can be booted with 16 MB of RAM. Beginning with Linux 3.13 it requires much more memory (about 80 MB) to boot. The floppy image is regularly tested with newer kernels. Everything works except that you need to assign much more main memory to the virtual machine.

  Can the floppy be booted on bare metal?
Basically yes. However, only Intel Pro/1000 and AMD PCNET32 ethernet cards are supported by the kernel. In addition there is no USB support compiled into the kernel. That means you can only use an IBM AT or IBM PS/2 keyboard which are not available on newer hardware.

FILES
syslinux.cfg, vlmcsd.ini(5)

BUGS
IPv6 cannot be configured with static or manual parameters.
DHCPv6 is not supported.
'ip route add ...' does not work. Use 'route add ...' instead.

AUTHOR
floppy144.vfd has been created by Hotbird64

CREDITS
Linus Torvalds et al. for the Linux kernel
Erik Andersen et al. for the original uClibc
Waldemar Brodkorb et al. for uClibc-ng
Denys Vlasenko et al. for BusyBox
H. Peter Anvin et al. for SYSLINUX

SEE ALSO
vlmcsd(8), vlmcsd.ini(5), initrd(4), busybox(1), syslinux(1)