I came across the same issue and ended up writing this to make it work painlessly across different systems (debian, ubuntu currently):
Run make_chroot_initrd script to create a new chroot-enabled initrd image from the existing one:
# ./make_chroot_initrd /chroot/trusty/boot/initrd.img-3.13.0-32-generic
making new initrd: /chroot/trusty/boot/initrd.img-3.13.0-32-generic.chroot
The new image will be exactly the same, except now it can handle a chroot= boot parameter.
With grub2 as bootloader you can add an entry to /boot/grub/grub.cfg:
(or perhaps better /etc/grub.d/40_custom)
menuentry "ubuntu trusty, (linux 3.13.0-32) (chroot)" {
insmod ext2 # or whatever you're using ...
set root='(hd0,7)' # partition containing the chroot
set chroot='/chroot/trusty' # chroot path
linux $chroot/boot/vmlinuz-3.13.0-32-generic root=/dev/sda7 chroot=$chroot rw
initrd $chroot/boot/initrd.img-3.13.0-32-generic.chroot
}
(change files/partitions to match yours)
System-wide install
Once you're happy with it you can make the changes permanent
(until initramfs-tools package gets upgraded).
In the chrooted system:
# cd /usr/share/initramfs-tools
# cp -pdrv . ../initramfs-tools.orig # backup
# patch -p1 < path_to/boot_chroot/initrd.patch
# rm *.orig */*.orig
# update-initramfs -u
From now on regular initrd image will support chroot booting.
No need to use a separate initrd.chroot which may get out of sync with it then.
See boot_chroot for details.
vmlinuz root=/dev/sda1/chrootwon't work. One probably could simulate this with a method similar to what is used ininitrd. See e.g. here. You mount/new_rootas described there, then instead ofcd /new_rootdocd /new_root/chrootand continue. – n.m. Aug 6 '13 at 18:06