( nice | 2011. 11. 09., sze - 22:38 )

Miközben ennek az anyagnak a megírására készültem, egy érdekes dolgot találtam a symlinkekről: Hogyan lehet egy atomi lépésben átírni egy symlink célját?

A symlinkek inode-jában tárolt metainformációkat (legalábbis a jogosultságokra vonatkozókat) nem nagyon veszi figyelembe a kernel. A hozzáférési jogok értéke mindig 777 (rwxrwxrwx), nem is lehet megváltoztatni. Ha jól veszem ki, ez azért van, hogy symlinkek viselkedése minél jobban közelítse a sima könyvtárbejegyzésekét, azaz a hard linkekét (ld. a fentebbi kommentekben, milyen jogok szükségesek fájltörléshez, fájl-inode eléréshez). A symlinkek tulajdonos felhasználóját és csoportját meg lehet ugyan változtatni, de ezeket az értékeket csak akkor veszi figyelembe a kernel, amikor el akarja dönteni, hogy egy 1-es értékű sticky bittel rendelkező könyvtárból (pl. /tmp) kinek van joga kitörölni az adott symlinket.

A symlinkek még inkább read-only jelleget kapnak az által, hogy az értékük (vagyis a célpontjuk elérési útja) nem módosítható. Egy symlink célpontját csakis úgy tudjuk átírni, ha letöröljük a symlinket, majd létrehozunk egy ugyanolyan nevűt más célponttal. Ezt pedig egyetlen atomi lépésben kicsit trükkös véghezvinni:

http://unix.stackexchange.com/questions/5093/how-does-one-atomically-ch…

A megoldás a rename rendszerhívás (esetleg az mv parancson keresztül).