0

I used VirtualBox to set up a small Arch Linux 64 bit x86 machine. Everything is running fine installed on the 8GB big virutal hard disk in the VMDK format.

cfdisk shows that I created two partitions:

  • Type: Primary, Type: Linux (ext4), Bootable, First Partition, Size: 7.5G
  • Type: Primary, Type: Swap, Solaris, Bootable, Second Partition, Size: 0.5G

I heavily customized Arch Linux and now want to make real bootable media out of it.

1. How could I create a bootable media without the complicated archiso installation process, but directly using a drive image that I create somehow?

In fact, I tried already creating my bootable media. I used Ubuntu to convert my os.vmdk to /dev/sdc using the command qemu-img convert os.vmdk -O raw /dev/sdc

Once completed, I rebooted to the PC's boot menu but the pendrive was not showing up. I turned off secure boot and enabled Legace Boot Support. Nothing helped. Hence, I entered the Grub command line of my Ubuntu installation and entered

set root=(hd1,msdos2) # hd1 is my usb stick, msdos1 is swap, msdos2 is bootable
configfile /boot/grub/grub.cfg # in order to load the usb's grub

2. Some strange things happened then

  1. I put the stick into my laptop -> USB 2.0 port (I have got a USB 3.0 stick) -> Booting... -> Graphical Arch Linux Splash Screen -> Emergency Shell stating something like Can't run fsck. Error: Can't find drive with UUID=... (However, the UUID is absolutely correct. I changed that on Ubuntu and within Arch itself in /etc/fstab! When I do blkid on the emergency shell, the USB drive is simply not there. Instead I get my internal SSD on /dev/sda. I even do not find any usb drive in /dev/* and dmesg states nothing as well!)
  2. I put the stick into my laptop -> USB 3.0 port -> The grub command line is not detecting the drive. There is only hd0 but not hd1. However I sometimes boot from my external hard drive connected via usb 3 using the bios boot menu.
  3. I put the stick into my workstation PC on a USB 3.0 port -> Not in BIOS boot menu, started via grub and configfile command -> It booted whereas it did not boot on the USB 3.0 port on my laptop -> and then the same emergency shell as in 1.
  4. I put the stick into my workstation PC on a USB 2.0 port -> Started via GRUB -> It boots successfully without any issues.

I have no clue, what I should do!? I basically just want to make an image out of my existing virtual Arch Linux that I can transfer to any device by simply copying it without a complicated Arch install.

Any help is appreciated.

  • Have you verified that USB disk is not corrupted by chance? – TheGeek May 15 '18 at 8:45
1
+50

1.) Since you've already partitioned the USB stick, why not just copy the entire contents of the real filesystem (omitting any tmpfs and other RAM-based or wholly virtual filesystems, like /dev, /proc and /sys) to the ext4 partition on the stick?

I think the qemu-img convert you did does essentially just that, but you might be able to skip it. Basically, there is no magic: if you copy all the necessary files of the OS to the stick in their proper directory hierarchy, it will be a valid system, no matter how the copying was done. An inactive operating system is essentially just a bunch of files, and you can treat it as just that.

The only special part is the legacy BIOS bootloader: that requires writing data to specific block locations on the stick so that the bootloader can find them later. On the other hand, the UEFI bootloader is just another file with a specific pathname on a FAT32 partition.

2.1.) Trying to boot using the bootloader of the Ubuntu installation (which may be UEFI) with USB 2: it looks like the bootloader successfully loaded the kernel and initramfs files and started the kernel, but the initramfs file did not have all the necessary drivers to access the root filesystem on the USB stick. At minimum, you'll need the appropriate USB controller driver, the usb-storage driver and the ext4 filesystem driver and their dependencies. Also, as the USB controller is usually included in the chipset, the kernel version needs to be new enough to recognize the chipset, so that it knows that a particular PCI ID within the chipset is actually a USB controller.

2.2.) The USB stick was not detected in the USB 3.0 port: perhaps your laptop firmware does not include USB 3.0 support unless actually requested via the BIOS boot menu? Or there might be some kind of USB2/USB3 handover switch between the USB2 and USB3 controllers that would have needed to be flipped somehow?

2.3.) On the desktop, the stick was detected in USB 3.0 port but the boot failed as in 2.1: Looks like your desktop may have better USB 3.0 support, but you hit essentially the same problem as in 2.1: no USB3 controller and/or usb-storage drivers in initramfs.

2.4.) Interesting. Does your laptop have a special type of an USB 2.0 controller, and the desktop uses the standard ehci_hcd? It looks like your initramfs had all the necessary drivers for accessing USB 2.0 in your desktop, but not in your laptop. Or maybe your laptop has a very new chipset and the kernel failed to find the USB controller in it?

The problems in 2.1 and 2.3 could probably be fixed by adding more USB controller drivers in the initramfs file, and ensuring that your kernel is new enough to fully recogize the laptop's chipset.

2.2. seems like a possible firmware limitation. Hard to offer any suggestions without knowing the make and model of the system.

You might actually want to add a small FAT32 partition to your USB stick and add an UEFI version of GRUB to it as \EFI\BOOT\BOOTx64.efi. That would make it bootable in the UEFI sense of the word. It seems the stick is currently bootable only in the legacy BIOS sense. This way you could create a "hybrid" USB stick that has both legacy and UEFI bootloaders.

Usually a legacy BIOS will completely hide any firmware-level USB storage support unless it is specifically enabled in BIOS menus, in order to provide maximum legacy compatibility all the way back to the original IBM PC/AT of year 1986 (as much as possible). UEFI does not have this burden, and will probably provide USB storage support for bootloaders by default.

1

Most probably you are having issues with Secure Boot and UEFI/EFI BIOS.

When you create a bootable USB you need to make sure it's built for your PC/Laptop BIOS configuration (it could be Legacy or UEFI).

Considering you are creating the bootable device from a VM image, most probably you are not taking that into consideration.

According to the Arch Linux wiki[1], if you are using GPT/UEFI con GRUB, you need to:

# grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --removable --recheck

But I don't know if it will work with your setup. If you are willing to try other options, I would try to convert the VMDK into an ISO, and "burn" the ISO to the USB pendrive with a flash utility like Etcher https://etcher.io

That might take care of the UEFI issue.

  1. https://wiki.archlinux.org/index.php/Installing_Arch_Linux_on_a_USB_key

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.