Pokud je to možné, nechejte nás lokalizovat/identifikovat zaneprázdněný proces, zabít tento proces a poté unmount
samba share/drive minimalizuje poškození:
-
lsof | grep '<mountpoint of /dev/sda1>'
(nebo jakékoli připojené zařízení) -
pkill target_process
(zabije zaneprázdněný proces podle názvu |kill PID
|killall target_process
) -
umount /dev/sda1
(nebo jakékoli připojené zařízení)
Vyhněte se umount -l
V době psaní tohoto článku doporučuje odpověď s nejvyšším počtem hlasů použít umount -l
.
umount -l
je nebezpečný nebo v nejlepším případě nebezpeční . Shrnuto:
- Ve skutečnosti neodpojí zařízení, pouze odstraní souborový systém z jmenného prostoru. Zápisy do otevřených souborů mohou pokračovat.
- Může to způsobit poškození souborového systému btrfs
Obejít / alternativa
Užitečné chování umount -l
skrývá souborový systém před přístupem absolutně cesty, čímž se minimalizuje další použití bodu připojení.
Stejného chování lze dosáhnout připojením prázdného adresáře s oprávněními 000
přes adresář, který má být odpojen.
Pak jakékoli nové přístupy k názvům souborů pod bodem připojení zasáhnou nově překrytý adresář s nulovými oprávněními – tím je zabráněno novým blokátorům odpojení.
Nejprve zkuste remount,ro
Hlavním úspěchem odpojení, který se má odemknout, je opětovné připojení pouze pro čtení. Když získáte remount,ro
odznak, znáte to:
- Všechna nevyřízená data byla zapsána na disk
- Všechny budoucí pokusy o zápis selžou
- Data jsou v konzistentním stavu, pokud byste potřebovali zařízení fyzicky odpojit.
mount -o remount,ro /dev/device
je zaručeno, že selže, pokud jsou soubory otevřené pro zápis, takže to rovnou vyzkoušejte. Možná máš štěstí, punke!
Pokud budete mít smůlu, zaměřte se pouze na procesy se soubory otevřenými pro zápis:
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
Poté byste měli být schopni znovu připojit zařízení pouze pro čtení a zajistit konzistentní stav.
Pokud v tuto chvíli nemůžete znovu připojit pouze pro čtení, prozkoumejte některé další možné příčiny uvedené zde.
Úspěch opětovného připojení pouze pro čtení odemčen ð☑
Gratulujeme, vaše data v přípojném bodě jsou nyní konzistentní a chráněná před budoucím zápisem.
Proč fuser
je nižší než lsof
Proč nepoužít fuser
dříve? No, mohl jsi, ale fuser
pracuje s adresářem , nikoli zařízení , takže pokud chcete odebrat bod připojení z prostoru názvů souborů a přesto použít fuser
, budete potřebovat:
- Dočasně duplikujte přípojný bod s
mount -o bind /media/hdd /mnt
na jiné místo - Skryjte původní bod připojení a zablokujte jmenný prostor:
Zde je postup:
null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"
# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked. https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"
# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"
# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"
Pak byste měli:
- Původní jmenný prostor je skrytý (další soubory nelze otevřít, problém se nemůže zhoršit)
- Duplicitní adresář připojený k vazbě (na rozdíl od zařízení), na kterém se má spustit
fuser
.
Toto je více spletité, ale umožňuje vám použít:
fuser -vmMkiw <mountpoint>
který interaktivně požádá o ukončení procesů se soubory otevřenými pro zápis. Samozřejmě, můžete to udělat, aniž byste vůbec skryli bod připojení, ale výše uvedené napodobuje umount -l
bez jakéhokoli nebezpečí.
-w
přepínač omezuje na procesy zápisu a -i
je interaktivní, takže po opětovném připojení pouze pro čtení, pokud spěcháte, můžete použít:
fuser -vmMk <mountpoint>
zabíjet všechny zbývající procesy se soubory otevřenými pod bodem připojení.
Doufejme, že v tomto okamžiku můžete zařízení odpojit. (Budete muset spustit umount
na přípojný bod dvakrát, pokud jste svázali připojený režim 000
adresář nahoře.)
Nebo použijte:
fuser -vmMki <mountpoint>
pro interaktivní ukončení zbývajících procesů pouze pro čtení, které blokují odpojení.
Sakra, pořád dostávám target is busy
!
Otevřené soubory nejsou jediným blokátorem odpojení. Další příčiny a jejich nápravy naleznete zde a zde.
I když máte nějakého číhajícího gremlina, který vám brání v úplném odpojení zařízení, máte alespoň svůj souborový systém v konzistentním stavu.
Poté můžete použít lsof +f -- /dev/device
vypsat všechny procesy s otevřenými soubory na zařízení obsahujícím souborový systém a poté je zabít.
ANO !! Existuje způsob, jak zaneprázdněné zařízení okamžitě odpojit – i když je zaneprázdněné a nelze jej násilně odpojit. Vše můžete vyčistit později:
umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS (NETWORK-FILE-SYSTEM)
POZNÁMKA/UPOZORNĚNÍ
- Tyto příkazy mohou narušit běžící proces, způsobit ztrátu dat NEBO poškodit otevřené soubory. Programy, které přistupují k souborům cílového DEVICE/NFS, mohou způsobit chyby NEBO po vynuceném odpojení nemusí fungovat správně.
- Ne ne spustit výše
umount
příkazy, když jsou uvnitř připojené cesty (složka/jednotka/zařízení). Nejprve můžete použítpwd
příkaz k ověření vaší aktuální cesty k adresáři (což by neměla být připojená cesta), poté použijtecd
příkaz k odchodu z připojené cesty – k odpojení později pomocí výše uvedených příkazů.
Ujistěte se, že nejste stále v připojeném zařízení, když se pokoušíte odpojit.