Caminho relativo para qualquer coisa que não esteja funcionando (durante a execução do initramfs)

3

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?

    
por dtmland 01.07.2015 / 00:19

1 resposta

0

Depois de ler este post , o problema está resolvido!

Eu tinha notado, ao executar o comando mount , que duas entradas apareciam para / :

rootfs on / type rootfs (rw,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=209064k,nr_inodes=52266,mode=755)
proc on /proc type proc (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,relatime,mode=777)
tmpfs on /tmp type tmpfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
none on / type tmpfs (rw,relatime)

Eu adicionei uma entrada ao fstab que eu precisava remover:

# /etc/fstab: static file system information.
#
# <file system> <mount pt>     <type>   <options>         <dump> <pass>
none            /              tmpfs    defaults          0      0
proc            /proc          proc     defaults          0      0
devpts          /dev/pts       devpts   defaults,gid=5,mode=620   0      0
tmpfs           /dev/shm       tmpfs    mode=0777         0      0
tmpfs           /tmp           tmpfs    defaults          0      0
sysfs           /sys           sysfs    defaults          0      0

Após remover a entrada (e executar uma reinicialização):

none            /              tmpfs    defaults          0      0

O problema desaparece!

    
por 01.07.2015 / 21:07