Estou trabalhando em um sistema Linux embarcado, tentando fazer com que ele inicie seu sistema de arquivos raiz usando initramfs
. O sistema aparece na maior parte mas tem problemas nos scripts de inicialização. Eu reduzi o problema ao seguinte.
O sistema não reconhece nenhum caminho relativo. Deixe-me explicar mais ...
Não são apenas links simbólicos que apontam para arquivos em locais relativos quebrados, mas simplesmente executar um comando simples como esse não funciona:
$ pwd
/etc/network
$ cat ../inittab
cat: can't open '../inittab': No such file or directory
Mas isso funciona bem:
$ cat /etc/inittab
<inittab output ...>
Alguma ideia do que poderia estar acontecendo?
UPDATE1
Um comando padrão ls ..
parece funcionar como esperado. Além disso, as referências do inode parecem bem, acredito?
$ ls ..
default/ inputrc moduli random-seed ssh_config sshd_config
dhcp/ issue mtab@ resolv.conf@ ssh_host_dsa_key ssl/
fstab ld.so.conf network/ rsyslog.conf ssh_host_dsa_key.pub sysconfig/
fstab.bak ld.so.conf.d/ nsswitch.conf rsyslog.d/ ssh_host_ecdsa_key ts.conf
group logrotate.conf os-release screenrc* ssh_host_ecdsa_key.pub udev/
hostname logrotate.d/ passwd securetty ssh_host_key
hosts ltrace.conf passwd- services ssh_host_key.pub
init.d/ memstat.conf profile shadow ssh_host_rsa_key
inittab mke2fs.conf protocols shadow- ssh_host_rsa_key.pub
$ cd / ; ls -lid /etc
1547 drwxr-xr-x 12 root root 0 Jan 1 00:49 /etc/
$ cd /etc ; ls -lid .
1547 drwxr-xr-x 12 root root 0 Jan 1 00:49 ./
$ cd /etc/network ; ls -lid ..
1547 drwxr-xr-x 12 root root 0 Jan 1 00:49 ../
Com ainda mais escavação, descobri que os caminhos relativos funcionam TANTO QUE você não cruza o "limite" da raiz do sistema de arquivos:
$ cd usr/
$ ls ../etc
ls: ../etc: No such file or directory
$ cd ../etc
$ cd network/
$ ls ..
default/ inputrc moduli random-seed ssh_config sshd_config
dhcp/ issue mtab@ resolv.conf@ ssh_host_dsa_key ssl/
fstab ld.so.conf network/ rsyslog.conf ssh_host_dsa_key.pub sysconfig/
fstab.bak ld.so.conf.d/ nsswitch.conf rsyslog.d/ ssh_host_ecdsa_key ts.conf
group logrotate.conf os-release screenrc* ssh_host_ecdsa_key.pub udev/
hostname logrotate.d/ passwd securetty ssh_host_key
hosts ltrace.conf passwd- services ssh_host_key.pub
init.d/ memstat.conf profile shadow ssh_host_rsa_key
inittab mke2fs.conf protocols shadow- ssh_host_rsa_key.pub
$ ls ../../usr
ls: ../../usr: No such file or directory
Isso me leva a acreditar que não montei corretamente o sistema de arquivos raiz. Talvez este resultado seja o mais revelador disso?
$ df
Filesystem Size Used Available Use% Mounted on
devtmpfs 204.2M 0 204.2M 0% /dev
tmpfs 251.7M 0 251.7M 0% /dev/shm
tmpfs 251.7M 76.0K 251.6M 0% /tmp
UPDATE2
Após uma pesquisa adicional, acredito que o seguinte melhor descreve meu cenário:
2) The newer initial ramfs image, initramfs. Here one populates a
directory, and then creates a compressed cpio archive which is
expanded into ramfs upon boot and becomes the root filesystem. The
kernel must be configured with CONFIG_BLK_DEV_INITRD=y but one does
not need to set CONFIG_BLK_DEV_RAM_SIZE, nor does one need to set
CONFIG_TMPFS=y. When the system is up, "df" does not report the root
filesystem and one cannot interact with it by doing things like "mount
--bind / dir". Also the distinction between what RAM is set aside for the filesystem and what RAM is used for processes is blurred. "df"
reports nothing and "free" reports total usage without distinction,
ie. used RAM = RAM used for files (as reported by "du") plus RAM used
for processes.
No entanto, estou um pouco surpreso com isso. Isso implica que eu não serei capaz de interagir em torno da raiz do sistema de arquivos ao usar o initramfs?
UPDATE3
Esta postagem indica que o que estou tentando realizar não é irracional:
Now normally an initramfs is temporary, only used to run some programs
extremely early in the boot process. After those programs run, control
is turned over to the real filesystem running on a physical disk.
However you do not have to do that. There is nothing stopping you from
running out of the initramfs indefinitely
Como posso executar o initramfs indefinidamente, mas também ser capaz de "atravessar" a raiz do sistema de arquivos?