3

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

1 ответ1

0

Забудьте о создании папки /proc и устройства /dev /console, как вы определили, две распространенные ловушки при создании загрузочных ramfs вручную.

Что касается размера /dev, я думаю, что половина мегабайта будет иметь большое значение. В вашем случае, поскольку количество устройств будет более или менее постоянным после загрузки системы, можно с уверенностью посмотреть, сколько пространства /dev используется, и сделать файловую систему такого размера плюс пять-десять процентов для накладных расходов fs (файл и узлы папок).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .