LINUX.ORG.RU

История изменений

Исправление 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 в ней, который будет доступен так же как директория.