Процес завантаження Frenzy

Етап kernel

Завантаження починається з того, що BIOS передає керування завантажувачу cdboot, що знаходиться в завантажувальній області компакт-диску. Він у свою чергу запускає BTX loader (/boot/loader). BTX loader читає файли конфігурації, завантажує ядро і необхідні модулі а також відображає меню завантаження (з логотипом). Потім іде завантаження ядра і визначення їм пристроїв.

В конфігурації loader-а вказано, що кореневу файлову систему слід монтувати із стисненого образу /boot/frenzyroot.gz. Після того, як ядро було завантажено, із цього образу монтується коренева файлова система і керування передається процесу /sbin/init, запущеному звідти.

Етап frenzyroot

Образ frenzyroot містить кілька базових утиліт:

cp sh test echo init mdconfig mount mount_cd9660 mount_nullfs umount sleep

Також в теці /etc знаходяться деякі необхідні файли, в тому числі спеціально створені для frenzy rc-скрипти.

Отже, /sbin/init запускає /etc/rc. Це нестандартний скрипт, який виконує всю роботу з початкового налаштування і завантаження LiveCD.

1. Пошук завантажувального пристрою

В першу чергу ми повинні знайти і змонтувати той диск, з якого завантажується система. Скрипт по черзі шукає файл frenzy.uzip на всіх CD-ROM приводах і USB Flash дисках. Якщо такий файл був знайдений, диск з ним монтується до теки /Frenzy/boot.

2. Монтування стисненої файлової системи

Файл frenzy.uzip містить стиснену файлову систему, яка буде використовуватись ц якості кореневої. Проте оскільки її неможна змонтувати поверх існуючої кореневої FS, ми вчинимо наступним чином. Файлова система із frenzy.uzip монтується до теки /Frenzy/fs, після чого за допомогою mount_nullfs поверх існуючої кореневої файлової системи ми монтуємо із стисненого образу теки bin, boot, lib, libexec, sbin, usr.

3. Встановлення локалі

Довантажуємо симпатичний шрифт і виставляємо screenmap. Необхідно для того, щоб завантажувальне меню було на українській.

4. Визначення розміру для RAM-диску

Визначаємо, який об'єм пам'яті є в системі. Виходячи з цього, встановлюємо розмір RAM-диска за умовчанням (10, 15, 30, 45 мегабайт).

5. Меню завантажувача

На екран виводиться меню завантажувача. Встановлюємо параметри завантаження (докладний їх опис можна побачити тут).

6. Створення RAM-диску

Створюємо RAM-диск вказаного розміру і монтуємо його до теки /Frenzy/ramdisk. На RAM-диску будуть зберігатися теки etc, root, var, mnt. Створюємо ці теки, копіюємо до них файли із відповідних тек до /Frenzy/fs і за допомогою mount_nullfs монтуємо ці теки з RAM-диску поверх відповідних тек кореневої теки. Створюємо в /etc/frenzy.boot налаштування, виставлені у меню завантажувача.

7. Завантаження виправлень

Переглядаємо теку /Frenzy/boot/frenzy/conf. Якщо в ній міститься скрипт з розширенням .patch, виконуємо їх. Корисно у випадку, якщо ви додаєте певні виправлення для конфігураційних файлів, але не бажаєте перезбирати стиснений образ.

8. Режим завантаження toram (за вибором)

Якщо у завантажувачі був вибраний параметр toram, то розпочнемо завантаження до пам'яті:

Після завантаження в пам'ять CD-ROM звільнюється і висовується лоток приводу.

9. Пошук розділів на жорсткому диску

Шукаємо розділи на жорсткому диску. За умовчанням всі розділи мотуються в режимі “тільки для читання”. В меню завантаження також доступні такі опції:

10. Режим завантаження fromhdd (за вибором)

Якщо в завантажувачі був вибраний параметр fromhdd, то починаємо завантаження з образу на жорсткому диску:

Після завантаження образу з жорсткого диску CD-ROM звільнюється і висовується лоток приводу.

11. Різне

І, нарешті, ми завантажуємо системний /etc/rc.

Етап base

Завантаження системних rc-скриптів майже нічим не відрізняється від стандартної FreeBSD. Різниця наступна:

1. Частина rc-скриптів підкорегована таким чином, щоб вони не запускались при присутності файлу /tmp/.frenzy. Ці скрипти для монтування розділів із fstab і перевірки їх fsck (вони не потрібні при завантаженні з livecd, оскільки цю роботу виконують інші скрипти).

2. Після завантаження усіх rc-скриптів запускається скрипт /etc/rc.d/FRENZY, який виконує наступні операції: