# 練習 19:文件系統:掛載,`mount`,`/etc/fstab`
> 原文:[Exercise 19. Filesystems: mounting, mount, /etc/fstab](https://archive.fo/9OnRm)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
我希望你熟悉分區的概念。如果沒有,我會簡要介紹一下。首先引用自維基百科:
> 磁盤分區是一種行為,將硬盤驅動器分為多個邏輯存儲單元,它們被稱為分區,來將一個物理磁盤驅動器視為多個磁盤。
看一看:
```
user1@vm1:~$ sudo parted /dev/vda
GNU Parted 2.3
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit GB
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 17.2GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 0.00GB 13.3GB 13.3GB extended
5 0.00GB 1.02GB 1.02GB logical ext3 boot
6 1.03GB 2.05GB 1.02GB logical linux-swap(v1)
7 2.05GB 3.07GB 1.02GB logical ext3
8 3.07GB 5.12GB 2.05GB logical ext3
9 5.12GB 9.22GB 4.09GB logical ext3
10 9.22GB 13.3GB 4.09GB logical ext3
(parted)
```
這是一個物理硬盤,分為 7 個不同的分區。這樣做的原因很多,但最好被理解為“分治”原則的應用。以這種方式分割時,流氓程序不能通過占用所有磁盤空間,使整個服務器崩潰,該程序將限制在其分區中。我不會再談論磁盤分區,但是我會繼續關注文件系統,再次引用[維基百科](http://en.wikipedia.org/wiki/File_system):
> 文件系統是一種組織數據的手段。通過提供存儲,檢索和更新數據的過程,以及管理包含它的設備上的可用空間,數據預期在程序終止后保留。文件系統以有效的方式組織數據,并根據設備的特定特性進行調整。在操作系統和文件系統之間,通常存在緊耦合。一些文件系統提供了機制來控制數據和元數據的訪問。確保可靠性是文件系統的主要職責。一些文件系統允許多個程序幾乎同時更新同一個文件。
> 類 Unix 操作系統創建一個虛擬文件系統,這使得所有設備上的所有文件似乎都存在于單個層次結構中。這意味著,在這些系統中,有一個根目錄,系統上存在的每個文件位于它下方的某個地方。類 Unix 系統可以使用 RAM 磁盤或網絡共享資源作為其根目錄。
這意味著,所有文件系統都集成在一個大樹中。對于熟悉 Microsoft Windows 的人來說,這意味著比起`C:\`和`D:\`等盤符,這種命名方案有一個單獨的根,`/`,所有其他分區都連接到它上面。將文件系統連接到現有目錄的過程稱為掛載。連接文件系統的目錄稱為掛載點。同樣,看一看:
```
user1@vm1:~$ mount
/dev/vda5 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/vda10 on /home type ext3 (rw)
/dev/vda7 on /tmp type ext3 (rw)
/dev/vda9 on /usr type ext3 (rw)
/dev/vda8 on /var type ext3 (rw)
```
這是我之前展示給你的相同分區,你可以在這個列表中看到掛載點。不以`/dev/vda`開頭的是虛擬文件系統,它允許訪問不同的系統設施,但它們和此練習無關。現在我們來看看`/etc/fstab`文件:
```
user1@vm1:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' 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/vda5 during installation
UUID=128559db-a2e0-4983-91ad-d4f43f27da49 / ext3 errors=remount-ro 0 1
# /home was on /dev/vda10 during installation
UUID=32852d29-ddee-4a8d-9b1e-f46569a6b897 /home ext3 defaults 0 2
# /tmp was on /dev/vda7 during installation
UUID=869db6b4-aea0-4a25-8bd2-f0b53dd7a88e /tmp ext3 defaults 0 2
# /usr was on /dev/vda9 during installation
UUID=0221be16-496b-4277-b131-2371ce097b44 /usr ext3 defaults 0 2
# /var was on /dev/vda8 during installation
UUID=2db00f94-3605-4229-8813-0ee23ad8634e /var ext3 defaults 0 2
# swap was on /dev/vda6 during installation
UUID=3a936af2-2c04-466d-b98d-09eacc5d104c none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
```
看起來很恐怖,但讓我們選取一行:
```
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=128559db-a2e0-4983-91ad-d4f43f27da49 / ext3 errors=remount-ro 0 1
```
按照字段將其拆開。
```
UUID=128559db-a2e0-4983-91ad-d4f43f27da49 # Filesystem to mount. This UUID is synonim for /dev/vda5
/ # This is root filesystem, mount it to /
ext3 # This is ext3 filesystem. There are many different filesystems out there
errors=remount-ro # If any errors encountered during mounting filesystem should be remounted read-only
0 # This filesystem should not be backed up by dump utility
1 # This filesystem should be checked first by fsck utility
```
和之前一樣,這些信息可以通過`man fstab`提供給你。現在我將向你展示使用現有文件系統的幾個命令:
+ `mount` - 打印出所有已掛載的文件系統。
+ `mount -a` - 掛載`/etc/fstab`中描述的所有文件系統。
+ `mount /dev/sda<N> /<mount point>` - 掛載分區。
+ `umount /dev/sda<N> /<mount point>` - 解除掛載分區。
+ `mount -h` - 打印出使用`mount`的簡短幫助。
+ `fsck` - 檢查分區是否有錯誤。
+ `blkid` - 打印出唯一的分區標識符。
現在,你將學習如何列出已安裝的分區,掛載和解除掛載它們。
## 這樣做
```
1: cat /etc/fstab
2: mount
3: sudo blkid
4: sudo umount /tmp
5: mount
6: sudo fsck /tmp
7: sudo mount -a
8: mount
```
## 你會看到什么
```
user1@vm1:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' 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/sda1 during installation
UUID=05d469bb-dbfe-4d5a-9bb2-9c0fe9fa8577 / ext3 errors=remount-ro 0 1
# /home was on /dev/sda9 during installation
UUID=a1b936a0-df38-4bf5-b095-6220ffdfc63c /home ext3 defaults 0 2
# /tmp was on /dev/sda8 during installation
UUID=d0a86453-0dbb-4f33-a023-6c09fe9fa202 /tmp ext3 defaults 0 2
# /usr was on /dev/sda5 during installation
UUID=b9544cbb-cdb6-4f3b-89e7-a339f52bfac7 /usr ext3 defaults 0 2
# /var was on /dev/sda6 during installation
UUID=e15e713b-5850-4bc3-b99e-ab6f1d037caa /var ext3 defaults 0 2
# swap was on /dev/sda7 during installation
UUID=4d516f09-80ff-4956-8a75-e9757697f6b1 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
user1@vm1:~$ mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda9 on /home type ext3 (rw)
/dev/sda5 on /usr type ext3 (rw)
/dev/sda6 on /var type ext3 (rw)
/dev/sda8 on /tmp type ext3 (rw)
/dev/sda8 on /tmp type ext3 (rw)
user1@vm1:~$ sudo blkid
/dev/sda1: UUID="05d469bb-dbfe-4d5a-9bb2-9c0fe9fa8577" TYPE="ext3"
/dev/sda5: UUID="b9544cbb-cdb6-4f3b-89e7-a339f52bfac7" TYPE="ext3"
/dev/sda6: UUID="e15e713b-5850-4bc3-b99e-ab6f1d037caa" TYPE="ext3"
/dev/sda7: UUID="4d516f09-80ff-4956-8a75-e9757697f6b1" TYPE="swap"
/dev/sda8: UUID="d0a86453-0dbb-4f33-a023-6c09fe9fa202" TYPE="ext3"
/dev/sda9: UUID="a1b936a0-df38-4bf5-b095-6220ffdfc63c" TYPE="ext3"
user1@vm1:~$ sudo umount /tmp
user1@vm1:~$ mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda9 on /home type ext3 (rw)
/dev/sda5 on /usr type ext3 (rw)
/dev/sda6 on /var type ext3 (rw)
user1@vm1:~$ sudo fsck /tmp
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
/dev/sda8: clean, 11/61752 files, 13973/246784 blocks
user1@vm1:~$ sudo mount -a
user1@vm1:~$ mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda9 on /home type ext3 (rw)
/dev/sda5 on /usr type ext3 (rw)
/dev/sda6 on /var type ext3 (rw)
/dev/sda8 on /tmp type ext3 (rw)
user1@vm1:~$
```
## 解釋
1. 打印你的`/etc/fstab`文件的內容,它包含分區信息以及掛載位置。
1. 打印當前已掛載的分區。
1. 打印系統中所有分區的 UUID。
1. 解除掛載`/tmp`分區,以便你可以檢查它。
1. 再次打印出當前已掛載的分區。`/tmp`現在不存在于此列表中。
1. 檢查`/tmp`分區是否有錯誤。`fsck`通過讀取相應的`/etc/fstab`條目知道要檢查哪個分區。
1. 掛載`/etc/fstab`中描述的所有分區。
1. 再次打印當前已掛載的分區。`/tmp`已經返回了此列表。
## 附加題
+ 閱讀`man fstab`, `man mount`。
+ 閱讀 <http://tldp.org/LDP/sag/html/filesystems.html>。
- 笨辦法學 Linux 中文版
- 練習 0:起步
- 練習 1:文本編輯器,vim
- 練習 2:文本瀏覽器,少即是多
- 練習 3:Bash:Shell、.profile、.bashrc、.bash_history
- 練習 4:Bash:處理文件,pwd,ls,cp,mv,rm,touch
- 練習 5:Bash:環境變量,env,set,export
- 練習 6:Bash:語言設置,LANG,locale,dpkg-reconfigure locales
- 練習 7:Bash:重定向,stdin,stdout,stderr,<,>,>>,|,tee,pv
- 練習 8:更多的重定向和過濾:head,tail,awk,grep,sed
- 練習 9:Bash:任務控制,jobs,fg
- 練習 10:Bash:程序退出代碼(返回狀態)
- 練習 11:總結
- 練習 12:文檔:man,info
- 練習 13:文檔:Google
- 練習 14:包管理:Debian 包管理工具aptitude
- 練習 15:系統啟動:運行級別,/etc/init.d,rcconf,update-rc.d
- 練習 16:處理進程,ps,kill
- 練習 17:任務調度:cron,at
- 練習 18:日志:/var/log,rsyslog,logger
- 練習 19:文件系統:掛載,mount,/etc/fstab
- 練習 20:文件系統:修改和創建文件系統,tune2fs,mkfs
- 練習 21:文件系統:修改根目錄,chroot
- 練習 22:文件系統:移動數據,tar,dd
- 練習 23:文件系統:權限,chown,chmod,umask
- 練習 24:接口配置,ifconfig,netstat,iproute2,ss,route
- 練習 25:網絡:配置文件,/etc/network/interfaces
- 練習 26:網絡:封包過濾配置,iptables
- 練習 27:安全 Shell,ssh,sshd,scp
- 練習 28:性能:獲取性能情況,uptime,free,top
- 練習 29:內核:內核消息,dmesg
- 練習 30:打磨、洗練、重復:總復習
- 下一步做什么
- Debian 手動安裝