Загрузиться в chroot?

13

У меня Linux (Debian Jessie) установлен на жесткий диск. Drive - sda1, ext4fs и sda2- swap

У меня есть /chrootпапка. В /chrootпапке установлена ​​другая система .

Вопрос:

Как сказать загрузчику, загружаться не основной системой (основной, Debian Jessie), а системой в / chroot ? Возможно, поменять /menu.lstа /chroot/etc/fstab? ( vmlinuz root=/dev/sda1/chroot?)

Или другой вариант вопроса: возможно ли установить linux не в корневой каталог раздела, а в папку? ( /another_linux/bin, /another_linux/home, /another_linux/etc...)

skrepki
источник
1
vmlinuz root=/dev/sda1/chrootне сработает Вероятно, можно смоделировать это с помощью метода, аналогичного тому, который используется в initrd. Смотрите, например, здесь . Вы монтируете, /new_rootкак описано там, затем вместо cd /new_rootdo cd /new_root/chrootи продолжаете.
нет. местоимения м.

Ответы:

7

Это не может быть сделано загрузчиком или ядром. Параметр для rootопции ядра, такой как in, root=/dev/sda1выглядит как стандартное имя пути Unix, но такие пути интерпретируются в соответствии с текущей смонтированной файловой системой. На момент rootинтерпретации опции нет смонтированных файловых систем. Ну, почти нет. Во время инициализации ядра существует экземпляр минимальной ramfsфайловой системы, называемой rootfsсмонтированной в качестве корня для начального запуска процесса start_kernel(). Фактическая интерпретация rootпараметра option выполняется в вызываемой подпрограмме name_to_dev_t(). Одним из поддерживаемых синтаксисов является /dev/nameформат, где имя интерпретируется путем временного монтирования sysfsфайловой системы вrootfsroot, и ищет запись блочного устройства, соответствующую имени в /sys/block. Этот процесс объясняется более подробно здесь .

Описанную настройку необходимо выполнить, сначала загрузившись в минимальной среде, такой как предоставляемая initrd, монтируя настоящую корневую файловую систему с /dev/sda1временной точки монтирования, например /mnt/rootfs, затем измените корневой каталог на /mnt/rootfs/chrootиспользование pivot_root(8).

Это несколько похоже на настройку корневых файловых систем для контейнеров LinuX ( LXC ). LXC - это реализация виртуализации на уровне операционной системы для Linux. Виртуализация на уровне операционной системы обычно используется в средах виртуального хостинга как легкая альтернатива полной виртуализации, управляемой гипервизором. При виртуализации на уровне операционной системы одно ядро ​​операционной системы совместно используется несколькими изолированными экземплярами пространства пользователя. Каждый экземпляр, часто называемый контейнером, тюрьмой, виртуальным частным сервером (VPE) или виртуальной средой (VE), по сути является отдельной установкой операционной системы, размещенной в собственном каталоге на хост-системе.

Томас Найман
источник
6

Я столкнулся с той же проблемой и закончил тем, что написал ее, чтобы она работала безболезненно в разных системах (Debian, Ubuntu в настоящее время):

Запустите make_chroot_initrdскрипт для создания нового образа initrd с поддержкой chroot из существующего:

#  ./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

Новый образ будет точно таким же, за исключением того, что теперь он может обрабатывать chroot=загрузочный параметр.

С grub2 в качестве загрузчика вы можете добавить запись в /boot/grub/grub.cfg:
(или, возможно, лучше /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
}

(измените файлы / разделы, чтобы они соответствовали вашим)

Общесистемная установка

Как только вы довольны этим, вы можете сделать изменения постоянными
(пока не будет обновлен пакет initramfs-tools).
В корневой системе:

# 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

С этого момента обычный образ initrd будет поддерживать загрузку chroot.
Нет необходимости использовать отдельный файл initrd.chroot, который может быть не синхронизирован с ним.

Смотрите boot_chroot для деталей.

lemonsqueeze
источник
3

Да, вы можете сделать трюк, используя Btrfs subvolumes .

Сначала вам нужно конвертировать ext4 в btrfs, как описано здесь .

Преобразуйте ваш chroot в subvilume, если это еще не так:

 sudo mv /path/to/chroot /path/to/chroot-tmp
 sudo btrfs subvol create /path/to/chroot
 sudo mv /path/to/chroot-tmp/* /path/to/chroot
 sudo mv /path/to/chroot-tmp/* /path/to/chroot -r # for directories

Теперь у вас есть подобъем с именем path / to / chroot . Вы можете проверить это сsudo btrfs subvol list /

Теперь вы можете создать загрузочную запись в grub. Просто добавьте rootflags=subvol=path/to/chrootстроку загрузки ядра Linux в пункт меню grub или используйте ее для автоматического зондирования.

Сергей
источник