Dit wordt een tamelijk lang verhaal, sorry.
Ik ben aan het rotzooien met een embedded Linux doosje (een Belkin Home Base), en liep daarbij tegen een raar verschijnsel.
Dit doosje slaat de instellingen op in een mtd block, in rauw formaat.
Het rootfs is squashfs, en de /etc directory bevat een aantal symlinks naar /tmpfs/etc/... voor de files die writable moeten zijn. /etc/sysconfig is dus een symlink naar de directory /tmpfs/etc/sysconfig. Op /tmpfs is een tmpfs gemount. (ja echt!)
Nu heb ik de hele /etc directory writable gemaakt. Dit heb ik gedaan door de squasfs mtdblock nogmaals te mounten op /.rootfs, en /tmpfs/etc te bindmounten op /etc. Vervolgens heb ik in /etc symlinks gemaakt naar alle files/directories in /.rootfs/etc. De files die al symlinks waren heb ik vervangen door echte, lege, files.
De directory /tmpfs/etc/sysconfig bestaat dus nog steeds, en heeft nog dezelfde functie.
Na deze ingreep kon ik geen instellingen meer veranderen. De webinterface waarmee dit gedaan had moeten worden crashed met een witte pagina met daarin de naam van 1 van de variabelen, bijvoorbeeld USE_DHCP0.
In /var/log/messages staat de volgende regel:
Inderdaat bestaat de file /tmp/conf.tmp.yDazMa, en deze is identiek aan /etc/sysconfig/system.conf, op de settings die veranderd zijn na. Blijkbaar had deze naar /etc/sysconfig/system.conf gerenamed moeten worden, en is dit mislukt.
Nu heb ik de directory symlink hersteld:
Maar nu is de vraag: Welk mechanisme kan ervoor zorgen dat een rename mislukt als er geen symlink in het pad zit, en slaagt als die er wel zit?
Ik ben aan het rotzooien met een embedded Linux doosje (een Belkin Home Base), en liep daarbij tegen een raar verschijnsel.
Dit doosje slaat de instellingen op in een mtd block, in rauw formaat.
code:
en zo verder, 65 regels. Bij het opstarten word dit gecached in een platte text file, /etc/sysconfig/system.conf.1
2
3
4
5
6
7
8
9
10
11
12
| ROOT_PASSWORD=<snip> HOST_NAME=HomeBase TIMEZONE=+0:00 USE_DHCP0=ENABLE IPADDR0=0.0.0.0 NETMASK0=0.0.0.0 GATEWAY=0.0.0.0 DNS_PRIMARY=0.0.0.0 DNS_SECONDARY=0.0.0.0 HTTP_PROXY_ADDR= HTTP_PROXY_PORT= NTP_SERVER=0.pool.ntp.org |
Het rootfs is squashfs, en de /etc directory bevat een aantal symlinks naar /tmpfs/etc/... voor de files die writable moeten zijn. /etc/sysconfig is dus een symlink naar de directory /tmpfs/etc/sysconfig. Op /tmpfs is een tmpfs gemount. (ja echt!)
Nu heb ik de hele /etc directory writable gemaakt. Dit heb ik gedaan door de squasfs mtdblock nogmaals te mounten op /.rootfs, en /tmpfs/etc te bindmounten op /etc. Vervolgens heb ik in /etc symlinks gemaakt naar alle files/directories in /.rootfs/etc. De files die al symlinks waren heb ik vervangen door echte, lege, files.
De directory /tmpfs/etc/sysconfig bestaat dus nog steeds, en heeft nog dezelfde functie.
Na deze ingreep kon ik geen instellingen meer veranderen. De webinterface waarmee dit gedaan had moeten worden crashed met een witte pagina met daarin de naam van 1 van de variabelen, bijvoorbeeld USE_DHCP0.
In /var/log/messages staat de volgende regel:
code:
1
| Jun 3 17:13:42 HomeBase user.crit result_main.htm: Rename config file fail master /etc/sysconfig/system.conf tmp /tmp/conf.tmp.yDazMa |
Inderdaat bestaat de file /tmp/conf.tmp.yDazMa, en deze is identiek aan /etc/sysconfig/system.conf, op de settings die veranderd zijn na. Blijkbaar had deze naar /etc/sysconfig/system.conf gerenamed moeten worden, en is dit mislukt.
Nu heb ik de directory symlink hersteld:
code:
Dat lost het probleem op. Ik kan weer instellingen opslaan.1
2
| mv /etc/sysconfig /etc/.sysconfig ln -s /tmpfs/etc/.sysconfig /etc/sysconfig |
Maar nu is de vraag: Welk mechanisme kan ervoor zorgen dat een rename mislukt als er geen symlink in het pad zit, en slaagt als die er wel zit?