Я работаю над встроенной системой на основе 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?