вторник, 16 июля 2013 г.

Установка Slackware на флешку в f2fs

Тут у нас появилась неплохая новая ФС, которая f2fs, эта фс разработана специально для флешек. Кроме того, я тут нашёл старый нетбук типа amilo mini ui 3520


В этом чуде китайской инженерной мысли установлен HDD формфактора  1.8, который по слухам стучит с момента покупки. Ну факт в том, что оно у меня отстучало. Вместе с тормозной вендой, что там была в комплекте.

Ну по такому поводу я и задумал туда поставить слаку на флешке, благо текущая версия слаки содержит ядро 3.9.9-smp, которое без бубнов умеет f2fs.

Я хотел конечно отформатировать флешку целиком, но к сожалению у меня это не получилось, потому пришлось сделать два раздела:
  1. /dev/sda1 /boot/ 118M /ext2/
  2. /dev/sda2 / (rootfs) 7.2GB
(флешка объёмом 8Гб).

Хоть ядро и поддерживает f2fs, но вот к сожалению отформатировать-то и нечем. Я взял авторскую f2fs-tools (это ссылка на git репозиторий). Кроме того, я нагуглил и слакобилд. Собрав mkfs.f2fs, я уже смог отформатировать флешку в этой новой ФС.

Однако, ставил я слаку на другую флешку, отформатированную в ext4. Смонтировать просто так не получается, необходимо обязательно указывать тип ФС

mount -t f2fs /dev/sdb2 /mnt/x

Вот примерно так.

initrd

Естественно, у меня ничего не взлетело(кто-бы сомневался!), опыта в этой области у мну явно недостаточно. Впрочем, я разобрался: для загрузки ОС нужно несколько модулей, которые можно в принципе вкомпиллить в ядро. Но это не наш путь. Куда как разумнее создать маленький ramdisk прямо в памяти, откуда их и подключить. Связано это даже не с кривой ФС, а с тем, что флешки это вообще говоря совсем не простой HDD/SSD, хотя с виду и не отличимы (глядя изнутри компа).

Что-бы выяснить, какие нужны модули, я загрузился с флешки, любезно приготовленной Патрегом. В моём случае понадобилось
  1. ehci_hcd, ehci_pci -- USB2.0
  2. hid, hid_generic, hidusb -- поддержка клавиатуры USB. У меня ещё и родная клава сломалась. Впрочем, если есть ГАРАНТИЯ, что всё будет хорошо, то эти модули мне не нужны. Однако, если всё будет плохо, я могу исправить, пользуясь внешней клавой.
  3. loop тащем-то не нужен, но полезен при аварии -- монтировать разные образы.
  4. usb_storage, usb_realtek -- это как раз та самая прокладка, которое делает из USB некое подобие HDD(точнее скази).
Собственно говоря, initrd представляет собой вполне готовый и годный Linux, можно уже пользоваться. Вот только девайсы никакие не подключены, даже носители. Если что-то пойдёт не так(а у меня таки так и вышло), мы вывалимся в консоль busybox, которая представляет собой кастрированный bash.

Но для начала нужно собрать этот initrd. Собирается он специальным скриптом mkinitrd. В принципе, нам нужно только знать, где у нас будет корневая система, когда мы будем в initrd. Ну и модули конечно(см. выше). Собирается initrd в chroot'е, т.е. в такой встроенной виртуальной машине. Вот как-то так:

# сначала монтируем будущий корень
mount -t f2fs /dev/sda2 /mnt/floppy

# теперь монтируем туда спец. систему proc из хозяйской машины
mount -t proc /proc /mnt/floppy/proc

# теперь монтируем загрузочный каталог
mount /dev/sda1 /mnt/floppy/boot

# переходим в новый корень
chroot /mnt/floppy

# и отсюда идём в загрузочный каталог
cd /boot

# теперь можно создавать промежуточную корневую систему initrd
mkinitrd -c -k 3.9.9-smp -m ehci_pci:ums_realtek:hid_generic:usbhid:loop:f2fs -f f2fs -r /dev/sda2 -w 5
Описание ключей:
  • -c очистка прежнего корневого  дерева /boot/initrd-tree/
  • -k 3.9.9-smp Задаёт версию ядра. Нужен для поиска в /lib/modules, именно оттуда будут браться модули в initrd. У меня атом вместо процессора, но за то там HT. Потому я беру вариант smp (естественно ядро должно соответствовать)
  • -m Список модулей через двоеточие (см. выше)
  • -f f2fs Тип ФС
  • -r /dev/sda2 расположение корневой системы
  • -w 5 Задержка перед монтированием. Флешки определяются не мгновенно(задержка в секундах, и у меня слишком много. Можно уменьшить в моём случае)
После успешного завершения mkinitrd необходимо исправить загрузчик

lilo

Загрузчик состоит из двух частей, первая часть древняя, и занимает всего один сектор в 512 байт. Вторая часть это то, что не влезло в первую. Я использую самый простой загрузчик lilo. Он настолько прост, что не понимает ни одной ФС. Фактически, он просто загружает заданные сектора носителя, и передаёт им управление.

Для настройки загрузчика используется файл /etc/lilo.conf, вот он, с вырезанными коменнтами
boot = /dev/sdb
compact        # faster, but won't work on all systems.

  bitmap = /boot/slack.bmp
  bmp-colors = 255,0,255,0,255,0
  bmp-table = 60,6,1,16
  bmp-timer = 65,27,0,255

append=" vt.default_utf8=1"

prompt
timeout = 50

vga = normal

image = /boot/vmlinuz
  initrd = /boot/initrd.gz
  root = /dev/sda2
  label = Linux
  read-only  # Partitions should be mounted read-only for checking
Конфиг самый простой:
  • boot = /dev/sdb -- Место, куда ставится загрузчик. В момент настройки, а не работы. В данном случае ставится в MBR.
  • compact объединяет запросы к носителю вместе. ОЧЕНЬ сильно экономит время загрузки, и в особенности на флешках(очевидно потому, что на флешках страницы большие)
  • image = /boot/vmlinuz имя симлинка, указывающего на образ ядра
  • initrd = /boot/initrd.gz имя образа initrd
  • label = Linux стандартное имя опции выбора в приглашении загрузчика
  • read-only стандартная опция загрузки корневой системы
Остальные параметры обычные.

fstab

К сожалению, Kim Jaegeuk на сегодня ещё не доделал fsck, потому обходимся без проверки корневой системы. Как он доделает, будем проверять(а работы ведутся полным ходом прямо сейчас) Посему пока вот такой fstab

# монтируем корень без проверки
/dev/sda2        /                f2fs        defaults         1   0

# монтируем /boot/
/dev/sda1        /boot            ext2        defaults         1   2

#/dev/cdrom      /mnt/cdrom       auto        noauto,owner,ro,comment=x-gvfs-show 0   0
/dev/fd0         /mnt/floppy      auto        noauto,owner     0   0

devpts           /dev/pts         devpts      gid=5,mode=620   0   0
proc             /proc            proc        defaults         0   0
tmpfs            /dev/shm         tmpfs       defaults         0   0

# у меня всего 1015Мб памяти, потому для /tmp выделена половина(макс)
tmpfs            /tmp             tmpfs       nodev,nosuid,size=500M 0 0 
Необходимость выделить отдельный /boot/ тоже является временной. Проблема в том, что инсталлятор загрузчика /sbin/lilo на сегодня не понимает f2fs. Работы в этом направлении тоже ведутся, т.ч. в скором времени нам отдельный раздел /boot/ будет не нужен(на самом деле он и сейчас не нужен, если ручками сформировать карту. Но, т.к. я ленивый, то я просто использовал пока ext2. Это не на что не влияет, кроме разве что занятого места)

Удачи!

UPD: сижу вот тут с этим нетбуком. УМВР. Не тормозит как slax, это не live, нормальная годная система. Конечно пруфпик надо приложить:


вот, это я на лоре с гентушниками срусь. Ну гентушники они в своём репертуаре  -- вроде всё есть, да нихрена не работает :)

UPD2: немного запоздало ПОЗДРАВЛЯЮ ВСЕХ с двадцатилетним юбилеем Slackware Linux. Если-бы не она, так бы и компилял ядро всю жизнь. И не было-бы у меня ни детей, ни жены ;)

К счастью, есть OS которая ПРОСТО РАБОТАЕТ. Это главное.

Комментариев нет:

Отправить комментарий