История изменений
Исправление kostik87, (текущая версия) :
В общем, Linux может запускать двумя способами.
Способ первый, только ядро Linux:
- ядро Linux загружается в память;
- ядро подключает файловую систему, указанную в параметре root в качестве корня /
- переключает /{dev,proc/sys} в корень
- ядро запускает /sbin/init
Способ второй, ядро Linux + initramfs (initrd):
- ядро Linux загружается в память;
- в память загружается файл с initramfs
- ядро Linux монтируется в качестве / (корня) минимальную систему из загруженного в память initramfs
- ядро Linux вызывает /sbin/init из смонтированного initramfs в память
- сценарии в initramfs выполняют действия предварительные действия для монтирования реальной корневой файловой системы, например загружают модули ядра, драйверы диска, файловой системы, инициализируют RAID (mdadm), lvm, расшифровывают шифрованные контейнеры, ждут появления нужных устройств
- в конечном итоге монтируют основную файловую систему, допустим в /mnt/root
- монтируют в /mnt/root/{dev,proc,sys} псевдо файловые системы
- вызывают метод ядра pivot_root или switch_root и подают ядру сигнал смены корня
- ядро меняет точку корневую файловую систему относительно точки монтирования /mnt/root
- ядро запускает /sbin/init с нового корня.
Так вот, тебе нужно разобраться есть ли реализованная функция hook (хук) для сценариев в initramfs, чтобы переключение корневой файловой системы было не в /mnt/root, а в /mnt/root/ubuntu.
У меня с ext4 /dev/sda3 с папок: /prar2110 /lmde /runtu /minios - нормально запускаются блочные лини.
У тебя загрузчик подключает в /lmde /runtu и прочее vdi образы файловых систем, при этом создаётся /dev/loop и передаёт ядру точку монтирования файловой системы или указывает, что смонтировать нужно /dev/loop.
Как это точно реализовано сказать не могу, не использую такие вещи.
Главный вывод, что ядро само по себе ожидает, что в корневой файловой системе, которую ты указываешь в параметре ядра root= будет файловая система со структурой директорий:
bin
boot
data
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
А не то, что там будет поддиректория, в которую уже нужно делать switch_root.
Если тебе нужно так - изучай скрипты в Initramfs каждого дистрибутива и если там нет нужного метода - пиши свой скрипт, пересобирай initramfs и добавляй параметр ядра, который будешь обрабатывать скриптом.
Условно параметры ядра будут примерно такие: root=/dev/sda3 subsys=arch
И тебе правильно подсказали - используй btrfs или другую систему с томами.
Там ты сможешь указывать собственно файловую систему и subvolume в ней, который будет доступен так же как директория.
Исправление kostik87, :
В общем, Linux может запускать двумя способами.
Способ первый, только ядро Linux:
- ядро Linux загружается в память;
- ядро подключает файловую систему, указанную в параметре root в качестве коря /
- переключает /{dev,proc/sys} в корень
- ядро запускает /sbin/init
Способ второй, ядро Linux + initramfs (initrd):
- ядро Linux загружается в память;
- в память загружается файл с initramfs
- ядро Linux монтируется в качестве / (корня) минимальную систему из загруженного в память initramfs
- ядро Linux вызывает /sbin/init из смонтированного initramfs в память
- сценарии в initramfs выполняют действия предварительные действия для монтирования реальной корневой файловой системы, например загружают модули ядра, драйверы диска, файловой системы, инициализируют RAID (mdadm), lvm, расшифровывают шифрованные контейнеры, ждут появления нужных устройств
- в конечном итоге монтируют основную файловую систему, допустим в /mnt/root
- монтируют в /mnt/root/{dev,proc,sys} псевдо файловые системы
- вызывают метод ядра pivot_root или switch_root и подают ядру сигнал смены корня
- ядро меняет точку корневую файловую систему относительно точки монтирования /mnt/root
Так вот, тебе нужно разобраться есть ли реализованная функция hook (хук) для сценариев в initramfs, чтобы переключение корневой файловой системы было не в /mnt/root, а в /mnt/root/ubuntu.
У меня с ext4 /dev/sda3 с папок: /prar2110 /lmde /runtu /minios - нормально запускаются блочные лини.
У тебя загрузчик подключает в /lmde /runtu и прочее vdi образы файловых систем, при этом создаётся /dev/loop и передаёт ядру точку монтирования файловой системы или указывает, что смонтировать нужно /dev/loop.
Как это точно реализовано сказать не могу, не использую такие вещи.
Главный вывод, что ядро само по себе ожидает, что в корневой файловой системе, которую ты указываешь в параметре ядра root= будет файловая система со структурой директорий:
bin
boot
data
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
А не то, что там будет поддиректория, в которую уже нужно делать switch_root.
Если тебе нужно так - изучай скрипты в Initramfs каждого дистрибутива и если там нет нужного метода - пиши свой скрипт, пересобирай initramfs и добавляй параметр ядра, который будешь обрабатывать скриптом.
Условно параметры ядра будут примерно такие: root=/dev/sda3 subsys=arch
И тебе правильно подсказали - используй btrfs или другую систему с томами.
Там ты сможешь указывать собственно файловую систему и subvolume в ней, который будет доступен так же как директория.
Исходная версия kostik87, :
В общем Linux может запускать двумя способами.
Способ первый, только ядро Linux:
- ядро Linux загружается в память;
- ядро подключает файловую систему, указанную в параметре root в качестве коря /
- переключает /{dev,proc/sys} в корень
- ядро запускает /sbin/init
Способ второй, ядро Linux + initramfs (initrd):
- ядро Linux загружается в память;
- в память загружается файл с initramfs
- ядро Linux монтируется в качестве / (корня) минимальную систему из загруженного в память initramfs
- ядро Linux вызывает /sbin/init из смонтированного initramfs в память
- сценарии в initramfs выполняют действия предварительные действия для монтирования реальной корневой файловой системы, например загружают модули ядра, драйверы диска, файловой системы, инициализируют RAID (mdadm), lvm, расшифровывают шифрованные контейнеры, ждут появления нужных устройств
- в конечном итоге монтируют основную файловую систему, допустим в /mnt/root
- монтируют в /mnt/root/{dev,proc,sys} псевдо файловые системы
- вызывают метод ядра pivot_root или switch_root и подают ядру сигнал смены корня
- ядро меняет точку корневую файловую систему относительно точки монтирования /mnt/root
Так вот, тебе нужно разобраться есть ли реализованная функция hook (хук) для сценариев в initramfs, чтобы переключение корневой файловой системы было не в /mnt/root, а в /mnt/root/ubuntu.
У меня с ext4 /dev/sda3 с папок: /prar2110 /lmde /runtu /minios - нормально запускаются блочные лини.
У тебя загрузчик подключает в /lmde /runtu и прочее vdi образы файловых систем, при этом создаётся /dev/loop и передаёт ядру точку монтирования файловой системы или указывает, что смонтировать нужно /dev/loop.
Как это точно реализовано сказать не могу, не использую такие вещи.
Главный вывод, что ядро само по себе ожидает, что в корневой файловой системе, которую ты указываешь в параметре ядра root= будет файловая система со структурой директорий:
bin
boot
data
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
А не то, что там будет поддиректория, в которую уже нужно делать switch_root.
Если тебе нужно так - изучай скрипты в Initramfs каждого дистрибутива и если там нет нужного метода - пиши свой скрипт, пересобирай initramfs и добавляй параметр ядра, который будешь обрабатывать скриптом.
Условно параметры ядра будут примерно такие: root=/dev/sda3 subsys=arch
И тебе правильно подсказали - используй btrfs или другую систему с томами.
Там ты сможешь указывать собственно файловую систему и subvolume в ней, который будет доступен так же как директория.