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.csdn.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對應文件系統,使用的手段優先級參看本文前面內容

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM