在Linux系统中,如使用存储链路抖动或远程数据传输到本地未及时交互完成 都可能会出现磁盘只读的情况,当然本文所概述的只针对磁盘分区只读,针对系统所有目录只读则无法使用指令修复,需重启OS。
针对单个分区只读,我们一般停好应用程序后,umout 该目录,然后对该目录做修复工作。但Linux 下 umount 挂载分区或者移动硬盘的时候,经常会出现 “Device is busy” 的提示,其实主要是因为系统中还有程序在霸占着设备上的文件,如果冒然强制卸载,可能会导致数据丢失和设备损坏,“Device is busy” 是一种保护措施。
既然知道是有程序霸占,找出这个程序再处理一下就好了。 fuser 这个小程序可以派上用场,基本上每个发行版都会带有 fuser 这个工具。
fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息。
假设无法卸载的设备为 /media/USB,运行下列命令即可:
$ fuser -m -v /media/USB/
用户 进程号 权限 命令
/media/BAK/: galeki 335 ..c.. gqview
-m 参数显示所有使用指定文件系统的进程,后面可以跟挂载点,或是dev设备 ( Thanks lisir :),-v 参数给出详细的输出,可以看出,原来是 gqview 这个程序还在霸占着移动设备,fuser 还给出了程序的进程号,知道了进程号,你就可以随便怎么处置这个程序了。
另外你也可以添加一个 -k 参数:
fuser -m -k /media/USB/
这招自动把霸占着 /media/USB/ 的程序杀死。如果你不是很明确是否要杀死所有霸占设备的程序,你还可以加一个 -i 参数,这样每杀死一个程序前,都会询问:
$ fuser -m -v -i -k /media/BAK/
用户 进程号 权限 命令
/media/BAK/: galeki 3
在查找的同时,你还可定指定一些参数,比如:
-k
杀死这些正在访问这些文件的进程。除非使用-signal修改信号,否则将发送SIGKILL信号。
-i
交互模式
-l
列出所有已知的信号名称。
-n 空间,选择不同的名字空间,可是file,udp,tcp。默认是file,也就是文件。
-signal 指定发送的信号,而不是缺省的SIGKILL
-4
仅查询IPV4套接字
-6
仅查询IPV6套接字
-
重置所有的选项,将信息设回SIGKILL
同时也可以尝试强制卸载目录:
[root@ ~]# umount -f /web
# Force unmount用来强制卸载网络断开无法访问unreachable的nfs文件系统
[root@ ~]# umount -l /isodevices # Lazy unmount卸载硬盘安装系统时的iso系统文件
在卸载完目录后,不要急着马上挂载使用,还需对磁盘进行修复, 这时就需要用到fsck指令:
fsck -y /dev/VolGroup00/home
#修复一下/home目录,注意是修复的是磁盘块而不是目录
mount -a