Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何卸载忙碌的设备_Linux_Umount - Fatal编程技术网

Linux 如何卸载忙碌的设备

Linux 如何卸载忙碌的设备,linux,umount,Linux,Umount,我有一些samba驱动器,每天都有多个用户访问。我已经有了识别共享驱动器(来自SQL表)的代码,并将它们装载到一个所有用户都可以访问的特殊目录中 我想知道,如果我从我的SQL表中删除了一个驱动器(实际上是使其脱机),如何,甚至是否有办法卸载一个繁忙的设备?到目前为止,我发现任何形式的umount都不起作用 忽略破坏数据的可能性-是否可以卸载当前正在读取的设备 查看: Linux 2.1.116添加了umount2()系统调用,与umount()一样, 卸载目标,但允许附加标志控制 操作行为: M

我有一些samba驱动器,每天都有多个用户访问。我已经有了识别共享驱动器(来自SQL表)的代码,并将它们装载到一个所有用户都可以访问的特殊目录中

我想知道,如果我从我的SQL表中删除了一个驱动器(实际上是使其脱机),如何,甚至是否有办法卸载一个繁忙的设备?到目前为止,我发现任何形式的
umount
都不起作用

忽略破坏数据的可能性-是否可以卸载当前正在读取的设备

查看:

Linux 2.1.116添加了umount2()系统调用,与umount()一样, 卸载目标,但允许附加标志控制 操作行为:

MNT_FORCE(自Linux 2.1.116以来)强制卸载,即使很忙。(只适用于 NFS挂载。)MNT_DETACH(自Linux 2.4.11以来)执行延迟卸载: 使装载点不可用于新的访问 在装载点停止忙碌时执行卸载。MNT_到期 (自Linux 2.6.8起)将装载点标记为过期。如果安装点 当前未使用,则使用此 标志失败,错误为EAGAIN,但将装载点标记为 期满。只要装载点未被访问,它就会一直过期 通过任何过程。第二个umount2()调用指定MNT_EXPIRE unmounts 已过期的装载点。此标志不能与任何一个一起指定 MNT_强制或MNT_分离。返回值

成功时,返回零。出现错误时,返回-1,返回errno 适当地设置


如果可能,让我们定位/识别繁忙的进程,杀死该进程,然后
卸载
samba共享/驱动器,以尽量减少损坏:

  • lsof | grep'
    (或任何安装的设备)

  • pkill target_进程
    (按名称终止繁忙进程|
    终止PID
    |
    终止所有目标_进程

  • umount/dev/sda1
    (或安装的任何设备)


    • !!有一种方法可以立即分离繁忙的设备,即使它繁忙且无法强制卸载。您可以在以后清理所有文件:

      umount -l /PATH/OF/BUSY-DEVICE
      umount -f /PATH/OF/BUSY-NFS (NETWORK-FILE-SYSTEM)
      
      注意/小心

    • 这些命令可能会中断正在运行的进程,导致数据丢失或损坏打开的文件。访问目标设备/NFS文件的程序可能会抛出错误,或者在强制卸载后无法正常工作
    • 当安装在路径(文件夹/驱动器/设备)内部时,不要执行上面的
      umount
      命令。首先,您可以使用
      pwd
      命令验证当前目录路径(不应为装入的路径),然后使用
      cd
      命令退出装入的路径-稍后使用上述命令将其卸载

    • 使用exportfs-v检查导出的NFS文件系统。如果找到,请使用exportfs-d share:/directory删除。这些不会显示在fuser/lsof列表中,并且会阻止umount成功。

      尝试以下操作,但在运行之前请注意,
      -k
      标志将终止任何使设备忙碌的运行进程。

      -i
      标志使
      fuser
      在终止前询问

      fuser -kim /address  # kill any processes accessing file
      unmount /address
      

      当您尝试umount时,请确保您没有仍在已安装的设备中。

      另一种可行的方法是编辑
      /etc/fstab
      ,添加
      noauto
      标志并重新启动机器。设备将不会安装,当您完成任何操作后,请删除标志并重新启动。

      避免
      umount-l
      在撰写本文时,得票最多的答案建议使用
      umount-l

      。总之:

      • 它实际上并没有卸载设备,只是从名称空间中删除了文件系统。可以继续写入打开的文件
      • 它可能导致btrfs文件系统损坏
      变通/备选方案
      umount-l
      的有用行为是通过绝对路径名隐藏文件系统,从而最大限度地减少moutpoint的进一步使用

      通过在要卸载的目录上装载具有权限
      000
      的空目录,可以实现相同的行为

      然后,对装载点下方的文件名的任何新访问都将以零权限命中新覆盖的目录-从而阻止卸载的新阻止程序

      首先尝试重新安装,ro 要解锁的主要卸载成就是只读重新装载。当您获得
      重新装载,ro
      徽章时,您知道:

    • 所有挂起的数据都已写入磁盘
    • 以后的所有写入尝试都将失败
    • 如果需要物理断开设备连接,数据处于一致状态
    • 挂载-o重新挂载,ro/dev/device
      ,所以请直接尝试。你可能觉得很幸运,朋克

      如果你运气不好,只关注:

      lsof+f--/dev/|awk'NR==1 | |$4~/[0-9]+[uw-]/'
      
      然后,您应该能够以只读方式重新安装设备,并确保状态一致

      如果此时无法重新安装只读,请调查列出的其他一些可能原因


      只读重新装载有人提到,如果您正在使用终端,并且当前目录位于要卸载的路径内,则会出现错误。
      作为补充,在这种情况下,要卸载的
      lsof | grep路径必须具有以下输出:

      bash ... path-to-be-unmounted
      
      小众回答:

      如果该设备上有zfs池,至少当它是基于文件的池时,
      lsof
      不会显示使用情况。但你可以直接跑

      sudo zpool导出mypool
      
      然后卸载。

      在文件夹中多次装载 另一个原因可能是主装载文件夹中存在辅助装载,例如,在为嵌入式设备使用SD卡之后:<
      bash ... path-to-be-unmounted
      
      # mount /dev/sdb2 /mnt       # root partition which contains /boot
      # mount /dev/sdb1 /mnt/boot  # boot partition
      
      # umount /mnt
      umount: /mnt: target is busy.
      
      # umount /mnt/boot
      # umount /mnt
      
      $ sudo lsof | grep /dev/sda1
      
      $ sudo lsof | grep /media