Estou trabalhando em um sistema embarcado baseado no ARM com um Debian Linux baseado no kernel 2.6.31. No sistema final, o sistema de arquivos raiz é armazenado como squashfs no flash. Agora, a pasta / dev é criada pelo udev, mas como não há necessidade de hot plugging e o tempo de inicialização é crítico, eu queria excluir o udev e "hard code" da pasta / dev (leia aqui , p�gina 5). porque eu ainda preciso alterar os parâmetros dos dispositivos (com ioctl / sysfs) isso não funciona para mim neste caso. Então eu pensei em montar um tmpfs em / dev e mudar os parâmetros lá. Isso é possível? e como fazer melhor? minha abordagem seria:
- delete / dev do RFS
- crie tar com dispositivos básicos
- mount tmpfs / dev
- descompactar arquivo tar em / dev
- alterar parâmetros
Isso funcionaria? Você vê algum problema?
Eu descobri, que você pode montar em cima do ponto de montagem já montado, é de alguma forma possível apenas para tirar dados com a montagem do novo sistema de arquivos? se assim for, isso seria muito conveniente!
Obrigado
Atualização: Eu apenas tentei isso, mas estou preso em um certo ponto. Eu coloquei todos os meus dispositivos em devices.tar, coloquei em / usr do meu squashfs e adicionei as seguintes linhas ao mountkernfs.sh, que é executado logo após o 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."
Isso funciona bem na versão sobre o NFS, se eu colocar o printf no código, eu posso vê-lo em execução, se eu comentar a parte de extração, está reclamando sobre falta de dispositivos.
-
Inicializando OK
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
-
Comentando a extração do tar
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"
Até aí tudo bem. Mas se eu empacotar toda a história em squashfs e boot a partir daí, está agindo de forma estranha. Está me dizendo durante a inicialização que é incapaz de abrir um console inicial e seus erros de montagem na montagem dos dispositivos UBIFS, mas finalmente fornece um login de qualquer maneira. Sobre isso meus ecos não são executados. Se eu fizer o login, / dev é montado como TMPFS conforme desejado e todos os dispositivos residem dentro dele. Quando eu refaz o comando "mount" para montar as partições UBIFS, ele é executado sem problema e utilizável.
Além disso, uma parte do restante dos scripts de inicialização ainda éexecutada, mas nem todos eles. Alguém tem idéia do porquê?
Outra questão, é 5MB suficiente / muito para / dev?