linux服务之nfs

时间:2023-03-10 02:42:50
linux服务之nfs

开发语言:rpc编程环境

服务器端:在linux平台下部署

客户端:一般是cli界面下的mount命令

相关包:rpcbind,nfs-utils

背景

http://nfs.sourceforge.net/
http://linux-nfs.org/wiki/index.php/Main_Page
相关进程

rpc.idmapd - NFSv4 ID <-> Name Mapper
rpc.idmapd is the NFSv4 ID <-> name mapping daemon. rpc.gssd, rpc.idmapd, rpc.svcgssd
用于 NFS v4。除非你需要或使用 NFS v4,否则关闭它。
rpc.statd
/sbin/rpc.statd 命令会启动 statd 后台程序。
在 NFS 环境中 statd daemon 与 lockd daemon 相结合,为锁机制提供 crash 和 recovery 功能。 statd daemon 除负责维护相关的连接信息外,还监控 /var/lib/nfs/statd/sm 目录, /var/lib/nfs/statd/sm.bak 目录和 /var/lib/nfs/statd/state 文件中的状态信息。 statd 通常是在 lockd 之前启动, statd daemon 的启动和停止是通过调用系统的 SRC 命令来实现的。
rpc.rquotad
rquotad is an rpc(3) server which returns quotas for a user of a local filesystem which is mounted by a remote machine over the NFS.
rpc.nfsd - NFS server process nfsd.o kernel module nfs进程运行在服务器端,负责处理远程客户端对本机文件系统的操作。 每一个nfsd进程同时只能处理一个客户端的操作申请,因此在一台nfs服务器上可能会启动多个nfsd进程。 
rpc.mountd
The rpc.mountd server provides an ancillary service needed to satisfy mount requests by NFS clients.
ancillary adj. 辅助的;副的;从属的

在nfs客户端,会用rpc.mountd来连接对方的portmapper(发出连接请求.portmapper接收到请求之后会同rpc.mountd来协商通信端口,之后rpc.mountd会利用端口进行挂载到本地)
mountd 进程是一个远程过程调用 (RPC) ,其作用是对客户端要求安装(mount)文件系统的申请作出响应。mountd进程通过查找 /etc/xtab文件来获知哪些文件系统可以被远程客户端使用。另外,通过mountd进程,用户可以知道目前有哪些文件系统已被远程文件系统装配,并得知远程客户端的列表。查看mountd是否正常启动起来可以使用命令rpcinfo进行查看,在正常情况下在输出的列表中应该象这样的行:
100005 1 udp 1039 mountd
100005 1 tcp 1113 mountd
100005 2 udp 1039 mountd
100005 2 tcp 1113 mountd
100005 3 udp 1039 mountd
100005 3 tcp 1113 mountd The exportfs command is used to maintain the current table of exported file systems for NFS. This list is kept in a separate file named
/var/lib/nfs/xtab which is read by mountd when a remote host requests access to mount a file tree, rpcbind
rpcbind守护进程提供将RPC程序号映射为网络端口号的服务  用rpcinfo -p查看
RPC服务支持 (像 NFS or NIS). 如果没有服务依赖它可以关掉 nfsiod
客户端同样运行一些进程,比如 nfsiod。 nfsiod处理来自NFS的请求。
这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。参考nfsiod(8)手册获得更多信息。
#ps -ef|grep nfs
root      1058     2  0 Jan25 ?        00:00:00 [nfsiod]

rpcinfo -p
rpciod 是连接到对方的nfs上进行io操作的服务进程
nlockmgr是保证在众多的客户连接在进行io操作时数据的一致性,即对正在写操作的文件进行加锁保护
status主要是靠发送封包的形式维持客户与服务器的连接状态
service nfs start启动以后,还会有
nfs,nfs_acl,mountd 服务器必须运行以下服务:
服务 描述
nfsd NFS为来自NFS客户端的请求服务。
mountd NFS挂载服务,处理nfsd(8)递交过来的请求。
rpcbind 此服务允许 NFS 客户程序查询正在被 NFS 服务使用的端口。 要使用 NFS 作为客户机,客户机机器必须要运行 rpc.statd 和 portmap/rpcbind 进程。
相关包及文件

http://blog.****.net/ycnian/article/details/8515517  NFS各个版本之间的比较

#rpm -qa|grep nfs
nfs-utils-lib-1.1.5-6.el6_5.x86_64
nfs-utils-1.2.3-39.el6_5.3.x86_64 #ps -ef|grep iod
root        24     2  0 Jan25 ?        00:00:00 [kseriod]
root      1054     2  0 Jan25 ?        00:00:00 [rpciod/0]
root      1058     2  0 Jan25 ?        00:00:00 [nfsiod] [root@250-shiyan ~]# rpm -qf /usr/sbin/rpcinfo
rpcbind-0.2.0-11.el6.x86_64
[root@250-shiyan ~]# rpm -ql rpcbind
/etc/rc.d/init.d/rpcbind
/sbin/rpcbind
/usr/sbin/rpcinfo
/usr/share/doc/rpcbind-0.2.0
/usr/share/doc/rpcbind-0.2.0/AUTHORS
/usr/share/doc/rpcbind-0.2.0/ChangeLog
/usr/share/doc/rpcbind-0.2.0/README
/usr/share/man/man8/rpcbind.8.gz
/usr/share/man/man8/rpcinfo.8.gz
/var/cache/rpcbind
[root@250-shiyan ~]# which rpcgen  rpc编译器
/usr/bin/rpcgen
[root@250-shiyan ~]# rpm -qf /usr/bin/rpcgen
glibc-common-2.12-1.132.el6.x86_64
/var/lib/mysql
/var/lib/yum
/var/lib/rpm
/var/lib/nfs /var/lib/nfs/etab 里面记录了配置文件的详细内容
/var/lib/nfs/rmtab 里面记录了那些客户端挂载过服务端的共享目录 配置文件/etc/exports 相关命令
exportfs,showmount,nfsstat,rpcinfo,netstat
exportfs -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo。
选项用来设置输出目录的访问权限、用户映射等。NFS主要有3类选项: 访问权限选项
设置输出目录只读:ro
设置输出目录读写:rw 用户映射选项
all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash:与all_squash取反(默认设置);
root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash:与rootsquash取反;
anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx); 其它选项
secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘,加上这个参数拷贝文件时候会很快;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
普通,常规问题

[root@cache ~]# mount -t nfs 172.16.1.18:/root/so/172.16.1.42 /mnt
mount: wrong fs type, bad option, bad superblock on 172.16.1.18:/root/so/172.16.1.42,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)
In some cases useful info is found in syslog - try
dmesg | tail or so yum install nfs-utils 客户端挂载时也需要安装此包,不然会报上面的错 [root@cache ~]# mount 172.16.1.18:/root/so/172.16.1.42 /mnt
mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified service rpcbind start 即可解决问题或者加-o nolock
mount -o nolock 172.16.1.18:/root/so/172.16.1.42 /mnt [root@cache ~]# mount 172.16.1.18:/root/so/172.16.1.42 /mnt
mount.nfs: access denied by server while mounting 172.16.1.18:/root/so/172.16.1.42 修改/etc/sysconfig/nfs文件,将
# Turn off v2 and v3 protocol support
# RPCNFSDARGS="-N 2 -N 3"
# Turn off v4 protocol support
# RPCNFSDARGS="-N 4" /*把这句话的#号去掉*/
NFS分为三个版本,即NFS-2 NFS-3 NFS-4,该配置文件默认关闭了这三个的NFS版本,我们只需要打开NFS-4即可。 共享权限问题(是在设定输出目录时的权限 /nfs *(rw,))
目录权限问题(是目录本身的权限 chmod 777 /nfs)
使用touch创建文件时,怎么报“Permission denied”或“权限不够”错误?
这里出现Permission denied,是因为NFS服务器端共享的目录本身的写权限没有开放给其他用户,在服务器端打开该权限。
chmod 757 -R /home/david/ 属主,属组问题
NFS有很多默认的参数,打开/var/lib/nfs/etab 查看分享出来的/mnt/db完整权限设定值。
默认就有sync,wdelay,hide 等等,no_root_squash 是让root保持权限,root_squash 是把root映射成nobody,no_all_squash 不让所有用户保持在挂载目录中的权限。所以,root建立的文件所有者是nfsnobody。
下面我们使用普通用户挂载、写入文件测试。
普通用户写入文件时就是自己的名字,这也就保证了服务器的安全性。
  关于权限的分析
  1. 客户端连接时候,对普通用户的检查
    a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;
    b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;
    c. 如果没有明确指定,也没有同名用户,那么此时用户身份被压缩成nfsnobody;
  2. 客户端连接的时候,对root的检查
    a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;
    b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;
    c. 如果没有明确指定,此时root用户被压缩为nfsnobody;
    d. 如果同时指定no_root_squash与all_squash 用户将被压缩为nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组; 选项配置错误问题
http://www.spinics.net/lists/linux-nfs/msg04385.html
http://comments.gmane.org/gmane.linux.nfs/46498 下面的报错是由于vi /etc/exports中的配置引起的,fsid不要相同
# vi /etc/exports
/data/primary *(rw,fsid=1,async,no_root_squash,no_subtree_check)
/data/secondary *(rw,fsid=1,async,no_root_squash,no_subtree_check) tail -f /var/log/messages
Mar 21 18:08:23 nfs rpc.mountd[1407]: authenticated mount request from 192.168.1.94:971 for /secondary (/secondary)
Mar 21 18:08:23 nfs rpc.mountd[1407]: /home/primary and /secondary have same filehandle for *, using first
Mar 21 18:08:39 nfs rpc.mountd[1407]: authenticated mount request from 192.168.1.94:905 for /home/primary (/home/primary)
Mar 21 18:09:49 nfs rpc.mountd[1407]: refused mount request from 192.168.1.94 for /home (/): not exported
Mar 21 18:09:49 nfs rpc.mountd[1407]: refused mount request from 192.168.1.94 for /home (/): not exported
三种标识问题,(看上面的相关选项设置)
nobody
nfsnobody
1000 centos6.5-64-minimal
nfs-server
192.168.2.250 [root@250-shiyan wo]# id
uid=0(root) gid=0(root) groups=0(root) [root@250-shiyan home]# service nfs start
[root@250-shiyan home]# mkdir wo
[root@250-shiyan home]# ll
total 12
drwxr-xr-x 3 root root 4096 Feb 4 10:47 wo
[root@250-shiyan home]# cat /etc/exports
/home/wo *(rw)
[root@250-shiyan home]# exportfs -rv
[root@250-shiyan wo]# mkdir tt
[root@250-shiyan wo]# ll
total 4
drwxr-xr-x 2 root root 4096 Feb 4 10:47 tt nfs-client
192.168.2.84 [root@84-monitor cc]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [root@84-monitor home]# mount 192.168.2.250:/home/wo /home/cc/
[root@84-monitor cc]# ll
total 4
drwxr-xr-x. 2 root root 4096 Feb 4 10:47 tt
[root@84-monitor cc]# mkdir ff
mkdir: cannot create directory `ff': Permission denied 问题1:无权限的问题解决,看下面。
[root@250-shiyan home]# chmod 757 wo
[root@250-shiyan home]# ll
total 12
drwxr-xr-x. 2 root root 4096 Oct 31 12:08 flt
drwxr-xrwx. 11 root root 4096 Dec 4 15:19 se
drwxr-xrwx 3 root root 4096 Feb 4 10:47 wo [root@84-monitor cc]# mkdir ff
[root@84-monitor cc]# ll
total 8
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Feb 4 11:02 ff
drwxr-xr-x. 2 root root 4096 Feb 4 10:47 tt 换成test用户
[test@84-monitor cc]$ id
uid=500(test) gid=500(test) groups=500(test) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[test@84-monitor cc]$ mkdir dd
[test@84-monitor cc]$ ll
total 12
drwxrwxr-x. 2 nobody nobody 4096 Feb 4 11:20 dd
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Feb 4 11:02 ff
drwxr-xr-x. 2 root root 4096 Feb 4 10:47 tt 此时查看nfs-server
[root@250-shiyan nfs]# pwd
/var/lib/nfs
[root@250-shiyan nfs]# cat etab
/home/wo *(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
/home/se *(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534) ###增加all_squash选项。客户端创建文件或目录就成为nfsnobody了。
[root@250-shiyan nfs]# cat /etc/exports
/home/wo *(rw,all_squash) [test@84-monitor cc]$ mkdir jj
[test@84-monitor cc]$ ll
total 16
drwxrwxr-x. 2 nobody nobody 4096 Feb 4 11:20 dd
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Feb 4 11:02 ff
drwxrwxr-x. 2 nfsnobody nfsnobody 4096 Feb 4 13:37 jj
drwxr-xr-x. 2 root root 4096 Feb 4 10:47 tt
自动挂载问题

有时候开机时在start NFS这一步会停很长的时间,这个问题的原因是因为每次客户端mount过NFS而又没有正常umount后,在/var/lib/nfs/rmtab里会留下记录,每次NFS启动的时候都会去check以前的IP,如果不通,要等到timeout才行。我cat rmtab看了一下,hoho,从上海,konka,TCL,Changhong用过的IP都在里面记着,难怪慢的象蜗牛一样!删了后试了一下,马上就起来了!

1.发现手动挂载nfs是正常的,说明portmap服务是好的,使用/etc/init.d/netfs status查看状态,也能看到需要挂载的路径,而且执行/etc/init.d/netfs start看到nfs路径是可以被挂载的。由此说明netfs服务也是正常的。
2.查看一下/etc/rc.d/rc3.d下面的启动脚本,如下
S10network
S12syslog
S13irqbalance
S13iscsi
S13portmap
S22messagebus
S25netfs
S28autofs
由此看到,netfs服务是在portmap的后面启动,同样也是在network的后面启动的,所以应该不会是服务启动顺序的问题。
3.如果nfs服务器的ip地址和要挂载的ip不在一个网段,服务器是10网段,nfs是192网段的。就必须在启动服务器的时候添加路由。
有两种方式自动添加路由
1,使用rc.local文件
2,使用static-routes文件
问题就是使用第一种方式的时候不能自动挂载,但使用第二种方式的时候就可以自动挂载。后来全都改成第二种方式,问题迎刃而解,服务器重启后可以自动挂载nfs了。
注:很多人都会遇到使用了fstab文件后,写好的NFS配置,在重启后却没有自动挂载的情况,首先要检查的是portmap服务是否设置了自动启动,还有另外一个关键的服务就是netfs 总结:
按照linux启动的顺序,rc.local里面的内容是在linux所有服务都启动完毕,最后才被执行的,也就是说,这里面的内容是在netfs之后才被执行的,那也就是说在netfs启动的时候,服务器上的静态路由是没有被添加的,所以netfs挂载不能成功。
static-routes文件又是什么呢,这个是network脚本执行时调用的一个文件,这个文件的放置在/etc/sysconfig目录下,在network脚本(/etc/init.d/network)中的位置是:
151 # Add non interface-specific static-routes.
152 if [ -f /etc/sysconfig/static-routes ]; then
153 grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
154 /sbin/route add -$args
155 done
156 fi
从这段脚本可以看到,这个就是添加静态路由的方法,static-routes的写法是
any net 192.168.0.0/16 gw 网关ip
这样的话,在启动network脚本的时候路由就自动添加上了,又因为network是在netfs前面启动的,自然在挂载nfs的时候就正常了。
这样看来,如果需要添加静态路由,使用static-routes文件要比使用rc.local好,而且当改变了网络配置,需要重启network脚本的时候,相应的静态路由是可以自动添加上的,但这时如果使用rc.local的话,在重启network服务的时候,原本添加好的静态路由就消失了。 如果使用手工mount的方法访问一个NFS共享,重新启动系统后这个文件系统必须mount才可以使用, Red Hat Enterprise Linux提供了两种方法来自动的挂载远程文件系统。/etc/fstab和autofs服务. 方法一,/etc/fstab
netfs服务会使用文件/etc/fstab作为参考, 所以像NFS共享的会被自动执行。
server1.example.com:/share/directory /mnt/share nfs defaults 0 0 方法二,autofs 服务
使用/etc/fstab的一个缺点是:不管用户访问NFS的次数和时间,系统总是会使用资源来维护这个NFS挂载。虽然对于一两个NFS挂载的时候这不是问题,但是如果系统在维护很多NFS挂载的时候,系统性能会受到影响,一个替代方法就是使用基于kernel的自动挂载工具:他可以在需要的时候自动的挂载NFS。
[root@host02 /]# service autofs status
autofs 服务会根据/etc/auto.master文件来控制自动挂载命令:automount的命令可以更加方便的指定挂载点,主机名, 输出目录等等。
autofs的配置文件以父-子关系来组织,主配置文件(/etc/auto.master) 列出了所有的挂载点,然后他会连接到一个特定的映射类型, 这个类型可以是配置文件,程序, NIS映射或者其他挂载方式,auto.master文件包含了如下内容。
cat /etc/auto.master
<mount-point> <map-type>
<mount-point>用于指定本地挂载点,<map-type>指定如何挂载,最通常的NFS挂载做法是使用一个文件,这个文件通常命名成auto.<mount-point>, <mount-point>是在auto.master指定的挂载点,一个NFS类型的auto.<mount-point>的内容如下:
</local/directory> -<options> <server>:</remote/export>
使用本地挂载点替换 </local/directory;> ,该目录必须手动创建。
可以使用nfs的选项替换 <options> ,多个选项之间使用“,”分开,如果需要更多的信息查看man fstab. 确定在options列表前使用了符号"-"。
使用你的NFS服务器替换如上的 <server> ,
使用NFS服务器的输出路径替换如上的 </remote/export>
autofs配置文件可以用于很多中挂载方式和不同的文件系统上,特使是在NFS的挂载上特别有用,举例来说,有些单位把所有的/home目录集中于一台NFS服务器上, 然后在每个节点上配置auto.master指向auto.home,使得每个节点都可以通过autofs挂载/home目录。所有的用户都可以在任何一台工作站*问自己/home/下的的数据和配置文件,该案中的auto.master看起来会像如下所示。
/home /etc/auto.home
这个文件设置了/home/挂载点被配置到了/etc/auto.home文件上,auto.home看起来应该如下:
* -fstype=nfs,soft,intr,rsize=8192,wsize=8192,nosuid,tcp server.example.com:/home
这个文件显示了如果用户所要访问/home下的一个目录,它应该产生一个到nfs.example.com的NFS mount, mount的选项说明了每个/home下的目录都会使用各自的设定. 如果需要更多的mount选项信息
文件系统只读问题

1.
当文件系统变因为Detected aborted journal时filesystem read-only的解决方法
真麻烦,一个机器有4个7T的存储中有二个存储有问题,用fsck修复了三次,都没有反应。用着用着就提示下面的出错
EXT3-fs error (device sdh1): ext3_journal_start_sb: Detected aborted journal
Remounting filesystem read-only
EXT3-fs error (device sdh1): ext3_lookup: unlinked inode 67584015 in dir #6758401
然后使用着那个挂的分区就变成只读read-only.
后来找到了e2fsck,还是蛮不错的。最少他能修复。先备份数据,再做修复
备份
卸载 #umount /dev/sdg1
修复 #e2fsck -y /dev/sdg1
这样,但1T的文件大约需要1个小时,我花了6个小时才检查修复完6T。
象这样的文件系统坏,出现问题,要从二个方面入手,一个是软件,一个是硬件。
1.查看日志,dmesg和tail -f /var/log/messages
2.要看日志检查相关的内容和软硬件
3.还没有结果就google看看有没有人和你一样出现这个问题。看看别人是怎么处理。
4.换硬件。比如RAID卡之类。 2.
备份该硬盘上的数据库,修改相关路径。删除相关relay.log,再启动start slave 。一切正常。备份数据库已经运行,现在看能不能修复硬盘了。硬盘是使用时间不长,读写也不是很频繁,希望能使用fsck修复。
卸载 #umount /dev/sda1
修复 #fsck /dev/sda1
修复完后,可能需要重启一下,reboot
很庆幸,修复成功,如果fsck修复不成功,则可能是硬盘硬件问题,所以操作之前必须备份
中间遇到的问题:
1 我卸载分区后,再挂载,似乎可以写了文件了,message中出现下面日志
2 虽然正常,但是硬盘应该还是有错误,所以建议用e2fsck修复。
3 1T的硬盘fsck花掉20分钟,时间比较长,耐心等待。
4 挂载成功 /dev/sda1 917G 244G 628G 28% /disk3
5 挂载成功显示的message
Dec 6 01:45:13 backup kernel: kjournald starting. Commit interval 5 seconds
Dec 6 01:45:13 backup kernel: EXT3 FS on sda1, internal journal
Dec 6 01:45:13 backup kernel: EXT3-fs: mounted filesystem with ordered data mode.
6掉电真的很危险,备份很重要(即使是备份库,也很麻烦,心惊胆战) 3.
redhat 4 update 1,其中/dev/sdb1是磁盘阵列,开机自动挂载在/raid3目录上。1.9T,目前使用了1.3T。
几天前使用中突然变成只读了,重启以后恢复正常。
今天dd测试,第一次做个5G的文件,通过,再做一次的时候报类似
EXT3-fs error (device sdb1): ext3_journal_start_sb: Detected aborted journal
kernel: ext3_abort called.
然后就被自动remount成只读的了。
尝试mount -o rw,remount /dev/sdb1,报错:
mount: block device /dev/sdb1 is write-protected, mounting read-only
ext3_abort called.
EXT3-fs abort (device /dev/sdb1 ): ext3_remount: Abort forced by user
也无法umount,一直报设备busy。
目前没有重启,估计原来重启好了的原因是系统执行了fsck,搜以前的帖子基本都是fsck修复的。
这是个内核bug,我在redhat的bug库里面看到过。
这种情况通常都是由于系统发现磁盘硬件故障或文件系统中文件被损坏之后而采取的保护机制导致的。为了保护数据不破坏分区中已有内容,Linux在挂载文件系 统时就只用read-only只读方式加载了。至于挂载的文件系统为什么会莫名地变成以只读方式挂载的具体原因,这就不知道了。可能的原因有:
系统文件损坏,磁盘有坏道,fstab文件配置错误,如分区格式错误(将ntfs写成了fat),配置指令拼写错误等。
如果能够确认数据和系统的文件没有被损坏,修复fstab文件配置后只要重新R/W加载或reboot就能够恢复正常。
以读写方式重新挂载文件系统
mount -o remount rw /
如果机器上有重要文件,在重新加载文件系统前可以用scp命令将其备份到远程主机上:
scp -r import_dir/import_file user@host:backup_dir
之所以使用scp -r命令备份重要目录/文件到远程主机上,而不用tar命令打包压缩后再传输,因为在用tar命令打包压缩文件/目录时会涉及到写磁盘操作,这会引起Read-only file system的错误。
如果是文件系统有问题,那就需要在umount状态下执行fsck命令来检查文件系统并修复文件系统中的错误。
nohup fsck -y /dev/VolGroup00/LogVol00 > /dev/shm/fscklog & # 检查好后重启 reboot 4.
最近一台服务器不定期出现整个文件系统只读状态的问题。
从网上种种资料来看,可能是ext4本身的一个bug导致。
有一个解决办法,禁用NCQ,
vi /etc/default/grub
修改或者添加如下代码:
GRUB_CMDLINE_LINUX="libata.force=noncq" Apr 17 17:25:21 rac02 mountd[5403]: Caught signal 15, un-registering and exiting.
Apr 17 17:26:13 rac02 kernel: EXT3-fs warning: mounting fs with errors, running e2fsck is recommended
Apr 17 17:26:13 rac02 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Apr 18 16:57:06 rac02 mountd[5509]: refused mount request from 192.168.2.100 for /fileserver/ (/): not exported
Apr 18 17:01:44 rac02 mountd[5509]: refused mount request from 192.168.2.100 for /fileserver/ (/): not exported
Apr 18 17:06:10 rac02 mountd[5509]: authenticated mount request from 192.168.2.100:907 for /fileserv (/fileserv)
Apr 18 17:08:42 rac02 mountd[5509]: authenticated mount request from 192.168.2.101:821 for /fileserv (/fileserv)
Apr 18 17:20:48 rac02 mountd[5509]: authenticated mount request from 192.168.2.10:828 for /fileserv (/fileserv)
Apr 18 17:24:53 rac02 kernel: Remounting filesystem read-only
Apr 18 17:44:03 rac02 mountd[5509]: Caught signal 15, un-registering and exiting.
Apr 18 17:46:49 rac02 mountd[20015]: authenticated unmount request from 192.168.2.10:621 for /fileserv (/fileserv)
Apr 18 17:46:58 rac02 mountd[20015]: authenticated mount request from 192.168.2.10:732 for /fileserv (/fileserv) 发生只读情况时
[root@rac01 VM]# ll
total 32
drwxr-xr-x 2 nfsnobody nfsnobody  4096 Nov 27 16:22 080-login-back
drwxr-xr-x 2 nfsnobody nfsnobody  4096 Nov 26 17:05 081-vcenter
drwxr-xr-x 2 nfsnobody nfsnobody  4096 Nov 27 16:03 109-comecs
drwx------ 2 root      root      16384 Nov 24 16:56 lost+found
drwxr-xr-x 6 nfsnobody nfsnobody  4096 Nov 28 13:44 soft
[root@rac01 VM]# mkdir f
mkdir: cannot create directory `f': Read-only file system
[root@rac01 VM]# showmount -a以下是挂载的历史记录
All mount points on rac01:
192.168.2.100:/fileserv
192.168.2.10:/fileserv
192.168.2.80:/VM
192.168.2.91:/VM
192.168.2.92:/VM
192.168.2.93:/VM
如下面所述
不能卸载问题,重挂与卸载流程(正确顺序)
先在所有客户端上卸载挂载点,然后再停nfs,再在2.2的源上卸载挂载点,最后运行e2fsck
lsof /dev/sdb1
fuser -m /dev/sdb1
service nfs stop
umount /dev/sdb1
e2fsck -y /dev/sdb1
再重新在源上挂载,再启动nfs,再在客户端上挂载
mount /dev/sdb1 /fileserv
service nfs start
mount 192.168.2.2:/fileserv /mnt/fileserver [root@rac02 /]# mount 192.168.2.2:/fileserv /mnt/fileserver/
[root@rac02 /]# mount 192.168.2.2:/fileserv /var/www/html/upfile/ 下面的这个信息有些矛盾
[root@rac01 /]# mount /dev/sdb1 /fileserv/
mount: /dev/sdb1 already mounted or /fileserv/ busy
[root@rac01 /]# umount /dev/sdb1
umount: /dev/sdb1: not mounted # mount /dev/hdb1 /mnt/fat32/
mount: /dev/hdb1 already mounted or /mnt/fat32/ busy
原因是应该挂载的是LVM做的LV ,而不是实际的硬盘 [root@rac02 /]# mount /dev/sdb1 /fileserv/
mount: /dev/sdb1 already mounted or /fileserv/ busy
mount: according to mtab, /dev/sdb1 is mounted on /fileserv
[root@rac02 /]# umount /fileserv/
umount: /fileserv: device is busy
umount: /fileserv: device is busy
[root@rac02 /]# lsof|grep fileser
[root@rac02 /]# fuser -m -v /fileserv/ 查看哪个进程在使用目录
fuser -m /dev/sdb1
查看一下是否sdb1正在被使用,或是有进程正在使用它。
然后fuser -km /dev/sdb1
强制杀掉所有使用/dev/sdb1目录的进程。
最后umount /dev/sdb1或是umount /fileserv。
再试着mount /dev/sdb1 /fileserv。
umount相关重要参数:
-a 删除fstab中所有的文件系统
-f 强制umount,主要针对不可达的NFS,这个应该是有风险,大家慎用,毕竟强扭的瓜不甜的哦。
-l 懒惰模式,先删除文件系统层次。等文件系统不忙的时候清空所有连接。
参数使用顺序:
umount /aaa
umount -l/aaa
umount -f/aaa
总结问题处理思路
文件系统只读的问题还是比较常见的,作为一个老手,处理思路最好心中有数,才可以处变不惊。
1)确保所有用户都已经退出挂载点目录,退出占用该目录的应用程序,尤其是自己
2)fuser或lsof查看还有什么僵死进程占用,kill掉
3)umount对应文件系统,使用的手段优先级参看本文前面内容