GNU/Linux >> Znalost Linux >  >> Linux

rmdir selhal z důvodu zaneprázdnění zařízení nebo prostředku

Setkal jsem se s problémem, jako je tento, protože připojuji sdílenou složku ve virtuálním počítači a chci po odpojení odstranit adresář a chci jen sdílet své řešení.

  1. cesta k odpojení

    sudo umount /your_path
    
  2. odstranit mout cestu v /etc/fstab

    sudo nano /etc/fstab
    
  3. restartovat

    sudo reboot
    
  4. odebrat adresář

    sudo rm -rf /your_path
    

Děkuji za odpověď @g-v. Ale zjistil jsem, že výsledkem je jiný problém. Při rozvětvení procesu používáme příznak CLONE_NEWNS. Další podrobnosti lze nalézt v příznaku CLONE_NEWNS a chybě MESOS-3349 Device busy

Stručně řečeno, připojíme se k rodičovskému procesu. A pak umount v podřízeném procesu, protože CLONE_NEWNS stále existuje bod připojení, který zpracovává nadřazený proces. Takže při volání rmdir by se zobrazil kód chyby EBUSY.

Abychom předešli výše uvedeným problémům, mohli bychom použít sdílené připojení nebo podřízené připojení. Další podrobnosti lze nalézt v LWN 159092


Podle mých zkušeností jsou následující operace v Linuxu asynchronní:

  • Zavírání souboru. Ihned po close() vrátí, umount() může vrátit EBUSY zatímco provádí asynchronní uvolnění. Viz diskuze zde:strana 1, strana 2.
  • Odpojování souborového systému. Připojené zařízení může být zaneprázdněné, dokud nebudou všechna data zapsána na disk.

Dokonce i já volám sync && echo 2 > /proc/sys/vm/drop_caches a zkuste vypustit mezipaměť souborů, stále to nefunguje.

Viz sync(8) :

V systému Linux sync je zaručeno pouze plánování špinavých bloků pro zápis; ve skutečnosti může chvíli trvat, než budou všechny bloky konečně zapsány. reboot(8) a halt(8) příkazy to berou v úvahu tím, že po zavolání sync(2) na několik sekund uspí .

Pokud jde o /proc/sys/vm/drop_caches , viz zde:

Toto je nedestruktivní operace a neuvolní žádné špinavé předměty.

Ihned po vašem příkazu tedy mohou být data stále zařazena do fronty pro zápis a odpojení ještě není dokončeno.

Aktualizovat

Pokud však probíhá asynchronní odpojení, jádro vrátí EBUSY pro operace na připojeném zařízení , ale ne pro přípojný bod .

Výše uvedené případy tedy nemohly být důvodem vašeho problému :P

PS.

Vlastně nechápu, proč je v manuálové stránce uvedeno sync(8) není v Linuxu synchronní. Volá sync(2) který uvádí:

Podle standardní specifikace (např. POSIX.1-2001), sync() naplánuje zápisy, ale může se vrátit ještě před dokončením samotného zápisu. Od verze 1.3.20 však Linux skutečně čeká. (To stále nezaručuje integritu dat:moderní disky mají velké mezipaměti.)


Linux
  1. ‘lxc_cgfs – Zařízení nebo prostředek zaneprázdněn – nepodařilo se nastavit memory.use_hierarchy na 1; continue’ – chyba při spouštění kontejneru LXC

  2. losetup:příkaz nenalezen

  3. Jak odpojit zaneprázdněné zařízení

  1. avrdude:ser_open():nelze otevřít zařízení /dev/ttyACM0:Zařízení nebo zdroj je zaneprázdněn

  2. Android Studio – synchronizace Gradle se nezdařila:Již zlikvidováno

  3. Dva různé montážní body s jedním zařízením

  1. Zařízení s trvalou smyčkou?

  2. Nelze připojit oddíly NTFS kvůli Windows 10?

  3. Jak připojit zařízení v Linuxu?