This site has been retired. For up to date information, see handbook.gnome.org or gitlab.gnome.org.


[Home] [TitleIndex] [WordIndex

Using OSTree in Arch Linux

Those are some notes on how to get Arch Linux to boot from OSTree-managed file system trees. Note that this could be useful for other distributions as well, especially the part about tweaking an initramfs to boot with OSTree.

OStree installation

There are PKGBUILDs in the Arch User Repository (AUR) for the needed components. Install both:

If you use a tool to automate installing packages from the AUR, it is enough to instruct it to install ostree and linux-user-chroot For example using Yaourt:

yaourt -S linux-user-chroot ostree

Populating the local repository

Follow the general instructions in the GnomeOSTree page, but for the last step instruct ostadmin to skip generating the initramfs image: we will be tweaking an initramfs to support booting using OSTree later. Commands summary (as root):

ostadmin init
cd /ostree
ostree --repo=repo remote add gnome http://ostree.gnome.org/repo \
       trees/gnomeos-3.6-i686-{runtime,devel}
ostree-pull --repo=repo --related --depth=3 gnome
ostadmin deploy --checkout-only gnomeos-3.6-i686-devel

Tweaking the initramfs

Changing an existing initramfs is a dirty hack, but the good thing is that this way everything will work just fine, even complex setups which LVM and/or LUKS encryption in the root file system. The bottom line is: if your system is working now, it will work with ostree as well.

First, create a work directory, and unpack the current initramfs. Note that you may need to change unxz to gunzip/bunzip2 depending on the compression method of your initramfs. As root:

mkdir /tmp/workdir
cd /tmp/workdir
unxz -c /boot/initramfs-linux.img | bsdcpio -i

Edit the init script, scroll to the end, and add the following lines before the last line (the one that uses exec to switch to the actual filesystem):

if [ -n "${ostree}" ] && [ ! -d "/new_root/ostree/${ostree}" ] ; then
  ostree='current'
fi

if [ -n "${ostree}" ] && \
   [ -x /new_root/ostree/ostree-init ] && \
   [ -d "/new_root/ostree/${ostree}" ]
then
  msg ":: Booting OSTree '${ostree}'"
  msg "::   command: ostree-init /new_root ${ostree} /sbin/init $*"
  exec env -i "TERM=$TERM" /new_root/ostree/ostree-init \
    "/new_root" "${ostree}" /sbin/init "$@" || true
  msg ":: Failed OSTree boot, will do a normal one :-("
fi

Note that the snippet above uses the ${ostree} variable, which was not defined anywhere. This will be passed as an argument in the kernel command line from the bootloader. Now, re-pack the initramfs and save it with a different name:

find . -print0 | bsdcpio -R 0:0 -0oH newc | xz --check=crc32 > /boot/initramfs-gnomeos.img

Adding a GRUB entry

You will need to add an entry to the GRUB configuration file that uses the modified initramfs, and passes a non-empty ostree= parameter in the kernel command line. As an example, this is how my entry looks like:

title  GNOME OS [/boot/vmlinuz-linux]
root   (hd0,0)
kernel /vmlinuz-linux root=/dev/mapper/vg-root cryptdevice=/dev/sda2 lvmcrypt ro quiet ostree=current
initrd /initramfs-gnomeos.img

As a rule of thumb, one can copy the default entry, change the path to use the modified initramfs and edit the kernel line to add ostree=current at the end.


2024-10-23 11:37