GNU/Linux >> Znalost Linux >  >> Linux

Jak obnovit smazaný soubor, pokud je stále otevřen nějakým procesem?

... 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

Linux
  1. Obnovení náhodně smazaných souborů?

  2. Jak obnovit data Xfs po Rm?

  3. Jak najít a odstranit soubory starší než určité časové období v Linuxu

  1. Jak obnovím semafor, když selže proces, který jej snížil na nulu?

  2. Jak obnovit odstraněný soubor pod Linuxem?

  3. Jak obnovit otevřený, ale smazaný soubor v Linuxu pomocí ln místo cp?

  1. Jak obnovit smazaný soubor v Linuxu

  2. Jak zjistit, který proces vytváří soubor?

  3. Linux – Jak zjistit datum vytvoření souboru?