Rendre accessible en lecture seule / etc

11

J'ai affaire à un appareil embarqué fonctionnant sous Linux. Les fabricants de cet appareil l'ont configuré de sorte qu'il charge le système de fichiers racine en lecture seule.

Depuis / etc / mtab:

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

Cela signifie que je ne peux pas modifier de fichiers dans / etc, par exemple pour ajouter un nouvel utilisateur.

J'ai essayé de remonter le répertoire racine:

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

mais je reçois juste une erreur

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

J'ai recherché cette erreur et les gens disaient d'utiliser blockdev. Le système n'a pas installé blockdev, je l'ai donc compilé et copié. Puis j'ai couru

blockdev --setrw rootfs

mais encore une fois j'ai eu une erreur:

blockdev: cannot open rootfs: No such file or directory

Est-il possible de rendre / etc accessible en écriture s'il ne l'est pas déjà? J'ai un accès root au système, mais je ne suis pas en mesure d'accéder au système de fichiers «hors ligne», toutes les modifications doivent être effectuées via les commandes Bash.

Joshua Walsh
la source

Réponses:

19

squashfsest un système de fichiers compressé en lecture seule. Il n'a aucune disposition pour y apporter des modifications une fois qu'il a été créé. Vous ne pouvez donc pas y écrire même si le périphérique de bloc sous-jacent peut être rendu accessible en écriture. Vous devez créer une nouvelle image squashfs de l'ensemble du système de fichiers avec vos modifications et la graver sur le périphérique de stockage où ce système de fichiers est stocké, ce qui serait problématique à faire à partir du système en direct.

Une autre option consiste à monter un système de fichiers différent sur /etc. Il pourrait se faire par une union de montage si supporté par le noyau, qui fusionne deux systèmes de fichiers en général avec un enregistrement du système de fichiers que les modifications apportées à une base de lecture seule du système de fichiers.

Vérifiez la prise en charge d'AUFS_FS ou OVERLAY_FS dans la configuration du noyau.

Par exemple, pour monter un répertoire dans un répertoire /tmp(si tout va bien en écriture mais éventuellement tmpfsen mémoire (donc pas persistant lors d'un redémarrage) dans votre cas si le système n'a pas de stockage en écriture permanent)

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

Il /etcsera alors accessible en écriture et les modifications que vous y apporterez seront réellement stockées /tmp/etc/upper.

Alternativement, si ce n'est que quelques fichiers que vous souhaitez modifier, vous pouvez les monter par liaison (oui, vous pouvez les monter sur n'importe quel fichier, pas seulement sur des répertoires) à partir d'une version stockée dans un système de fichiers accessible en écriture:

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

Ce /etc/passwdserait alors accessible en écriture. Bien sûr, vous pouvez également le faire pour l'ensemble de /etc. ( cp -a /etc /tmp && mount --bind /tmp/etc /etc).

Stéphane Chazelas
la source
Certains systèmes intégrés peuvent remplacer les fichiers /etcau démarrage en fonction de certains paramètres de nvram. Ainsi, pour modifier un fichier, /etcvous devez définir une variable système "magique", la valider sur nvram, puis recharger la configuration ou redémarrer. La grande majorité des routeurs à domicile fonctionnent comme ça. Mais les mécanismes et commandes exacts sont spécifiques au système.
Satō Katsura
Parfait! L'appareil ne prend pas en charge les montages de superposition, mais la liaison de fichiers personnalisés sur des fichiers dans / etc a très bien fonctionné! Merci de votre aide.
Joshua Walsh