Linux: Який процес спричиняє “зайнятість пристрою” при виконанні umount? [зачинено]


79

Linux: Який процес викликає "зайнятість пристрою" при виконанні umount?


Вам потрібно буде надати трохи більше інформації. Може бути кілька різних відповідей ....
AAA,

яка інформація вам потрібна? які можливі відповіді?
flybywire

Повернення останніх редагувань. По-перше, сценарії оболонки - це стільки ж програмування, скільки .net, SQL-запити чи розробка iphone. По-друге, вилучення позначення Linux робить питання амбіційним. BSD, OSX тощо мають дещо різну семантику, а Solaris тощо - тим більше.
MarkusQ

не забудь NFS! Вам потрібно зупинити всі точки експорту або монтування NFS на потрібному вам диску umount. NFS НЕ відображається на lsofабо fuser... так що це дуже складно!
Тревор Бойд Сміт

Відповіді:


108

Подивіться на команду lsof (перелік відкритих файлів) - вона може сказати вам, які процеси зберігають те, що відкрито. Іноді це складно, але часто щось таке просте, що sudo lsof | grep (your device name here)могло б зробити це за вас.


14
У моєму випадку закріплення назви пристрою не показало жодного результату. Однак, захопивши шлях, в який насправді було встановлено пристрій, так і було; отже, нарешті, вбивши цей процес, я зміг успішно встановити пристрій.
brAzzi64,

У моєму випадку команда нічого не показувала. Вихід із клієнта SSH та повторний вхід зробили це.
machineddict

4
Ви, мабуть, знаходились у цьому напрямку, намагаючись його демонтувати.
Bosiwow

4
lsof /mountpointзамістьlsof /mountpoint/
songhir

Існує перевага використання, lsof +f /dev/deviceа не точки монтування . Подивіться те саме для процесів ядра з анонімними анодами, які можуть не відображатися навіть у цьому списку.
Том Хейл,

43

Про всяк випадок ... іноді трапляється, що ви викликаєте umount з терміналу, а ваш поточний каталог належить змонтованій файловій системі.


4
Отримав мене теж. Ви можете це розпізнати, якщо lsof перелічить процес "bash" (debian)
Маттіас Баєр,

fuserвловлює поточні робочі каталоги, як цей, я вважаю.
Тревор Бойд Сміт,

26

Вам слід використовувати команду термофіксатора .

Напр. fuser /dev/cdromповерне pid (и) процесу за допомогою /dev/cdrom.

Якщо ви намагаєтеся демонтувати, ви можете вбити процес дисертацій за допомогою -kперемикача (див. man fuser).


2
FYI fuserіноді показує речі, які lsofцього не роблять, і навпаки. так що ви не можете робити лише те чи інше!
Тревор Бойд Сміт

Не спрацювало, але ти дав мені ідею вбити мій медіаплеєр, і це спрацювало, тож дякую за ідею ;-)
PJ Brunet

18

Перевірте наявність пристроїв із відкритим циклом, зіставлених із файлом у файловій системі з "losetup -a". Вони не з'являться ні з lsof, ні з термофіксатором.


1
Точно так! У мене були петльові пристрої, змонтовані на файлах .iso на розглянутому розділі. umount -l /dataФактично працював - ФС зник - але пізніше размонтирования /dev/loop0і /dev/loop1вішали на деякий час. Але зараз, здається, все гаразд. Ця відповідь дуже важлива, тому що вона допомагає людям, які знають lsofі fuserвіками ...
Томаш Гандор,

Це було для мене ключовим. у моєму випадку пристрій зберігання даних deckeremapper створив /dev/loop0 /dev/loop1циклічні пристрої. Єдиним способом, яким я міг від них позбутися, було перерахування пристроїв за допомогою dmsetup ls тодішнього пошуку підозрілого докера devicemapper пристрій docker-253: 0-4291588-pool. dmsetup remove docker-253:0-4291588-poolпозбувся чисто
robododge

16

Також перевірте /etc/exports. Якщо ви експортуєте шляхи в точці монтування через NFS, це дасть цю помилку при спробі демонтувати, і нічого не відображатиметься в fuserабо lsof.


У нашому випадку це була наша проблема.
raulsaeztapia

1
Чому б не показатись? Це тому, що nfs частково знаходиться в ядрі? (На відміну від того, що він повністю користувацький простір)
hbogert

9
lsof +f -- /mountpoint

(як перераховує процеси, що використовують файли на монтуванні, змонтованому в / mountpoint. Особливо корисно для пошуку того, які процеси використовують монтований USB-накопичувач або CD / DVD.


Це допомогло мені знайти процес, поточний робочий каталог якого перешкоджав AUTOCLEAR монтажу циклічного пристрою. Він не був внесений до списку fuserабо стандартний lsof.
Tom Hale

Ще краще використовувати , /dev/<device>а не , /mountpointяк /mountpointзникне після umount -l.
Том Хейл,

7

lsof і fuser - це справді два способи знайти процес, який тримає певний файл відкритим. Якщо ви просто хочете, щоб umount досяг успіху, вам слід дослідити його параметри -f та -l.


1
У мене була ця проблема нещодавно, і ні термофіксатор, ні lsof нічого не показали б за допомогою пристрою, але umount -l дозволив мені її відключити. Принаймні, здається, (-l означає «Ледачий демонтаж», від’єднайте файлову систему від ієрархії файлової системи зараз і очистіть усі посилання на файлову систему, як тільки вона більше не буде зайнята.)
Джефф Веллінг,

5

Саме тому існує "термофіксатор -m / mount / point".

До речі, я не думаю, що "fuser" або "lsof" будуть вказувати, коли ресурс утримується модулем ядра, хоча зазвичай у мене такої проблеми немає.


8
але саме це питання, здається, у мене є. як це налагодити?
K3 --- rnc

2

lsof і термофіксатор мені теж нічого не дали.

Після процесу перейменування всіх можливих каталогів на .old і перезавантаження системи щоразу після того, як я вносив зміни, я знаходив один конкретний каталог (що стосується postfix), який відповідав.

Виявилося, що я одного разу зробив символічне посилання з / var / spool / postfix на / disk2 / pers / mail / postfix / varspool, щоб мінімізувати запис диска в кореневу файлову систему на основі SDCARD (Sheeva Plug).

З цим символічним посиланням, навіть після зупинки служб postfix та dovecot (як ps aux, так і netstat -tuanp не показували нічого пов'язаного), я не зміг відключити / disk2 / pers.

Коли я видалив символічне посилання та оновив конфігураційні файли postfix та dovecot, щоб вказувати безпосередньо на нові директорії на / disk2 / pers /, я зміг успішно зупинити служби та відключити каталог.

Наступного разу я детальніше розгляну результат:

ls -lR /var | grep ^l | grep disk2

Вищенаведена команда буде рекурсивно перераховувати всі символічні посилання в дереві каталогів (тут, починаючи з / var) і відфільтровувати ті імена, які вказують на конкретну цільову точку монтування (тут disk2).


Я насправді шукаю символічні посилання (^ l у моїй команді), ваша команда може бути швидшою, але не має такого самого ефекту.
captcha

Д'о ... це тому, що я набрав команду. Це повинно бутиfind /var -lname *disk2*
умбл

1

Відкрити файли

Процеси з відкритими файлами є звичними винуватцями. Покажіть їх:

lsof +f -- <mountpoint or device>

Існує перевага використання, /dev/<device>а не /mountpoint: точка монтування зникне після umount -lабо може бути прихована накладеним монтуванням.

fuserтакож можна використовувати, але, на мій погляд lsof, це більш корисний результат. Однак fuserце корисно, коли мова йде про вбивство процесів, що спричиняють ваші драми, щоб ви могли продовжувати своє життя.

Перелічіть файли <mountpoint>(див. Застереження вище):

fuser -vmM <mountpoint>

Інтерактивно вбивайте лише процеси з файлами, відкритими для запису:

fuser -vmMkiw <mountpoint>

Після повторної установки лише для читання ( mount -o remount,ro <mountpoint>) безпечно (r) знищити всі залишені процеси:

fuser -vmMk <mountpoint>

Точки кріплення

Винуватцем може бути саме ядро. Інша файлова система, змонтована на файловій системі, яку ви намагаєтесь umount, спричинить горе. Зв'яжіться з:

mount | grep <mountpoint>/

Для кріплень із зворотним зв'язком також перевірте вихідні дані:

losetup -la

Анонімні аноди (Linux)

Анонімні аноди можна створити:

  • Тимчасові файли ( openз O_TMPFILE)
  • унеможливити годинник
  • [eventfd]
  • [опитування подій]
  • [timerfd]

Це самий невловимий тип покемона, і з'являються в lsof«s TYPEстовпець як a_inode(який без документів на lsofсторінці людини ).

Вони не з’являться в lsof +f -- /dev/<device>, тому вам потрібно:

lsof | grep a_inode

Інформацію про процеси вбивства, що містять анонімні аноди, див. У: Перелік поточних годинників інотифікації (шлях, PID) .


1

Якщо після зупинки всіх служб і процесів з відкритими файлами ви все ще не можете відключити або перемонтувати пристрій, тоді може бути файл підкачки або розділ підкачки, що заважає вашому пристрою. Це не відображатиметься з fuserабо lsof. Вимкніть обмін за допомогою:

sudo swapoff -a

Ви можете заздалегідь перевірити та показати підсумок будь-яких розділів підкачки або файлів підкачки за допомогою:

swapon -s

або:

cat /proc/swaps

Як альтернативу використанню команди sudo swapoff -a, ви також можете відключити обмін, зупинивши службу або системний блок. Наприклад:

sudo systemctl stop dphys-swapfile

або:

sudo systemctl stop var-swap.swap

У моєму випадку вимкнення підкачки було необхідним, крім зупинки будь-яких служб і процесів з файлами, відкритими для запису, щоб я міг перемонтувати свій кореневий розділ як лише для читання, щоб запустити fsckна моєму кореневому розділі без перезавантаження. Це було необхідно на Raspberry Pi під управлінням Raspbian Jessie.


0

Файлові системи, змонтовані у файловій системі, яку ви намагаєтеся демонтувати, можуть спричинити target is busyпомилку на додаток до будь-яких використовуваних файлів. (Наприклад, коли ви mount -o bind /dev /mnt/yourmount/devвикористовуєте chrootтам.)

Щоб знайти, які файлові системи змонтовані у файловій системі, виконайте наступне:

mount | grep '/mnt/yourmount'

Щоб дізнатись, які файли використовуються, скористайтеся порадами, вже запропонованими іншими тут:

lsof | grep '/mnt/yourmount'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.