Смонтируйте TMPFS вместо ro / dev

1163
schiggn

Я работаю над встроенной системой на основе ARM с пользовательским Debian Linux на базе ядра 2.6.31. В последней системе корневая файловая система хранится в виде squashfs на флэш-памяти. Теперь папка / dev создается с помощью udev, но поскольку не требуется функциональность «горячей» замены, а время загрузки является критически важным, я хотел удалить udev и «жестко закодировать» папку / dev (см. Здесь, стр. 5). потому что мне все еще нужно изменить параметры устройств (с ioctl / sysfs), это не работает для меня в этом случае. поэтому я подумал о монтировании tmpfs в / dev и изменении там параметров. Это возможно? и как сделать лучше? мой подход будет:

  • удалить / dev из RFS
  • создать tar, содержащий основные устройства
  • монтировать tmpfs / dev
  • разархивировать tar-файл в / dev
  • изменить параметры

Может ли это работать? Вы видите какие-либо проблемы?

Я обнаружил, что вы можете монтировать поверх уже смонтированной точки монтирования. Можно ли как-то просто взять данные при монтировании новой файловой системы? если так, то это было бы очень удобно!

Спасибо

Обновление: я только что попробовал это, но я застрял в определенной точке. Я упаковал все свои устройства в devices.tar, упаковал его в / usr моих squashfs и добавил следующие строки в mountkernfs.sh, который выполняется сразу после INIT.

#mount /dev on tmpfs echo -n "Mounting /dev on tmpfs..." mount -o size=5M,mode=0755 -t tmpfs tmpfs /dev mknod -m 600 /dev/console c 5 1 mknod -m 600 /dev/null c 1 3 echo "done." echo -n "Populating /dev..." tar -xf /usr/devices.tar -C /dev echo "done." 

Это отлично работает на версии поверх NFS, если я помещаю printf в код, я вижу, как она выполняется, если я закомментирую извлекающую часть, которая жалуется на отсутствующие устройства.

  • Загрузка ОК

    mmc0: new high speed SDHC card at address 0007 mmcblk0: mmc0:0007 SD04G 3.67 GiB  mmcblk0: p1 IP-Config: Unable to set interface netmask (-22). Looking up port of RPC 100003/2 on 192.168.1.234 Looking up port of RPC 100005/1 on 192.168.1.234 VFS: Mounted root (nfs filesystem) on device 0:14. Freeing init memory: 136K INIT: version 2.86 booting Mounting /dev on tmpfs...done. Populating /dev...done. Initializing /var...done. Setting the system clock. System Clock set to: Thu Sep 13 11:26:23 UTC 2012. INIT: Entering runlevel: 2 UBI: attaching mtd8 to ubi0 
  • Комментируя извлечение смолы

    mmc0: new high speed SDHC card at address 0007 mmcblk0: mmc0:0007 SD04G 3.67 GiB  mmcblk0: p1 IP-Config: Unable to set interface netmask (-22). Looking up port of RPC 100003/2 on 192.168.1.234 Looking up port of RPC 100005/1 on 192.168.1.234 VFS: Mounted root (nfs filesystem) on device 0:14. Freeing init memory: 136K INIT: version 2.86 booting Mounting /dev on tmpfs...done. Populating /dev...done. Initializing /var...done. Setting the system clock. Cannot access the Hardware Clock via any known method. Use the --debug option to see the details of our search for an access method. Unable to set System Clock to: Thu Sep 13 12:24:00 UTC 2012 ... (warning). INIT: Entering runlevel: 2 libubi: error!: cannot open "/dev/ubi_ctrl" 

Все идет нормально. Но если я упаковываю всю историю в squashfs и загружаюсь оттуда, это ведет себя странно. Во время загрузки он сообщает, что не может открыть исходную консоль и выдает ошибки при монтировании устройств UBIFS, но, в конце концов, в любом случае обеспечивает вход в систему. За это мое эхо не исполнилось. Если я вхожу в систему, / dev монтируется как TMPFS, и все устройства находятся внутри. Когда я повторяю команду «mount» для монтирования разделов UBIFS, она выполняется без проблем и может быть использована.

  • Из сквоша

    VFS: Mounted root (squashfs filesystem) readonly on device 31:15. Freeing init memory: 136K Warning: unable to open an initial console. mmc0: new high speed SDHC card at address 0007 mmcblk0: mmc0:0007 SD04G 3.67 GiB  mmcblk0: p1 UBIFS error (pid 484): ubifs_get_sb: cannot open "ubi1_0", error -19 

Кроме того, часть остальной части загрузочных сценариев все еще исполняется, но не все. У кого-нибудь есть подсказка почему? Другой вопрос, достаточно ли 5 ​​МБ / слишком много для / dev?

3
и, наконец, добавить решение, я решил проблему. Я не предоставлял / dev / console для INIT, поэтому он жаловался. Решение состоит в том, чтобы включить / dev / null и / dev / console в squashfs. Таким образом, во время процедуры загрузки происходит следующее: -> Использовать / dev из squashfs -> монтировать TMPFS / dev over / dev из squashfs -> заполнять из tar. Но отдыхает вопрос о размере TMPFS. 5 МБ много, слишком мало, достаточно? schiggn 11 лет назад 0

1 ответ на вопрос

0
Ярослав Рахматуллин

Forgetting to create a /proc folder and a /dev/console device are two common pitfalls when creating a boot-ramfs by hand, as you have identified.

As for the size of /dev, I think half a megabyte will go a long way. In your case, since the number of devices will more or less be constant once the system has booted, it is safe to look how much space /dev is using and make the filesystem that size plus five-ten percent for fs overhead (file and folder nodes).

Похожие вопросы