Вот быстрая адаптация решения для удара этого подобного ТАК вопрос для конкретных разделителей, которые Вы имеете (точки с запятой):
declare -a array=( ) # we build a 1-D-array
IFS=';' read -a line < "$1" # read the headline
COLS=${#line[@]} # save number of columns
index=0
while IFS=';' read -a line ; do
for (( COUNTER=0; COUNTER<${#line[@]}; COUNTER++ )); do
array[$index]=${line[$COUNTER]}
((index++))
done
done < "$1"
for (( ROW = 0; ROW < COLS; ROW++ )); do
printf "%s" ${array[$ROW]}
for (( COUNTER = ROW+COLS; COUNTER < ${#array[@]}; COUNTER += COLS )); do
printf ";%s" ${array[$COUNTER]}
done
printf "\n"
done
Это не может быть сделано загрузчиком или ядром. Параметр к ядру root
опция такой как в root=/dev/sda1
похож на стандартный путь Unix, но такие пути интерпретируются согласно в настоящее время монтируемой файловой системе. В то время root
опция интерпретируется, нет никаких смонтированных файловых систем. Ну, почти ни один. Во время инициализации ядра существует экземпляр минимального ramfs
файловую систему называют rootfs
смонтированный как корень для начального выполнения процесса start_kernel()
. Фактическая интерпретация root
опциональный параметр сделан в названной стандартной программе name_to_dev_t()
. Один из поддерживаемых синтаксисов /dev/name
формат, где имя интерпретируется путем выполнения временного монтирования sysfs
файловая система в rootfs
корень и поиск соответствия записи блочного устройства называют под /sys/block
. Этот процесс объяснен более подробно здесь.
Установка, как описано должна была бы быть сделана первой начальной загрузкой в минимальную среду такой как один обеспеченный initrd
, смонтируйте реальную корневую файловую систему от /dev/sda1
во временной точке монтирования, например. /mnt/rootfs
, затем измените корневой каталог на /mnt/rootfs/chroot
использование pivot_root(8)
.
Это несколько подобно тому, как корневые файловые системы для Контейнеров Linux (LXC) являются установкой. LXC является операционным внедрением виртуализации системного уровня для Linux. Операционная виртуализация системного уровня является наиболее часто используемой в виртуальных средах хостинга как легкая альтернатива полной виртуализации, организованной гипервизором. В операционной виртуализации системного уровня единственное ядро операционной системы является общим для несколько изолированных экземпляров пространства пользователя. Каждый экземпляр, часто названный контейнером, тюрьмой, Виртуальный Частный Сервер (VPE) или Виртуальная среда (VE), является по существу отдельной установкой операционной системы, помещенной в корпус в собственном каталоге в хост-системе.
Я столкнулся с той же проблемой и закончил тем, что написал , чтобы она безболезненно работала в разных системах (в настоящее время 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 обновляется).
В chroot-системе:
# 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 .
Да, ] вы можете сделать это, используя подобтомы Btrfs .
Сначала вам нужно преобразовать 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
Теперь у вас есть subvolume с именем path / to / chroot .
Вы можете проверить это с помощью sudo btrfs subvol list /
Теперь вы можете создать загрузочную запись для подтома в grub. Просто добавьте rootflags = subvol = path / to / chroot
в строку загрузки ядра Linux в пункте меню grub или используйте this для автоматического зондирования.