... lepší než kopírování v danou dobu (a shromažďování pouze aktuálního snímku obsahu souboru) je "tail -f
" tento soubor do nového souboru:
tail -c +0 -f /proc/PIDofProgram>/fd/# > /new/path/to/file
(díky opatrným programátorům tailu to bude fungovat i s binárním výstupem.)
Během běhu je tail -f
sám udržuje soubor otevřený a bezpečně zabraňuje jeho vymazání z disku, když původní program skončí. Proto nezastavujte tail -f
ihned po skončení vašeho původního programu – zkontrolujte koncovou /new/path/to/file
nejprve zda je co chceš. Pokud tomu tak není (nebo je nevyhovující z jakéhokoli jiného důvodu), můžete původní soubor zkopírovat znovu, ale tentokrát po veškerý zápis do něj skončil pomocí "Programu" a ze stále běžícího tail -f
adresář /proc/PIDoftail/fd/.
Pokud je /home NFS, bude v /home/vi soubor .nfsNNNNNNNNNN, ke kterému můžete přistupovat/kopírovat. Pokud je domovem lokální souborový systém, měli byste být schopni udělat totéž pomocí odkazu /proc/PID/fd/3:
cp /proc/PID/fd/3 /tmp/recovered_file
Pokud chcete soubor skutečně obnovit, zde je blogový příspěvek na toto téma.
Použijte lsof k nalezení čísla inodu a debugfs k opětovnému vytvoření pevného odkazu na něj. Například:
# lsof -p 12345 | grep /var/log/messages
syslogd 12345 root 3w REG 8,3 3000 987654 /var/log/messages (deleted)
# mount | grep var
/dev/sda2 on /var type ext3 (rw)
# debugfs -w /dev/sda2
debugfs: cd log
debugfs: ln <987654> tmp
debugfs: mi tmp
Mode [0100600]
User ID [0]
Group ID [0]
Size [3181271]
Creation time [1375916400]
Modification time [1375916322]
Access time [1375939901]
Deletion time [9601027] 0
Link count [0] 1
Block count [6232]
File flags [0x0]
...snip...
debugfs: q
# mv /var/log/tmp /var/log/messages
# ls -al /var/log/messages
-rw------- 0 root root 3301 Aug 8 10:10 /var/log/messages
Než si budete stěžovat, zfalšoval jsem výše uvedený přepis, protože právě teď nemám po ruce smazaný soubor;-)
Používám mi
resetovat čas odstranění a počet odkazů na rozumné hodnoty (0 a 1 v tomto pořadí), ale nefunguje to správně – počet odkazů zůstává na nule v ls
. Myslím, že jádro může ukládat data inodů do mezipaměti. Pravděpodobně byste měli fsck při nejbližší příležitosti po použití debugfs, abyste byli na bezpečné straně.
Podle mých zkušeností byste měli vytvořit odkaz pomocí dočasného názvu souboru a poté jej přejmenovat na správný název. Přímé propojení s původním názvem souboru pravděpodobně způsobí poškození adresáře. YMMV!
- http://glandium.org/blog/?p=87
- http://www.cyberciti.biz/tips/linux-ext3-ext4-deleted-files-recovery-howto.html