Сначала я опишу некоторые общие принципы, используемые при настройке зацикленной файловой системы в качестве корневого устройства.
Зацикленное (loopback) устройство Linux - это виртуальное устройство, которое можно использовать так же, как и любой другой носитель информации.
Обычные носители информации - это, например, разделы жесткого диска /dev/hda1, /dev/hda2, /dev/sda1 или полностью диски, как, например, флоппи-диск /dev/fd0 и т.п. Все эти устройства могут содержать в себе файлы и структуры каталогов. Они могут быть отформатированы в формате необходимой файловой системы (ext2fs, msdos, ntfs и т.п.) и затем подключены (mount).
Зацикленная файловая система представляет файл на другой файловой системе как полноценное устройство. Она может быть отформатирована и подключена так же, как и любое другое устройство, описанное выше. Чтобы сделать это, устройства под названиями /dev/loop0, /dev/loop1 и т.п. сопоставляются с файлами, и затем может быть подключено новое виртуальное устройство.
В Linux также может использоваться другой тип виртуального устройства, подключаемый как файловая система, под названием электронный диск.
В этом случае, устройство ссылается не на какое-то физическое устройство, а на часть оперативной памяти, выделенной для этой цели. Эта память никогда не сбрасывается в swap на диск, но остается в дисковом кэше.
Электронный диск может быть создан в любой момент путем записи в устройство электронного диска /dev/ram0, /dev/ram1 и т.п. Затем его можно отформатировать и подключить так же, как и зацикленное устройство.
Когда электронный диск используется при загрузке (что часто применяется на инсталляционных дисках Linux или дисках аварийного восстановления), тогда образ диска (полное содержимое диска в виде отдельного файла) может содержаться на загрузочном флоппи-диске в закомпрессированной форме. Эта ситуация автоматически распознается ядром, когда оно загружается, и этот образ разжимается в электронный диск перед его подключением.
Загрузочный электронный диск Linux - еще один важный механизм, который нам понадобится при использовании зацикленного устройства в качестве корневой файловой системы.
Когда используется загрузочный электронный диск, образ файловой системы загружается в память и подключается для того, чтобы файлы на нем были доступны. Затем запускается программа на этом диске (файл под именем /linuxrc), и, когда она заканчивает работу, другое устройство подключается в виде корневой файловой системы. Старый электронный диск также остается доступен и подключен к каталогу /initrd, если такой каталог присутствует, или может использоваться через устройство /dev/initrd.
Такая необычная процедура необходима потому, что при обычной загрузке система начинает и продолжает загрузку с корневой файловой системы. С загрузочным электронным диском корневая файловая система может быть изменена до начала основной последовательности загрузки Linux.
Корневая файловая система - это устройство, которое подключается первым, поэтому бывает представлено в виде каталога / после загрузки.
Существует некоторое количество проблем с корневой файловой системой благодаря тому факту, что она содержит все файлы. Когда загрузочные rc-скрипты загружаются, они содержатся в файлах /etc/rc.d или /etc/rc?.d, в зависимости от версии программы /etc/init.
Когда система загрузилась, нельзя отключить корневую файловую систему или изменить ее из-за того, что все программы используют ее тем или иным образом. Вот почему так полезен загрузочный электронный диск, поскольку его можно использовать, чтобы конечная корневая файловая система могла быть отлична от той, которая была в момент начала загрузки.
Чтобы понять, как загрузочный электронный диск работает в процессе загрузки системы, изучим порядок событий при загрузке системы.
Ядро загружается в память. Эту операцию производит LILO или LOADLIN. В этот момент выводится сообщение Loading...
Образ электронного диска загружается в память, это тоже делает LILO или LOADLIN. В этот момент также выводится сообщение Loading...
Производится инициализация ядра, включая обработку опций командной строки и подключение электронного диска в виде корневой файловой системы.
На загрузочном электронном диске запускается программа /linuxrc.
Корневое устройство переключается в соответствии с параметром ядра.
Запускается программа /etc/init, которая уже производит настраиваемую пользователем последовательность загрузки.
Это упрощенное описание того, что происходит на самом деле, но этого достаточно, чтобы описать, как запускается ядро и как используется электронный диск.