Tornar somente leitura / etc gravável

11

Estou lidando com um dispositivo incorporado executando Linux. Os fabricantes deste dispositivo o configuraram para carregar o sistema de arquivos raiz como somente leitura.

Em / etc / mtab:

rootfs / rootfs rw 0 0
/dev/root / squashfs ro,relatime 0 0

Isso significa que não consigo modificar nenhum arquivo no / etc, como adicionar um novo usuário.

Eu tentei remontar o diretório raiz:

mount -o remount,rw -t squashfs /dev/root /

mas eu recebo um erro

mount: cannot remount block device /dev/root read-write, is write-protected

Procurei esse erro e as pessoas estavam dizendo para usar o blockdev. O sistema não possui o blockdev instalado, então eu o compilei e copiei. Então eu corri

blockdev --setrw rootfs

mas novamente eu recebi um erro:

blockdev: cannot open rootfs: No such file or directory

É possível tornar o / etc gravável, se já não estiver? Eu tenho acesso root ao sistema, mas não consigo acessar o sistema de arquivos 'offline', todas as alterações devem ser feitas através dos comandos do Bash.

Joshua Walsh
fonte

Respostas:

19

squashfsé um sistema de arquivos compactados somente leitura. Ele não possui disposições para fazer modificações depois de criado. Portanto, você não pode gravar nele, mesmo que o dispositivo de bloco subjacente possa ser gravado. Você precisaria criar uma nova imagem squashfs de todo o sistema de arquivos com suas modificações e gravá- la no dispositivo de armazenamento em que esse sistema de arquivos está armazenado, o que seria problemático no sistema ativo.

Outra opção é montar um sistema de arquivos diferente /etc. Poderia ser por meio de uma montagem de união se suportado pelo kernel, que se funde dois sistemas de arquivos em conjunto tipicamente com uma gravação do sistema de arquivos apenas as alterações em uma base de somente leitura do sistema de arquivos.

Verifique o suporte para AUFS_FS ou OVERLAY_FS na configuração do kernel.

Por exemplo, para montar um diretório em união /tmp(provavelmente gravável, embora possivelmente tmpfsna memória) (portanto, não persistente durante uma reinicialização) no seu caso, se o sistema não tiver armazenamento gravável permanente)

mkdir -p /tmp/etc/work /tmp/etc/upper
mount -t overlay \
      -o lowerdir=/etc,upperdir=/tmp/etc/upper,workdir=/tmp/etc/work \
       overlay /etc

Em seguida /etc, serão graváveis ​​e as modificações que você fizer serão armazenadas /tmp/etc/upper.

Como alternativa, se forem apenas alguns arquivos que você deseja modificar, você poderá montá-los (sim, você pode montar em qualquer arquivo, não apenas em diretórios) a partir de uma versão armazenada em um sistema de arquivos gravável:

cp /etc/passwd /tmp
mount --bind /tmp/passwd /etc/passwd

Então /etc/passwdseria gravável. Claro que você também pode fazer isso durante todo o processo /etc. ( cp -a /etc /tmp && mount --bind /tmp/etc /etc)

Stéphane Chazelas
fonte
Alguns sistemas incorporados podem substituir arquivos no /etcmomento da inicialização, com base em determinadas configurações no nvram. Portanto, para alterar um arquivo, /etcvocê definiria uma variável de sistema "mágica", confirme com o nvram e recarregue a configuração ou reinicie. A grande maioria dos roteadores domésticos funciona assim. Mas os mecanismos e comandos exatos são específicos do sistema.
Satō Katsura
Perfeito! O dispositivo não suporta montagens de sobreposição, mas a ligação de arquivos personalizados sobre arquivos no / etc funcionou muito bem! Obrigado pela ajuda.
Joshua Walsh