Оптимизация файловой системы

Предыдущая  Содержание  Следующая  V*D*V

Построенная и отлаженная ранее файловая система может быть расположена целиком либо в Nandflash, либо в RAM.

Теперь необходимо её модифицировать так, чтобы ускорить и оптимизировать работу и съэкономить ресурс Nandflash.

 

Для этого  разбиваем файловую систему на 2 части: ramfs и rootfs.

Ramfs будет слинкована с ядром. Её задача - запуск системы и монтирование необходимых разделов.

Rootfs содержит необходимые программы и библиотеки, монтирующиеся в режиме "только чтение".

Некоторые разделы файловой системы необходимы программам при работе для записи временных файлов. Чтобы это реализовать, используется совмещение разделов в RAM в режиме "чтение и запись" и Nandflash в режиме "только чтение" в один раздел. Для такого подключения необходимо иметь в ядре включенную поддержку AUFS.

 

Внимание!

Если в качестве файловой системы на Nandflash используется UBIFS, так как UBI компилируется в составе ядра, необходимо в командную строчку ядра прописать:

ubi.mtd=rootfs

 

Если UBI компилится как модуль, перед монтированием UBIFS должно быть выполнено:

insmod lib/modules/ubi.ko mtd=rootfs

 

Внимание!

Почему-то корневая файловая система отказывается подключаться, если сборка ядра с ramfs и rootfs велась разными экземплярами buildroot (пересборка одной и тоже версии).

Создание ramfs

Минимальная ramfs:

 

dir /bin 755 1000 1000

  slink /bin/sh busybox 777 0 0

  file /bin/busybox initramfs/busybox 755 0 0

dir /dev 755 0 0

  nod /dev/console 644 0 0 c 5 1

  nod /dev/loop0 644 0 0 b 7 0

dir /mnt 755 0 0

dir /proc 755 0 0

dir /sys 755 0 0

file /init initramfs/init.sh 755 0 0

 

Создаём ramfs, копируя содержимое из созданной ранее rootfs. Полное содержание:

 

drwxr-xr-x root root bin

  -rwsr-xr-x root root busybox

  lrwxrwxrwx root root mkdir -> busybox

  lrwxrwxrwx root root mount -> busybox

  lrwxrwxrwx root root sh -> busybox

  lrwxrwxrwx root root switch_root -> busybox

drwxr-xr-x root root dev

  crw-rw-rw- root root 5, 1 console

  brw-r----- root root 7, 0 loop0

  brw-r----- root root 31, 0 mtdblock0

  brw-r----- root root 31, 0 mtdblock1

  crw-rw-rw- root root 1, 3 null

-rwxr-xr-x root root init

drwxr-xr-x root root mnt

drwxr-xr-x root root proc

drwxr-xr-x root root rom

drwxr-xr-x root root sys

drwxrwxrwt root root tmp

 

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

busybox должен быть собран со статической линковкой. Для уменьшения размеров оставить только необходимые опции. Можно использовать для построения этот конфигурационный файл; Чтобы использовать его, скопировать его как /<buildroot-path>/package/busybox/busybox_minimal_config. Затем в меню настройки buildroot выбрать в Package Selection for the target --> "Run BusyBox's own full installation" и указать этот файл. Настройки почему-то подхватываются не всегда, так что лучше также заменить им файл /<buildroot-path>/output/build/busybox/.config;

Для подключения rootfs создаём папку /rom;

Для кеша создаём папку /tmp;

mtdblock0 и mtdblock1 используются для подключения JFFS2. Если используется другая файловая система, устройства могут быть, либо не нужны. При использовании UBIFS эти устройства не нужны;

В папке /bin создаём ссылки ash, mkdir, mount, sh, switch_root указывающие на busybox;

Если необходимо ограничить размер RAM диска, используются параметры tmpfs при монтировании. По умолчанию - половина RAM;

 

Если busybox не слинкована статически, при запуске ядра будет получено сообщение:

 

Failed to execute /init

Kernel panic - not syncing: No init found.  Try passing init= option to kernel.

Модификация rootfs

Выключаем монтирование в файле /etc/inittab:

 

#null::sysinit:/bin/mount -o remount,rw /

#null::sysinit:/bin/mount -t proc proc /proc

 

 

Для варианта, когда необходима запись в программную директорию и в /etc, добавляем строки:

 

null::sysinit:/bin/mount -o remount,rw /<progdir>

null::sysinit:/bin/mount -o remount,rw /etc

 

Проверяем наличие необходимых для работы dropbear файлов в директории /etc/dropbear/.

 

Изменяем настройки ProFTP в /etc/proftpd.conf:

 

# logs

ScoreboardFile        /var/tmp/proftpd.scoreboard

SyslogLevel                notice

#TransferLog                /var/log/xferlog

TransferLog                NONE

#SystemLog                /var/log/proftpd-error.log

#ExtendedLog                /var/log/proftpd-extended.log read,write

 

 

Обёртываем rootfs в необходимый формат: JFFS2 или UBIFS.

Подключение файловой системы в режиме "только чтение"

Создаём скрипт инициализации init, размещаем его в корне файловой системы ramfs и даём права на запуск (755):

 

#!/bin/sh

 

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mount -t tmpfs none /tmp

#for ubifs

#insmod /lib/modules/ubi.ko mtd=rootfs

mount -t ubifs -o ro ubi:rootfs /rom

#for jffs2

#mount -t jffs2 -o ro /dev/mtdblock1 /rom

mkdir fs

mount -t aufs -o br=/tmp=rw:/rom=ro none /fs

exec switch_root /fs /sbin/init

Смешанное подключение файловой системы

Создаём скрипт инициализации init, размещаем его в корне файловой системы ramfs и даём права на запуск (755):

 

#!/bin/sh

 

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mount -t tmpfs none /tmp

#for ubifs

#insmod /lib/modules/ubi.ko mtd=rootfs

mount -t ubifs -o ro ubi:rootfs /rom

#for jffs2

#mount -t jffs2 -o ro /dev/mtdblock1 /rom

 

mkdir <progdir> etc home lib root sbin usr var

mount -o ro /rom/<progdir> /<progdir>

mount -o ro /rom/bin /bin

mount -o ro /rom/dev /dev

mount -o ro /rom/etc /etc

mount -o ro /rom/home /home

mount -o ro /rom/lib /lib

mount -o ro /rom/mnt /mnt

mount -o ro /rom/root /root

mount -o ro /rom/sbin /sbin

mount -o ro /rom/usr /usr

mount -t aufs -o br=/tmp=rw:/rom/var=ro none /var

exec /sbin/init

 

Смотри также

http://www.mjmwired.net/kernel/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Buildroot

Предыдущая  Содержание  Следующая