Repository: philpagel/debian-headless Branch: main Commit: 550a51bc21d1 Files: 10 Total size: 25.3 KB Directory structure: gitextract_6zhhsmin/ ├── .gitignore ├── Dockerfile ├── LICENSE ├── Makefile ├── Makevars ├── README.md ├── preseed.cfg ├── preseed_with_ssh_keys.cfg └── templates/ ├── grub.cfg.template └── isolinux.cfg.template ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.iso *.qcow *.swp tmp/ todo.md ================================================ FILE: Dockerfile ================================================ FROM debian:trixie RUN apt-get update && apt-get install -y \ make wget libarchive-tools syslinux syslinux-utils cpio genisoimage \ coreutils util-linux \ && rm -rf /var/lib/apt/lists/* ================================================ FILE: LICENSE ================================================ BSD 3-Clause License Copyright (c) 2018, Philipp Pagel All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: Makefile ================================================ include Makevars .PHONY: help install-depends config download image unpack bootconfig preseed md5 \ iso qemu-bios qemu-uefi usb FAT clean mrproper docker-image\ help: @echo @echo "Usage:" @echo @echo " make install-depends Install dependencies" @echo " make config Edit configuration (Makevars)" @echo " make download download *latest* Debian netinst image" @echo " make example-preseed.cfg download example-preseed.cfg from Debian" @echo " make image Build the ISO image" @echo " make docker-image Build ISO image using a Docker container" @echo " make qemu-bios Boot ISO image in QEMU (BIOS mode)" @echo " make qemu-uefi Boot ISO image in QEMU (UEFI boot)" @echo " make usb Write ISO to USB device" @echo " make FAT Add a FAT partition ot the USB stick" @echo " make clean Clean up temporary files and folders" @echo " make mrproper Make clean and remove the output ISO" @echo @echo "See README.md for details" @echo install-depends: sudo apt-get install \ wget libarchive-tools syslinux syslinux-utils cpio genisoimage \ coreutils qemu-system qemu-system-x86 qemu-utils util-linux config: "$(if $(EDITOR),$(EDITOR),editor)" Makevars .ONESHELL: download: set -e TMPFILE=`mktemp -p ./` wget -O $$TMPFILE https://www.debian.org/CD/netinst/ IMGURL=`grep -o -P -e "https://cdimage.debian.org/debian-cd/current/${ARCH}/iso-cd/debian.*?netinst.iso" $$TMPFILE | head -n1` wget -N $$IMGURL rm -f $$TMPFILE example-preseed.cfg: wget -N -O $@ https://www.debian.org/releases/stable/example-preseed.txt image: unpack bootconfig preseed md5sums iso unpack: # Unpack the image to the folder and set write permissions. rm -rf ${TMP} mkdir ${TMP} bsdtar -C ${TMP} -xf ${SOURCE} chmod -R +w ${TMP} bootconfig: # Create a minimal boot config – no menu, no prompt # isolinux (BIOS) sed -e "s//${ARCHFOLDER}/g" \ -e "s//console=${CONSOLE}/g" \ ${ISOLINUX_CFG_TEMPLATE} > ${TMP}/isolinux/isolinux.cfg # grub (UEFI) sed -e "s//${ARCHFOLDER}/g" \ -e "s//console=${CONSOLE}/g" \ ${GRUB_CFG_TEMPLATE} > ${TMP}/boot/grub/grub.cfg preseed: preseed.cfg # Write the preseed file to initrd. gunzip ${TMP}/install.${ARCHFOLDER}/initrd.gz echo preseed.cfg | cpio -H newc -o -A -F ${TMP}/install.${ARCHFOLDER}/initrd gzip ${TMP}/install.${ARCHFOLDER}/initrd md5sums: # Recreate the MD5 sums of all files. find ${TMP}/ -type f -exec md5sum {} \; > ${TMP}/md5sum.txt iso: ${TMP} # Create ISO and fix MBR for USB boot. genisoimage -V ${LABEL} \ -r -J -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -eltorito-alt-boot \ -e boot/grub/efi.img \ -no-emul-boot \ -o ${TARGET} ${TMP} isohybrid --uefi ${TARGET} qemu-bios: image.qcow # boot image in qemu (BIOS mode) @echo @echo "Once the installer has launched networking you can log in:\n" @echo " ssh installer@localhost -p22222\n" @echo "It may take a few minutes for the installer to get to that point.\n" @echo "Alternatively connect to the serial console:\n" @echo " telnet localhost 33333\n" ${QEMU} -m 1024 \ -net user,hostfwd=tcp::22222-:22 \ -net nic \ -hda image.qcow \ -serial telnet:localhost:33333,server,nowait \ -cdrom ${TARGET} qemu-uefi: image.qcow # boot image in qemu (UEFI mode) @echo @echo "Once the installer has launched networking you can log in:\n" @echo " ssh installer@localhost -p22222\n" @echo "It may take a few minutes for the installer to get to that point.\n" @echo "Alternatively connect to the serial console:\n" @echo " telnet localhost 33333\n" ${QEMU} -m 1024 \ -net user,hostfwd=tcp::22222-:22 \ -bios /usr/share/ovmf/OVMF.fd \ -net nic \ -hda image.qcow \ -serial telnet:localhost:33333,server,nowait \ -cdrom ${TARGET} image.qcow: # Create a virtual disk for QEMU. qemu-img create -f qcow2 $@ 10G usb: # Write the image to usb stick. @echo "This will overwrite all data on ${USBDEV}!" @read -p "Type 'yes' if you really want to do this: " proceed; \ if [ $$proceed = "yes" ] ; then \ echo "writing image to ${USBDEV}"; \ sudo dd if=${TARGET} of=${USBDEV} bs=4k ; \ sync ; \ else \ echo "Aborting" ; \ fi FAT: # Add a FAT partition in the remaining free space (e.g. for driver files). @echo "This will overwrite ${USBDEV}!" @read -p "Type 'yes' if you really want to do this: " proceed; \ if [ $$proceed = "yes" ] ; then \ echo " , , 0xb" | sudo sfdisk ${USBDEV} -N 3 ;\ sudo mkfs.vfat ${USBDEV}3 ;\ sync ;\ else \ echo "Aborting" ; \ fi Docker: Dockerfile docker build -t debian-headless . docker-image: Docker docker run --rm -w /build -v $(shell pwd):/build -it debian-headless make image clean: rm -rf ${TMP} rm -f image.qcow mrproper: clean rm -f ${TARGET} docker image rm -f debian-headless ================================================ FILE: Makevars ================================================ # Configuration # Source ISO image file SOURCE = debian-13.4.0-amd64-netinst.iso # Target ISO image file TARGET = debian-13.4.0-amd64-netinst-hl.iso # Image label (must be ≤ 32 chars) LABEL = Debian-13.4.0-amd64-headless # Machine architecture # As of Debian 13 (Trixie), only `amd64` is supported. # For legacy versions (Bookworm and earlier), you can # also choose `i368`. # Other architectures are not supported, because they # use very different boot mechanisms ARCH = amd64 #ARCH = i386 # only available for Debian 12.x an earlier # Where to find the usb drive # CAUTION: if set incorrectly you may ruin your system! #USBDEV = /dev/null USBDEV = /dev/sda ############################################################ # You can probably leave alone everything below this line ############################################################ # Console configuration # # Format: DEV[,PARMS] # DEV: typically ttyS0, ttyS1 or ttyUSB0 # # SERIALPARMS format (according to LINUX kenrel documentation): # depend on the driver. For the serial port this # defines the baudrate/parity/bits/flow control of # the port, in the format BBBBPNF, where BBBB is the # speed, P is parity (n/o/e), N is number of bits, # and F is flow control ('r' for RTS). Default is # 9600n8. The maximum baudrate is 115200. # For serial console: CONSOLE = ttyS0,115200n8 # For local console (i.e. also offer normal non-headless installation): # CONSOLE = tty0 # Folder for image unpacking TMP = tmp ISOLINUX_CFG_TEMPLATE = templates/isolinux.cfg.template GRUB_CFG_TEMPLATE = templates/grub.cfg.template # set architecture-dependent variables ifeq "${ARCH}" "amd64" ARCHFOLDER = amd QEMU = qemu-system-x86_64 else ifeq "${ARCH}" "i386" ARCHFOLDER = 386 QEMU = qemu-system-i386 endif # vim: set syntax=make : ================================================ FILE: README.md ================================================ # Debian headless/remote installation Installing Debian is easy enough – but what if you have no physical access to the target machine or it has no screen or keyboard? Stock images require at least a few local key strokes before you can continue the installation, remotely... This little tool will remaster a stock Debian image for 100% remote installation via ssh or serial console. ## In a nutshell # Edit the configuration variables make config # download the latest Debian netinst image make download # Adapt preseed.cfg edit preseed.cfg # Build image make image # Write image to usb stick make usb ## Motivation I wanted to install Debian on a server remotely – i.e. without keyboard access or the chance to peek at a physical screen. I found plenty of information on the net but none of the tutorials really worked for me. Some included preseeding the image but failed to automatically start the installation without a key press, others seemed to customize a zillion things but ended up getting stuck in some error message or other. The problem with ssh remote installation with stock images is that they still require some initial human interaction to select the desired menu option and some basic setup before the network is configured. That makes the whole point of remote installation moot... So I read my way through lots of tutorials and put together a slim working solution – at least working for me. So here is my minimal and lazy solution to Debian headless installation image building. I mostly documented it for myself but maybe it's useful for someone out there. My main intent was to connect to the ssh-server of the Debian installer. Another possible route for headless installation is via serial console. That can either be a physical RS-232 cable or a virtual serial port provided by a remote management module/software such as HPEs iLO or something similar. ## Known quirks and issues The Makefile we use here to implement all functionality intentionally lacks some of the typical Make magic: Targets don't track dependencies so you will have to rebuild everything, whenever you change something. So please `make clean`, first. Yes – a full build will cost you a valuable six seconds every time. Use them to worship code simplicity. I didn't have much luck with booting i386 images via UEFI – neither the stock Debian images nor the remastered ones. But maybe it's just my particular machine/BIOS... ## Dependencies To install all necessary tools run: make install-depends This tool was developed and tested on Debian LINUX. While all major LINUX distributions are likely to offer the necessary pieces of software, there may be some non-obvious differences. Accordingly, I recommend to run this on a Debian system. One difference that I am aware of is that many distributions use either `genisoimage` or `mkisofs` and make one of them a symbolic link to the other. In this particular case, they are not interchangeable – `genisoimage` is required. If you don't have a Debian system, you can build using a docker container – see [below](#building-in-a-non-debian-environment) ## Configuration Edit `Makevars` and set the variables to match your situation. You can use make config to do so. This should work on most Debian-based systems. If it doesn't, just edit the `Makevars` file with your preferred text editor. ### Image names, architecture and usb device At the very minimum you need to set the following variables: `SOURCE`: the name of your stock Debian ISO image file. `TARGET` the name of the remastered ISO image. `ARCH` (DEPRECATED) indicates the target processor architecture – `amd64` or `i386` (other architectures are not supported). This variable is used to identify the installation folder in the image (`install.amd`) and to determine which image to download. As of Debian 13, `i386` is no longer a supported architecture. For the moment, I will keep the variable to support working with legacy versions. In the long run this option will disappear. `USBDEV` is the device file that represents your usb stick. The latter is needed for `make usb` and `make FAT`. Be **extra careful** to set `USBDEV` correctly! If you set it incorrectly, you may overwrite your system disk! `LABEL` is the CD volume label. It *must* be ≤ 32 chars in length. ### Console parameters While the main goal of this project was to allow installation via `ssh`, a serial console is an alternative in some cases. The following default config for the serial console device should work most of the time: CONSOLE = ttyS0,115200n8 When the serial console is active, *all output* is redirected to the serial interface and you will not see boot messages or the installer on a connected screen after that point. Accordingly, normal local installation will not work. If you want your image to allow local installation (i.e. non-headless), instead, you may set CONSOLE = tty0 ## Download Debian installation image You can just download the latest Debian *netinst* image with make download If this is not the image you want to start with, just download/provide one yourself and save it in the folder where this Makefile lives. In any case, make sure to set the `SOURCE` variable in the config file (`make config`) to match the image name. ## Preseeding Preseeding is Debian's method of automatically answering some or all of the configuration questions you usually have to answer during the installation process. You *must provide* a `preseed.cfg` file for headless installation! The included `preseed.cfg` file configures the bare minimum to get past the installer questions so that network and ssh can be launched. Please edit the file – at least change the password... If the minimal file does not cover all your needs, get a full template make example-preseed.cfg mv example-preseed.cfg preseed.cfg and modify it to your needs. For comprehensive information on preseeding, study this: or ## Building the ISO make clean make image ## Manual modifications to the image For experts, only! If you know what you are doing, you can now enter the `tmp` folder and add packages, edit files etc. You can find some information on what you can do [here](https://wiki.debian.org/DebianInstaller/Modify/CD). But you don't need to manually follow the steps for re-creating md5 sums and assembling the image. To pack your changes into the image just run the last steps manually, again: make md5sums make iso ## Dry run it This step is optional but may save you a lot of trouble later. make qemu-bios make qemu-uefi This will fire up a QEMU session booting your new image. You can follow the boot process in the emulator and eventually connect to the installer like this: ssh installer@localhost -p22222 Or via serial console: telnet localhost 33333 So you can test-drive the installation before trying it on a real server. The default password is `r00tme` – please change it in the preseeding file. Alternatively, you can configure passwordless login via ssh key file – there is example code in the `preseed.cfg`. For this to work, you need to provide the key file from a local web server. In pinch, this may be all you need: python3 -m http.server And here a little screenshot of what that looks like in qemu. The two bottom panels show the local screen (left) and the serial console (right): ![](screenshot.png) ## Write to usb stick or burn cd If you still have a cdrom drive, use your favorite ISO burner to write the image to cd. I can't find my old usb-cd drive and prefer using a usb stick, anyway: Insert a USB stick and find out its device file lsblk **Double check**, that `USBDEV` is set correctly in `Makevars`. **Caution:** The next two steps will write to the device configured in the `USBDEV`. If you failed to set that correctly, you will overwrite whatever disk happens to be associated with that device! Write the image to the stick: make usb Add a FAT partition to the stick: make FAT This may be useful if you need to add custom firmware files or anything else you would like to use during installation. ## Building in a non-Debian environment The build process works on Debian machines. However, some users want to install a headless Debian machine but don't run Debian on their own computer. If you run into problems building the image on your OS, you can use the `docker-image` target. This will build a minimal Debian container, install the dependencies and run the build process in the docker container, instead of your local OS. That way, you can easily run this on non-Debian systems like Arch, Fedora etc. Please note that the output files of the docker build are owned by root, so you need to clean up with `sudo make clean` afterwards. ## Remote Installation via ssh Insert the USB stick (or CD) in the target system and power it up. Wait a few minutes for the installer to boot and bring up the network. Find out the IP address of the machine (e.g. from the router/DHCP server). Alternatively, configure static IP in the preseed file. Once the system is up you should be able to ping it. Now log in and complete the installation remotely: ssh installer@yourmachine The default password is `r00tme`; it can (and should!) be configured in the preseeding file. Alternatively, you can configure passwordless login via ssh key file – there is example code in the `preseed.cfg`. For this to work, you need to provide the key file from a local web server. NOTE: The included minimal `preseed.cfg` assumes that you are connected via LAN cable (as a server should be). If you want to/must use a WIFI connection you need to configure this. ## Remote installation via serial console If the serial interface was configured correctly, you should be able to connect through a terminal program (`cu`, `minicom`, etc.) via serial interface. E.g. cu -l /dev/ttyUSB0 -s 115200 or screen /dev/ttyUSB0 115200 Where `/dev/ttyUSB0` is the serial interface on your local computer which is connected to the server. In the case of a virtual serial interface in iLO (or similar), please refer to the manufacturers instructions on how to connect to it. ## Random notes Just because it took me a while to realize: The Debian remote-installer uses `screen` to provide multiple virtual consoles. You can switch between them with `CTRL-a TAB`. See `man screen` for more information. # Contributing If you found a bug or have an idea for improvements, feel free to open an issue and describe the fix or feature you have in mind. Please don't submit a pull request without discussing it, first. ================================================ FILE: preseed.cfg ================================================ #### Contents of the preconfiguration file (for stretch) ### Localization # Locale sets language and country. d-i debian-installer/locale string en_US.UTF-8 d-i debian-installer/language string en d-i debian-installer/country string DE # Keyboard selection. d-i console-keymaps-at/keymap select us d-i keyboard-configuration/xkb-keymap select us ### Network configuration #d-i netcfg/choose_interface select eth0 d-i netcfg/choose_interface select auto # Any hostname and domain names assigned from dhcp take precedence over # values set here. However, setting the values still prevents the questions # from being shown, even if values come from dhcp. d-i netcfg/get_hostname string tempwatch d-i netcfg/get_domain string local # If you want to force a hostname, regardless of what either the DHCP # server returns or what the reverse DNS entry for the IP is, uncomment # and adjust the following line. #d-i netcfg/hostname string tempwatch # Static network configuration - uncomment if desired #d-i netcfg/disable_autoconfig boolean true #d-i netcfg/get_ipaddress string 192.168.0.10 #d-i netcfg/get_netmask string 255.255.255.0 #d-i netcfg/get_gateway string 192.168.0.1 #d-i netcfg/get_nameservers string 192.168.0.1 #d-i netcfg/confirm_static boolean true # If non-free firmware is needed for the network or other hardware, you can # configure the installer to always try to load it, without prompting. Or # change to false to disable asking. d-i hw-detect/load_firmware boolean true # Setup network console d-i preseed/early_command string anna-install network-console d-i network-console/start select continue # Login with password: d-i network-console/password password r00tme d-i network-console/password-again password r00tme # Login with ssh key: # d-i network-console/authorized_keys_url string https://my.server/authorized_key # disable login with password: # d-i network-console/password-disabled boolean true ================================================ FILE: preseed_with_ssh_keys.cfg ================================================ #### Contents of the preconfiguration file (for stretch) ### Localization # Locale sets language and country. d-i debian-installer/locale string en_US.UTF-8 d-i debian-installer/language string en d-i debian-installer/country string DE # Keyboard selection. d-i console-keymaps-at/keymap select us d-i keyboard-configuration/xkb-keymap select us ### Network configuration #d-i netcfg/choose_interface select eth0 d-i netcfg/choose_interface select auto # Any hostname and domain names assigned from dhcp take precedence over # values set here. However, setting the values still prevents the questions # from being shown, even if values come from dhcp. d-i netcfg/get_hostname string tempwatch d-i netcfg/get_domain string local # If you want to force a hostname, regardless of what either the DHCP # server returns or what the reverse DNS entry for the IP is, uncomment # and adjust the following line. #d-i netcfg/hostname string tempwatch # Static network configuration - uncomment if desired #d-i netcfg/disable_autoconfig boolean true #d-i netcfg/get_ipaddress string 192.168.0.10 #d-i netcfg/get_netmask string 255.255.255.0 #d-i netcfg/get_gateway string 192.168.0.1 #d-i netcfg/get_nameservers string 192.168.0.1 #d-i netcfg/confirm_static boolean true # If non-free firmware is needed for the network or other hardware, you can # configure the installer to always try to load it, without prompting. Or # change to false to disable asking. d-i hw-detect/load_firmware boolean true # Setup network console # # It also adds an ssh key so it's possible to ssh using a hardcoded key # instead of a hardcoded password # # CONFIG: the ssh key used is a fake key. Replace it with your key. d-i preseed/early_command string anna-install network-console; \ mkdir -p /.ssh; \ /bin/sh -c "echo 'ssh-ed25519 IkxcEAPhTmUlSPMGXtXwGDOyMJoPuPw1vMcoWF1VtyvDX6b1uEG7A68hLEAdaglpEYPs foobar' >> /.ssh/authorized_keys"; \ chown -R root:root /.ssh/; \ chmod 600 /.ssh/authorized_keys; \ chmod 700 /.ssh/ d-i network-console/start select continue # Login with password: #d-i network-console/password password r00tme #d-i network-console/password-again password r00tme # Login with ssh key: # d-i network-console/authorized_keys_url string https://my.server/authorized_key # disable login with password: # d-i network-console/password-disabled boolean true # The hashed password. The hash used is 'yescrypt'. The password is r00tme d-i passwd/root-password-crypted password $y$j9T$KExqDg1NJD/O8tOKKPFKZ0$0oYiztbbVLLitCPtVd5TKxeB1edk.CusVf3WeIzmvE6 # Install dropbear and use it for initramfs. It's only useful for rare cases, # like remotely unlocking LUKS. # CONFIG: it expects dropbear to be in /cdrom/extra/ # This can be done by putting the following commands into Makefile # at the end of 'unpack' target. Adjust the dropbear files location for your case. # mkdir -p ${TMP}/extra # cp ../distrib/dropbear/* ${TMP}/extra # If you have a big installation media, like DLBD, then dropbear is already available # and you can replace `cp + dpkg` with `apt-get install` # CONFIG: the ssh key used is a fake key. Replace it with your key. # CONFIG: change the dpkg file names to the ones available in your case. # CONFIG: change the dropbear port (6322 in this case) with the one that suits you. d-i preseed/late_command string in-target mkdir -p /root/.ssh; \ in-target /bin/sh -c "echo 'ssh-ed25519 IkxcEAPhTmUlSPMGXtXwGDOyMJoPuPw1vMcoWF1VtyvDX6b1uEG7A68hLEAdaglpEYPs foobar' >> /root/.ssh/authorized_keys"; \ in-target chown -R root:root /root/.ssh/; \ in-target chmod 600 /root/.ssh/authorized_keys; \ in-target chmod 700 /root/.ssh/; \ in-target apt-get -y install libcrypt1 libtomcrypt1 libtommath1 zlib1g; \ cp /cdrom/extra/dropbear* /target/tmp; \ in-target dpkg -i /tmp/dropbear-bin_2022.83-1+deb12u1_amd64.deb; \ in-target dpkg -i /tmp/dropbear-initramfs_2022.83-1+deb12u1_all.deb; \ in-target /bin/sh -c "echo 'ssh-ed25519 IkxcEAPhTmUlSPMGXtXwGDOyMJoPuPw1vMcoWF1VtyvDX6b1uEG7A68hLEAdaglpEYPs foobar' >> /etc/dropbear/initramfs/authorized_keys"; \ in-target /bin/sh -c "echo 'DROPBEAR_OPTIONS=\"-I 300 -j -k -p 6322 -s -c cryptroot-unlock\" ' >> /etc/dropbear/initramfs/dropbear.conf"; \ in-target update-initramfs -u ================================================ FILE: templates/grub.cfg.template ================================================ default=Install timeout=0 menuentry 'Install' { set background_color=black linux /install./vmlinuz vga=788 --- initrd /install./initrd.gz } ================================================ FILE: templates/isolinux.cfg.template ================================================ DEFAULT install SAY Now booting the debian installer LABEL install kernel /install./vmlinuz append vga=788 initrd=/install./initrd.gz --- quiet