[How To] Persistent Boot-Anywhere USB Drive

I am a Manjaro Xfce user that always wanted a persistent “live” version of the system on a USB drive that could be booted on ANY system.

I tried the Persistent USB Release using ALMA but ran into a few problems with it. For example it would block the WiFi adapter on my laptop.

So I tried a simpler DIY approach which appears to be working. At least, it works on all the 7 computers that I have access to.

I’ve set out the steps I took in case it is helpful for others. And to solicit any comments on the dangers and shortcomings as well as any suggested improvements.

I installed Manjaro Xfce to a clean USB drive in the normal manner. However, I did select manual partitioning like this:

   8 MB    unformatted              bios-grub flag
 512 MB    fat32         /boot/efi  boot flag
8192 MB    linuxswap     swap       swap flag
rest       ext4          /          root flag

Note the 8MB unformatted partition.

Once I booted up the fresh install and updated it I ran:

sudo grub-install --target i386-pc --debug /dev/sd(x)
sudo update-grub

This made the drive bootable on UEFI AND non-UEFI systems.

Next I used pacman to install “amd-ucode”. I’m not sure if this is essential but I installed it anyway.

Then I created the three files intel.conf, nvidia.conf and amd.conf in /etc/X11/mhwd.d/

Section "Device"
     Identifier "AMD"
     Driver "amdgpu"
EndSection

Section "Device"
  Identifier  "Intel Graphics"
  Driver      "intel"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nouveau"
    VendorName     "NVIDIA Corporation"
	Option "NoLogo" "1"
EndSection

Next I created a custom service:

Create: /usr/lib/systemd/system/myboot.service
[Unit]
Description=LiveMedia Config Script
Before=systemd-user-sessions.service

[Service]
Type=oneshot
ExecStart=/home/myuser/set-video-driver

[Install]
WantedBy=multi-user.target

And enabled it with systemctl. The myboot service runs at startup, detects the video card in the system and calls mhwd-gpu accordingly:

/home/myuser/set-video-driver
#!/bin/sh
if lspci -nn | grep -i '\[0300\].*amd'; then
  mhwd-gpu --setxorg /etc/X11/mhwd.d/amd.conf
  exit 0
fi
if lspci -nn | grep -i '\[0300\].*intel'; then
  mhwd-gpu --setxorg /etc/X11/mhwd.d/intel.conf
  exit 0
fi
if lspci -nn | grep -i '\[0300\].*nvidia'; then
  mhwd-gpu --setxorg /etc/X11/mhwd.d/nvidia.conf
  exit 0
fi
mhwd-gpu --setxorg /etc/X11/mhwd.d/intel.conf

Finally a couple of my systems have 4K displays, I wanted to automate some rescaling of the desktop, so I added the following script which is run on login by the Xfce session manager:

#!/bin/sh
if xrandr | grep \* | grep '[2-9][0-9][0-9][0-9]x' ; then
  xfconf-query -c xsettings -p /Gdk/WindowScalingFactor -s 2
  xfconf-query -c xsettings -p /Gtk/CursorThemeSize -t int -s 64
  xfconf-query -c xfwm4 -p /general/theme -t string -s "Numix HiDPI"
  export QT_SCALE_FACTOR=2
else
  xfconf-query -c xsettings -p /Gdk/WindowScalingFactor -s 1
  xfconf-query -c xsettings -p /Gtk/CursorThemeSize -t int -s 32
  xfconf-query -c xfwm4 -p /general/theme -t string -s "Piranha"
  export QT_SCALE_FACTOR=1
fi
xfce4-panel -r

Comments and feedback very welcome.

1 Like

Nice implementation of selecting different GPU drivers

I created somthing similar a couple of years ago.

2 Likes