Linux文件系統(tǒng)的安裝和卸載
編者按:本文介紹Linux文件系統(tǒng)的安裝和卸載如何控制,以及當(dāng)中需要了解的原理和注意事項。
為了最有效地利用本系列中的文章,您應(yīng)該具有基本的 Linux 知識,并需要準(zhǔn)備一個 Linux 系統(tǒng),用于練習(xí)本文介紹的命令。除非特殊說明,本文中的示例(大部分)使用帶有 2.6.32 內(nèi)核的 Fedora 13。有時候不同版本的程序輸出格式不同,因此您所得到的結(jié)果未必總是與這里所示的清單和圖相同。
您還應(yīng)該熟悉我們的文章 “學(xué)習(xí) Linux,101:創(chuàng)建分區(qū)和文件系統(tǒng)” 中的內(nèi)容。
Linux 文件系統(tǒng)是一個用 / 劃分根目錄的大的目錄樹,但是我們在不同的設(shè)備和分區(qū)上也有文件系統(tǒng)。怎樣解決這一明顯的不一致呢?根(/)文件系統(tǒng)是作為安裝過程的一部分安裝的。您所創(chuàng)建的其他每個文件系統(tǒng)不能用于您的 Linux 系統(tǒng),直至它被安裝在一個掛載點。
在當(dāng)前安裝的文件系統(tǒng)集中,掛載點只是一個路徑,其中設(shè)備上的文件系統(tǒng)被移植到樹中。安裝是使設(shè)備上的文件系統(tǒng)可訪問的一個過程。例如,您可以將文件系統(tǒng)作為 /boot、/tmp 或 /home 安裝到硬盤驅(qū)動上,您也可以將文件系統(tǒng)作為 /mnt/floppy 安裝到軟盤驅(qū)動上,也可以作為 /media/cdrom1 安裝到 CD-ROM 上,正如您所看到的,掛載點可能是在根目錄,或者是更遠的子目錄。
除了分區(qū)、軟盤和 CD 上的文件系統(tǒng)外,還有其他類型的文件系統(tǒng)。tmpfs 文件系統(tǒng)是一個虛擬內(nèi)存文件系統(tǒng)。您也可以使用一個網(wǎng)絡(luò)文件系統(tǒng)(比如,NFS 或 AFS)將文件系統(tǒng)從一個系統(tǒng)安裝到另一個系統(tǒng)。您甚至可以在已有的文件系統(tǒng)上創(chuàng)建一個文件,并格式化為一個文件系統(tǒng)(可能不同),然后安裝。這通常使用光學(xué)媒介映像完成,在這您似乎需要下載一個 ISO CD 或 DVD 鏡像,然后安裝文件,而不是將其刻錄成一個真正的媒體。文件中的交換空間(不是專用交換空間)是另一個示例。
安裝過程實際上是指在某個設(shè)備(或其他資源)上安裝文件系統(tǒng),通常簡稱為 “安裝設(shè)備”,可以理解為 “在設(shè)備上安裝文件系統(tǒng)”。
安裝和卸載文件系統(tǒng)通常需要 root 權(quán)限。如果您作為一個普通用戶登錄,您可以使用 su -
切換到根目錄或者 sudo
。在我們的示例中,當(dāng)命令提示以 # 結(jié)束時,如以下清單 1 所示,您將需要 root 權(quán)限。
mount
命令的基本格式有兩個參數(shù):含有將要安裝的文件系統(tǒng)的設(shè)備(或其他資源)和掛載點。例如,我們在掛載點 /dos 安裝我們的 FAT32 分區(qū) /dev/sda9,如清單 1 所示。
清單 1. 掛載 /dos
[root@echidna ~]# mount /dev/sda9 /dos |
在掛載點上進行安裝之前,必須先要有掛載點存在。如果沒有,您會收到一個錯誤消息,需要創(chuàng)建掛載點或使用另一個掛載點,如清單 2 所示。
清單 2. 安裝錯誤
[root@echidna ~]# mount /dev/sda9 /dos mount: mount point /dos does not exist [root@echidna ~]# mkdir /dos [root@echidna ~]# mount /dev/sda9 /dos |
當(dāng)您在一個已有目錄上安裝一個文件系統(tǒng)時,您將要安裝的文件系統(tǒng)上的文件就變成了掛載點的子目錄和文件。如果掛載點目錄已經(jīng)包含文件或子目錄,它們不會丟失,但是不再可用,直至安裝的文件系統(tǒng)被卸載,方可再次使用。要避免這類問題,一個較好的辦法就是只使用空目錄作為掛載點。
安裝了一個文件系統(tǒng)之后,任何創(chuàng)建或復(fù)制到掛載點或其下的任何目錄的文件或目錄將在安裝的文件系統(tǒng)上被創(chuàng)建。在我們的示例中,文件 /dos/sampdir/file.txt 將被在我們在 /dos 下安裝的 FAT32 文件系統(tǒng)上創(chuàng)建。
通常,mount
命令自動檢測安裝的文件系統(tǒng)的類型。偶爾,您可能需要使用 -t
選項明確指定文件系統(tǒng)類型,如清單 3 所示。
清單 3. 以顯式文件系統(tǒng)類型安裝
[root@echidna ~]# mount -t vfat /dev/sda9 /dos |
想要查看安裝了什么文件系統(tǒng),使用不帶參數(shù)的 mount
命令。清單 4 展示了我們的示例系統(tǒng)。注意,只是簡單的列出安裝的文件系統(tǒng),不需要 root 權(quán)限。
清單 4. 顯示安裝的文件系統(tǒng)
[ian@echidna ~]$ mount /dev/sda6 on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0") /dev/sda2 on /grubfile type ext3 (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) gvfs-fuse-daemon on /home/ian/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=ian) dw.raleigh.ibm.com:/vol/vol1/dwcontent on /mnt/dwcontent type nfs (rw,addr=9.42.155.6) /dev/sdb9 on /mnt/sdb9 type ext3 (rw) /dev/sda9 on /dos type vfat (rw) /dev/sr0 on /media/KNOPPIX type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000 ,iocharset=utf8,mode=0400,dmode=0500) |
您也可以通過顯示 /proc/mounts 或 /etc/mtab 來查看類似信息,這兩個都含有關(guān)于安裝的文件系統(tǒng)的信息。
#p#
安裝選項
mount
命令有幾個覆蓋默認行為的選項。例如,您可以通過指定 -o ro
來安裝一個只讀文件系統(tǒng)。如果文件系統(tǒng)已經(jīng)安裝,添加 remount
,如清單 5 所示。
清單 5. 卸載只讀文件系統(tǒng)
[root@echidna ~]# mount -o remount,ro /dos |
注意:
- 用逗號分隔多個選項,比如
remount
和ro
。 - 卸載一個已有文件系統(tǒng)時,指出掛載點或者設(shè)備名其中一個就足夠了,沒有必要都指出。
- 您不能以讀寫方式安裝一個只讀文件系統(tǒng)。那些不能修改的媒介,比如 CD-ROM 光盤將自動以只讀模式安裝。
- 要卸載一個可寫入的讀寫設(shè)備,指定
-o remount,rw
。
如果任何進程已經(jīng)打開卸載文件系統(tǒng)中的文件或目錄,卸載命令就不能完全成功。在下面 卸載文件系統(tǒng) 部分獲取更多信息
#p#
標(biāo)簽、UUID 和鏈接
在 UNIX 和早期的 Linux 系統(tǒng)中,/dev 目錄通常包含曾經(jīng)附加到系統(tǒng)的所有設(shè)備。曾經(jīng)使用過的設(shè)備都位于 /dev 樹的同一位置,因此使用名稱 /dev/sda6 是自然而然的。隨著熱插拔設(shè)備的出現(xiàn),比如 USB 或 Firewire (IEEE 1394) 附加設(shè)備,今天一個給定的設(shè)備可能出現(xiàn)在一個 USB 端口,明天同一個設(shè)備可能被插到另一個 USB 端口。在這種情況下,無論您將 U 盤插在哪個 USB 端口上,您總是要將它安裝在 /media/myusbstick 上。在主題 102 “學(xué)習(xí) Linux,101:引導(dǎo)程序” 一文中,您已經(jīng)學(xué)習(xí)了如何使用標(biāo)簽和 UUID(全局惟一標(biāo)識符)來識別分區(qū),而不用設(shè)備名。如果分區(qū)中的文件系統(tǒng)這兩個都支持,您也可以通過 mount
命令使用它們。使用 blkid
命令來尋找設(shè)備相關(guān)的 UUID 和標(biāo)簽(如果有)。清單 6 展示了如何使用 blkid
來尋找根分區(qū)的標(biāo)簽和 UUID,如何創(chuàng)建兩個附加掛載點,以及在這兩個附加掛載點上安裝根分區(qū)。以下示例做了說明。在生產(chǎn)環(huán)境中,您通常不需要這么做。
清單 6. 使用標(biāo)簽或 UUID 安裝
[root@echidna ~]# blkid /dev/sda6 /dev/sda6: LABEL="Fedora-13-x86_64" UUID="082fb0d5-a5db-41d1-ae04-6e9af3ba15f7" TYPE="ext4" [root@echidna ~]# mkdir /mnt/sda6label [root@echidna ~]# mkdir /mnt/sda6uuid [root@echidna ~]# mount LABEL="Fedora-13-x86_64" /mnt/sda6label [root@echidna ~]# mount UUID="082fb0d5-a5db-41d1-ae04-6e9af3ba15f7" /mnt/sda6uui |
隨著 udev 的出現(xiàn),您通常在 /dev 目錄下找到設(shè)備(比如硬盤驅(qū)動器)的附加符號鏈接。清單 7 顯示的是 Fedora 13 系統(tǒng)上的 /dev/sda6 鏈接。
清單 7. 到 /dev/sda6 的符號鏈接
[ian@echidna ~]$ find /dev -lname "*sda6" /dev/disk/by-label/Fedora-13-x86_64 /dev/disk/by-uuid/082fb0d5-a5db-41d1-ae04-6e9af3ba15f7 /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0-part6 /dev/disk/by-id/wwn-0x50014ee001a8d027-part6 /dev/disk/by-id/scsi-SATA_WDC_WD1001FALS-_WD-WMATV3772868-part6 /dev/disk/by-id/ata-WDC_WD1001FALS-00J7B1_WD-WMATV3772868-part6 /dev/block/8:6 |
安裝一個設(shè)備時,您也可以使用一個符號鏈接來作為另外一種指定設(shè)備名的方式。
#p#
引導(dǎo)時間和 fstab
在主題 102 “學(xué)習(xí) Linux,101:引導(dǎo)程序” 一文中,您已經(jīng)學(xué)習(xí)了如何在 GRUB 和 LILO 中使用 root=
參數(shù),來通知引導(dǎo)加載程序應(yīng)該安裝什么文件系統(tǒng)作為根。一旦此文件系統(tǒng)被安裝,初始化過程運行帶有 -a
選項的 mount
命令來自動安裝一個文件系統(tǒng)集合。該集合是在 /etc/fstab 中指定的。清單 8 顯示了一個樣例 Fedora 13 系統(tǒng)的 /etc/fstab。在該示例中,所有硬盤驅(qū)動分區(qū)都是用 UUID 標(biāo)識的。清單 9 顯示了另一個 Ubuntu 9.10 系統(tǒng)示例。
清單 8. 示例 Fedora 13 fstab
# # /etc/fstab # Created by anaconda on Fri May 28 12:37:05 2010 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=082fb0d5-a5db-41d1-ae04-6e9af3ba15f7 / ext4 defaults 1 1 UUID=488edd62-6614-4127-812d-cbf58eca85e9 /grubfile ext3 defaults 1 2 UUID=2d4f10a6-be57-4e1d-92ef-424355bd4b39 swap swap defaults 0 0 UUID=ba38c08d-a9e7-46b2-8890-0acda004c510 swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 |
清單 9. 示例 Ubuntu 9.10 fstab
# /etc/fstab: static file system information. # # Use 'blkid -o value -s UUID' to print the universally unique identifier # for a device; this may be used with UUID= as a more robust way to name # devices that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # / was on /dev/sda7 during installation UUID=8954fa66-e11f-42dc-91f0-b4aa480fa103 / ext3 errors=remount-ro 0 1 # /grubfile was on /dev/sda2 during installation UUID=3a965842-b6dd-4d52-8830-2d0fdb4284a2 /grubfile ext3 defaults 0 2 /dev/sda5 none swap sw 0 0 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0 |
以 # 開始的是注釋,記住一行有 6 個字段。因為字段是定位的,必須被指定。
- 文件系統(tǒng)
- 這可能是一個設(shè)備名,比如 /dev/sda1 或者一個標(biāo)簽(LABEL=),或者是 UUID(UUID=)。對于 Fedora 13 示例的根文件系統(tǒng),它可能是 /dev/sda6、LABEL="Fedora-13-x86_64" 或 UUID="082fb0d5-a5db-41d1-ae04-6e9af3ba15f7"。使用一個標(biāo)簽或 UUID,當(dāng)設(shè)備被添加或刪除時可以使您的系統(tǒng)更健壯。
- 掛載點
- 這是我們上面 安裝文件系統(tǒng) 小節(jié)中介紹過的掛載點,其值應(yīng)該是 'none' 或 'swap'。在舊的文件系統(tǒng)中您通常會發(fā)現(xiàn)其值是 'none' 。
- 類型
- 指定文件系統(tǒng)類型。CD/DVD 驅(qū)動器通常只支持 ISO9660 和 UDF 文件系統(tǒng)其中一個,因此您可能要在一個逗號分隔的列表中指定多種可能性,如清單 9 所示。如果您想
mount
自動確定類型,向清單 9 最后一行那樣指定auto
。 - 選項
- 指定安裝選項,如果您想用默認安裝選項,指定
defaults
。您需要了解的選項有:rw
和ro
指定文件系統(tǒng)是以讀寫還是只讀形式安裝。noauto
指定在引導(dǎo)時或者mount -a
出現(xiàn)問題時,該文件系統(tǒng)不能自動安裝。在我們的示例中,這樣做是為了可移動驅(qū)動器。user
指定一個非根用戶被允許安裝或卸載文件系統(tǒng)。這對于移動媒介是特別有用的。在舊系統(tǒng)中,該選項是在 /etc/fstab 中指定的,而不是在mount
命令上。對于比較新的系統(tǒng),可能是在 udev 規(guī)則中指定的,該規(guī)則位于 /lib/udev/rules.d or /etc/udev/rules.d 內(nèi)的 rules 文件夾中。在我的 Fedora 13 系統(tǒng)上 DVD 驅(qū)動器選項是來自于 udev 規(guī)則,這就是為什么在 /etc/fstab 中沒有一項用于光驅(qū)。exec
和noexec
指定是否支持來自已安裝文件系統(tǒng)的文件執(zhí)行。用戶安裝的文件系統(tǒng)默認為noexec
,除非在user
后指定exec
。noatime
將禁止記錄存取時間,不使用訪問時間可以提高性能。
- dump
- 指定
dump
命令是否應(yīng)考慮 ext2 或 ext3 文件系統(tǒng)作為備份。值為 0 則通知dump
忽略該文件系統(tǒng)。 - pass
- 傳遞非零值來指定引導(dǎo)時檢查文件系統(tǒng)的次序,在 “學(xué)習(xí) Linux,101:保持文件系統(tǒng)的完整性” 一文中討論過。
當(dāng)您安裝一個在 /etc/fstab 中列出的文件系統(tǒng)時,您只需給出設(shè)備名或掛載點其中一個,不需要兩個都提供。
在某些系統(tǒng)上,例如 SUSE 11.2,您可能會發(fā)現(xiàn)在安裝時生成的 fstab
使用符號鏈接到設(shè)備。因此,您可以查看 /dev/disk/by-id/ata-WDC_WD1001FALS-00J7B1_WD-WMATV3772868-part6 獲取文件系統(tǒng)值,不需要查看 /dev/sda6。
查閱手冊頁獲取 fstab
、mount
和 udev
其他資料,包括這里沒有涉及到的選項。
#p#
卸載文件系統(tǒng)
所有安裝的文件系統(tǒng),通常是在系統(tǒng)重新引導(dǎo)或關(guān)閉時自動卸載的。當(dāng)一個文件系統(tǒng)卸載后,在內(nèi)存中緩存的所有文件系統(tǒng)數(shù)據(jù)都被刷新到磁盤中。
您也可以手動卸載文件系統(tǒng)。事實上,當(dāng)刪除可寫入介質(zhì)(比如,磁盤、U 盤或存儲鍵)時,您應(yīng)該這樣做。
使用 umount
命令來卸載文件系統(tǒng),指定設(shè)備名或者掛載點作為參數(shù)。清單 10 展示了如何卸載 /dos,然后重新安裝,接著用設(shè)備名再次卸載。
清單 10. 卸載文件系統(tǒng)
[root@echidna ~]# umount /dos [root@echidna ~]# mount /dev/sda9 /dos [root@echidna ~]# umount /dev/sda9 |
當(dāng)一個文件系統(tǒng)被卸載之后,作為掛載點的目錄下的那些文件會再次出現(xiàn)。
如果您想卸載一個文件系統(tǒng),而此時進程已打開了該文件系統(tǒng)上的文件,將會出現(xiàn)一個錯誤消息。卸載文件系統(tǒng)之前,您應(yīng)當(dāng)確認沒有進程正在該文件系統(tǒng)的文件上運行。使用 lsof
或 fuser
命令確定哪個文件是打開的,或哪個進程打開了文件。您可能需要 lsof
上的 -w
選項來避免與 Gnome Virtual File 系統(tǒng)(gvfs)相關(guān)的警告消息。查閱手冊頁,學(xué)習(xí)關(guān)于安裝選項和 lsof
的其他信息。如果您檢查整個設(shè)備,您可以指定設(shè)備名或掛載點。您也可以檢查是否一個獨立的文件正在使用。
為了解釋這些命令,我創(chuàng)建了一個 /etc/fstab on /dos 副本,用一個小的腳本來從 stdin 逐行讀取,然后打印到 stdout,每行之間有 10 秒的停頓。清單 11 顯示了當(dāng)文件正在使用時 umount
出現(xiàn)的錯誤消息,以及使用 lsof
和 fuser
在 /dos 或基礎(chǔ)設(shè)備 /dev/sda9 上檢查打開文件的結(jié)果。
清單 11. 檢查打開文件
[root@echidna ~]# umount /dos umount: /dos: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) [root@echidna ~]# lsof -w /dos COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME slowread. 2560 ian 0r REG 8,9 899 123 /dos/fstab sleep 2580 ian 0r REG 8,9 899 123 /dos/fstab [root@echidna ~]# lsof -w /dev/sda9 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME slowread. 2560 ian 0r REG 8,9 899 123 /dos/fstab sleep 2580 ian 0r REG 8,9 899 123 /dos/fstab [root@echidna ~]# fuser -m /dos /dos: 2560 2586 [root@echidna ~]# fuser -m /dev/sda9 /dev/sda9: 2560 2588 |
這時,您可以選擇等待,直至文件系統(tǒng)不再繁忙,或者您也可以通過指定 -l
選項進行一個懶卸載(lazy unmount)。懶卸載直接從文件系統(tǒng)樹分離文件系統(tǒng),然后,在文件系統(tǒng)空閑時,清理文件系統(tǒng)附加項。
#p#
刪除文件系統(tǒng)
我們談?wù)撨^刪除移動設(shè)備(比如,USB 或 Firewire 附加設(shè)備)時遇到的一些問題。每次您需要安裝或卸載這類設(shè)備時,切換到 root 權(quán)限并不是很方便。CD、DVD 和軟盤驅(qū)動器,在其中您需要卸載設(shè)備來更換媒介,都是一樣。在上一小節(jié)討論 fstab
時,我們就提到過 user
選項,它支持普通用戶安裝或卸載設(shè)備。清單 9 顯示了一種為軟盤驅(qū)動器或 CD/DVD 驅(qū)動器編寫 fstab
的方法。
注意,光驅(qū)的文件系統(tǒng)類型被指定為 udf,iso9660
,而軟驅(qū)的文件系統(tǒng)類型被指定為 auto
。對于光驅(qū),安裝進程將探測文件系統(tǒng)類型。您可以創(chuàng)建或編輯 /etc/filesystems 來改變系統(tǒng)被探測的次序。
注意:在斷開設(shè)備連接或者想要移走媒介之前,您始終應(yīng)該先卸載可移動驅(qū)動。
如果您運行一個圖形化桌面,比如 Nautilus,您通??梢哉业街С挚梢苿釉O(shè)備和媒介自動安裝的選項。例如,我想將 Knoppix DVD 插入我系統(tǒng)的 DVD 驅(qū)動器,我可以看到如清單 12 所示的一個安裝項。出現(xiàn)了 'uid=1000' 表示 id 為 1000 的用戶可以卸載這個磁盤。id
命令顯示用戶 ian 的 uid 是 1000,因此 ian 可以卸載該磁盤。
清單 12. DVD 的桌面卸載
[ian@echidna ~]$ mount | grep sr0 /dev/sr0 on /media/KNOPPIX type iso9660 (ro,nosuid,nodev,uhelper=udisks, uid=1000,gid=1000,iocharset=utf8,mode=0400,dmode=0500) [ian@echidna ~]$ id ian uid=1000(ian) gid=1000(ian) groups=1000(ian) |
如果驅(qū)動器支持這一操作(大多數(shù) CD 和 DVD 驅(qū)動支持),您也可以使用 eject
命令彈出可移動介質(zhì)。如果您不能卸載設(shè)備,那么 eject
將可以卸載和彈出磁盤。
#p#
交換空間
在前面討論 fstab
時,您可能已經(jīng)注意到了交換磁盤沒有一個掛載點,引導(dǎo)進程通常支持在 /etc/fstab 中定義交換空間,除非 noauto
選項被指定。要在一個正在運行的系統(tǒng)上手工控制交換空間 — 比如,添加一個新交換分區(qū) — 使用 swapon
和 swapoff
命令,詳情見手冊頁。
您可以用 cat /proc/swaps
或 swapon -s
查看目前支持的交換設(shè)備,如清單 13 所示。
清單 13. 顯示交換空間
[ian@echidna ~]$ swapon -s Filename Type Size Used Priority /dev/sdb1 partition 514044 0 -1 /dev/sdb5 partition 4192928 0 -2 [ian@echidna ~]$ cat /proc/swaps Filename Type Size Used Priority /dev/sdb1 partition 514044 0 -1 /dev/sdb5 partition 4192928 0 -2 |
介紹在 Linux 上安裝設(shè)備到此結(jié)束。
原文:http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-104-3/index.html?ca=drs-
【編輯推薦】
【責(zé)任編輯:楊賽 TEL:(010)68476606】