У меня полностью кастомная, минимальная, встроенная система Linux (vanilla, 3.3.8, i486, Vortex86dx), которая загружается с образа initramfs. Стандартные скрипты дистрибуции не используются, только один файл rcS, который выполняет инициализацию.
У меня есть IDE Flash-диск с двумя разделами: /dev/hda1 и /dev/hda2.
Поскольку это минимальный встроенный дистрибутив для фиксированной системы, в нем есть статический каталог /dev, содержащий /dev/hda1 и /dev/hda2, а UDEV отсутствует.
В момент, когда init вызывает rcS, запись /dev/hda1 больше не присутствует. Никакие другие скрипты, пользовательские приложения или демоны в этот момент не были запущены. /dev/hda1появляетсябыть удаленным ядром(?)
У меня не возникает подобной проблемы, если я загружаю свою целевую систему через корневую файловую систему NFS в процессе разработки.
Я использую Buildroot для создания каталога /dev с помощью файла device_table_dev.txt. Например:
# IDE Devices
/dev/hda b 640 0 0 3 0 0 0 -
/dev/hda b 640 0 0 3 1 1 1 4
Я проверил rootfs.tar.gz из Buildroot output/images. Каталог /dev содержит /dev/hda1:
brw-r----- 1 root root 3, 0 Jul 2 13:44 hda
brw-r----- 1 root root 3, 1 Jul 2 13:44 hda1
brw-r----- 1 root root 3, 2 Jul 2 13:44 hda2
brw-r----- 1 root root 3, 3 Jul 2 13:44 hda3
brw-r----- 1 root root 3, 4 Jul 2 13:44 hda4
Мой список каталогов после загрузки (сделанный из rcS, в верхней части скрипта) на целевой машине выглядит следующим образом:
brw-r----- 1 root root 3, 0 Jul 2 12:44 hda
brw-r----- 1 root root 3, 2 Jul 2 12:44 hda2
brw-r----- 1 root root 3, 3 Jul 2 12:44 hda3
brw-r----- 1 root root 3, 4 Jul 2 12:44 hda4
/dev/hda1 отсутствует. /dev/hda2 — это раздел на том же диске, но он все еще там. Странно.
Если я запускаю утилиту Busybox "mdev -s", она восстанавливает /dev/hda1 на целевом устройстве и все работает нормально. Например, я могу его смонтировать.
Кто-нибудь когда-нибудь видел подобное поведение?
Удаляет ли ядро записи из /dev?
решение1
Подсистема udev
создает и монтирует tmpfs
файловую систему во /dev
время загрузки. Содержимое заполняется ядром по мере обнаружения устройств. Поскольку tmpfs
находится в виртуальной памяти, оно не является постоянным, поэтому ваши изменения не сохраняются при перезагрузках. Даже если у вас /dev
уже есть, монтирование новой файловой системы скрывает каталог, и создается впечатление, что все ваши специальные устройства были удалены. Это не так, но конечный результат тот же: специальные не там, где вы ожидаете.
Я подозреваю, что вы обнаружите, что ваши записи hda
и hdaX
были заменены на записи sda
и sdaX
. В качестве альтернативы проверьте /proc/devices
и , /proc/partitions
чтобы получить имя, udev
назначенное диску.
Иногда может помочь быстрое и грубое решение, например fdisk -l /dev/[sh]d[a-z]
(работает лучше, если у вас менее 26 дисков каждого типа).
Кстати, схема именования, используемая , udev
стандартизирована, и ваш статик /dev
может сделать хуже, чем следовать соглашениям. Если udev
вы думаете, что это /dev/sda
, то придерживайтесь этого. Вы могли бы избежать потенциальных странностей и недоразумений в будущем.