1. 程式人生 > >這個是轉載的關於 linux fstab檔案 uuid 的疑惑,寫的太好了,完整轉載,沒修改。是原文。

這個是轉載的關於 linux fstab檔案 uuid 的疑惑,寫的太好了,完整轉載,沒修改。是原文。

什麼是fstab

檔案fstab包含了你的電腦上的儲存裝置及其檔案系統的資訊。它是決定一個硬碟(分割槽)被怎樣使用或者說整合到整個系統中的唯一檔案。

這個檔案的全路徑是/etc/fstab。它只是一個文字檔案,你能夠用你喜歡的編輯器開啟它,但是必須是root使用者才能編輯它。同時fsck、mount、umount的等命令都利用該程式。

具體來說: 用fstab可以自動掛載各種檔案系統格式的硬碟、分割槽、可移動裝置和遠端裝置等。 對於Windows與arch雙作業系統使用者,用fstab掛載FAT格式和NTFS格式的分割槽,可以在Linux中共享windows系統下的資源。

fstab檔案示例

現在讓我們看一下一個典型的fstab檔案:

# <file system>        <dir>         <type>    <options>             <dump> <pass> none                   /dev/pts      devpts    defaults                0      0 none                   /dev/shm      tmpfs     defaults                0      0   /dev/cdrom             /media/cd     iso9660   ro,user,noauto,unhide   0      0 /dev/dvd               /media/dvd    udf       ro,user,noauto,unhide   0      0 /dev/fd0               /media/fl     auto      user,noauto             0      0   /dev/hda1              swap          swap      defaults                0      0 /dev/hda4              /             ext3      defaults                0      1 /dev/hda3              /home         xfs       rw,suid,exec,auto,nouser,async 0      2 

下面是另外一個例子,其中使用了更多的掛載選項,並以 LABEL= 的方法來作為可掛載裝置的標識。

proc    /proc           proc        rw,relatime                                             0 0 udev    /dev            devtmpfs    rw,nosuid,relatime,size=10240k,nr_inodes=94876,mode=755 0 0 sys     /sys            sysfs       rw,relatime                                             0 0 devpts  /dev/pts        devpts      rw,relatime,mode=600,ptmxmode=000                       0 0 none    /dev/shm        tmpfs       defaults,rw,relatime,size=400M                          0 0 tmpfs   /tmp            tmpfs       defaults,noatime,mode=1777                              0 0  LABEL=BOOT      /boot           ext2 defaults              0 1 LABEL=ROOT      /               ext4 defaults,noatime      0 1 LABEL=USR       /usr            ext4 defaults,noatime      0 0 LABEL=VAR       /var            ext4 defaults,noatime      0 0 LABEL=OPT       /opt            ext4 defaults,noatime      0 0 LABEL=HOME      /home           ext4 defaults,noatime      0 0 

fstab 檔案組成

讓我們對fstab的用法進行一個詳細的瞭解。/etc/fstab由下面的 fields 組成 (fields之間以空格或tab分開):

<file system> <dir> <type> <options> <dump> <pass> 
  • <file systems> - 儲存裝置的標識 (i.e. /dev/sda1).
  • <dir> - 告訴 mount 命令應該將檔案裝置掛載到哪裡。
  • <type> - 定義了要掛載的裝置或是分割槽的檔案系統型別,支援許多種不同的檔案系統,如 ext2, ext3, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap 以及 auto。 'auto' 型別使 mount 命令對這檔案系統型別進行猜測,這對於如 CDROM 和 DVD 之類的可移動裝置是非常有用的。
  • <options> - 定義了不同檔案系統的特殊引數,不同檔案系統的引數不盡相同。其中一些比較通用的引數有以下這些:
  • auto - 檔案系統將在啟動時,或被鍵入了 'mount -a' 的命令時自動被掛載。
  • noauto - 檔案系統只在你的命令下被掛載。
  • exec - 允許執行此分割槽的二進位制檔案(預設值)。
  • noexec - 不允許此檔案系統上的二進位制檔案被執行。
  • ro - 以只讀模式掛載檔案系統。
  • rw - 以讀寫模式掛載檔案系統。
  • sync - I/O 同步進行。
  • async - I/O 非同步進行。
  • flush - 指定 FAT 格式更加頻繁地重新整理資料,使得如複製對話方塊或是進度條持續到檔案被寫入到磁碟中。
  • user - 允許任意使用者來掛載這一裝置(同時有 noexec, nosuid, nodev 引數的屬性)。
  • nouser - 只能被 root 掛載(預設值)。
  • defaults - 預設的掛載設定(即 rw, suid, dev, exec, auto, nouser, async)。
  • suid - 允許 suid 操作和設定 sgid 位。這一引數通常用於一些特殊任務,使一般使用者執行程式時臨時提升許可權。
  • nosuid - 禁止 suid 操作和 sgid 位。
  • noatime - 不要更新檔案系統上 inode access 記錄,可以提升效能(參見 atime_options)。
  • nodiratime - 不要更新檔案系統上 directory access inode 的記錄,可以提升效能(參見 atime_options)。
  • relatime - 實時更新 inode access 記錄。只有在記錄中的訪問時間早於當前訪問才會被更新。(與 noatime 相似,但不會打斷如 mutt 或其它程式探測檔案在上次訪問後是否被修改的程序。),可以提升效能(參見atime_options)。
  • <dump> dump utility 用來決定何時作備份. 安裝之後 ( ArchLinux 預設未安裝 ), dump 會檢查其內容,並用數字來決定是否對這個檔案系統進行備份。 允許的數字是 0 和 1 。0 表示忽略, 1 則進行備份。大部分的使用者是沒有安裝 dump 的 ,對他們而言 <dump> 應設為 0。
  • <pass> fsck 讀取 <pass> 的數值來決定需要檢查的檔案系統的檢查順序。允許的數字是0, 1, 和2。 根目錄應當獲得最高的優先權 1, 其它所有需要被檢查的裝置設定為 2. 0 表示裝置不會被 fsck 所檢查。

檔案系統標識

/etc/fstab配 置檔案中你可以以三種不同的方法表示檔案系統:通過 kernal naming 描述, 通過 UUID 或者通過 label。使用 UUID 或是 label 的好處在於它們與磁碟順序無關。如果你在 BIOS 中改變了你的儲存裝置順序,或是重新拔插了儲存裝置,或是因為一些 BIOS 可能會隨機地改變儲存裝置的順序,那麼用 UUID 或是 label 來表示將更有效。

Kernel naming

你可以使用 fdisk 來獲得 kernal naming 表示:

# fdisk -l ...    Device Boot      Start         End      Blocks   Id  System /dev/sda1   *           1        2550    20482843+   b  W95 FAT32 /dev/sda2            2551        5100    20482875   83  Linux /dev/sda3            5101        7650    20482875   83  Linux /dev/sda4            7651      121601   915311407+   5  Extended /dev/sda5            7651       10200    20482843+  83  Linux /dev/sda6           10201       17849    61440561   83  Linux /dev/sda7           17850       18104     2048256   82  Linux swap / Solaris /dev/sda8           18105       18113       72261   83  Linux /dev/sda9           18114      121601   831267328+   7  HPFS/NTFS 

UUID

UUID 由生成工具 (mkfs.*) 在建立檔案系統時生成。blkid 命令將顯示已掛載裝置的 UUID 值:

# blkid /dev/sda1: UUID="76E4F702E4F6C401" LABEL="vista" TYPE="ntfs" /dev/sda2: LABEL="Root" UUID="24f28fc6-717e-4bcd-a5f7-32b959024e26" TYPE="ext4" /dev/sda6: LABEL="Home" UUID="03ec5dd3-45c0-4f95-a363-61ff321a09ff" TYPE="ext4"  /dev/sda7: LABEL="swap" UUID="4209c845-f495-4c43-8a03-5363dd433153" TYPE="swap" /dev/sda10: UUID="0ea7a93f-537c-4868-9201-0dc090c050e4" TYPE="crypto_LUKS" /dev/mapper/sda10: UUID="d3560bbb-b5d5-46c5-a7a8-434c885217c7" UUID_SUB="425ab275-d520-4636-8d16-55fb2b957971" TYPE="btrfs" 

一個使用 UUID 標識的 /etc/fstab 配置檔案例子如下所示:

# <file system>        <dir>         <type>    <options>             <dump> <pass> none                   /dev/pts      devpts    defaults                0      0 none                   /dev/shm      tmpfs     defaults                0      0  /dev/cdrom             /media/cd     iso9660   ro,user,noauto,unhide   0      0 /dev/dvd               /media/dvd    udf       ro,user,noauto,unhide   0      0 /dev/fd0               /media/fl     auto      user,noauto             0      0   UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26 /     ext4 defaults,noatime  0      1 UUID=03ec5dd3-45c0-4f95-a363-61ff321a09ff /home ext4 defaults,noatime  0      2 UUID=4209c845-f495-4c43-8a03-5363dd433153 swap  swap defaults          0      0 

Label

使用這一方法,裝置或是分割槽一定要被標識。標識裝置你可以使用一些通用工具,如 e2label 對 ext2,ext3, ext4分割槽進行標記。也是一個不錯的工具。需要注意的是,並不是所有格式的分割槽都支援標記 (如 FAT 檔案系統就不支援標記)。

在嘗試對裝置進行標識時裝置不能被掛載。你可以通過一個 LiveCD/DVD/USB 啟動,用如 或是e2label 來對裝置進行標識。

 e2label /dev/<disk-or-partition> Arch_Linux 

label 最多可以有 16 個字元長。理論上 label 可以包含空格,但是如果這樣做將無法讓 fstab 或是 GRUB 配置檔案識別出來。

label 命名應該足夠清晰以防止可能的衝突。在 fstab 中以 label 來標識裝置如下例所示:

# <file system>        <dir>         <type>    <options>             <dump> <pass> none                   /dev/pts      devpts    defaults                0      0 none                   /dev/shm      tmpfs     defaults                0      0   /dev/cdrom             /media/cd     iso9660   ro,user,noauto,unhide   0      0 /dev/dvd               /media/dvd    udf       ro,user,noauto,unhide   0      0 /dev/fd0               /media/fl     auto      user,noauto             0      0   LABEL=Arch_Linux       /             ext4      defaults,noatime        0      1 LABEL=Arch_Swap        swap          swap      defaults                0      0 

建議

atime 引數

使用 noatime,nodiratime orrelatime 可以提升 ext2, ext3 及 ext4 格式磁碟的效能。 Linux 在預設情況下每次在磁碟上讀取(或寫入)資料時都會產生一個記錄。這是在 Linux 用於伺服器而設計的,在桌面使用中意義不大。這些引數對於大部分的程式來說都是有效的。但對於 mutt (它需要這些記錄資訊),你應該僅僅使用realtime 選項。

tmpfs

Tmpfs 是一個臨時檔案系統,駐留於你的交換分割槽或是記憶體中(取決於你的使用情況)。它的意義在於提高系統一些部分的速度,並能在重啟時自動清除一些檔案。

tmpfs 可以被安全使用在的目錄有 /tmp, /var/lock and /var/run. 不要將之使用於 /var/tmp, 因為這一目錄中的臨時檔案在重啟過程中還是被保留。

Warning: 一些 daemon 程序仍然將一些檔案(或目錄)安裝在 /var/lock 和 /var/run 下。因此需要編輯/etc/rc.d 下的指令碼來使它們正常工作 (如 lighttpd)。

預設情況下, tmpfs 分割槽被設定為你總的記憶體的一半,當然你可以自由設定這一值。注意實際中記憶體和交換分割槽的使用情況取決於你的使用情況,而 tmpfs 分割槽在其真正使用前是不會佔用儲存空間的。

要在 /tmp,/var/lock 和 /var/run 下使用 tmpfs,在 /etc/fstab 中新增如下幾行:

 tmpfs /tmp      tmpfs defaults,nodev,nosuid,mode=1777                 0 0  tmpfs /var/lock tmpfs defaults,nodev,nosuid,noexec,mode=1777,size=10m 0 0  tmpfs /var/run  tmpfs defaults,nodev,nosuid,noexec,mode=0755,size=10m 0 0 

你可以在這裡指定其大小,但是在這種情況下你應該突出 mode 部分,以確保它們可以有正確的許可權設定。在上面的例子中, /tmp 將會佔用你的一半記憶體,其它的兩個目錄被設定為各佔用 10 MB 大小。

參閱 mount 命令 man 手冊以獲得更多的內容。

重啟後方能生產。注意儘管這樣做非常地誘人和有效,但是千萬不要直接執行 mount -a 命令,因為可能造成當下這些目錄的不可訪問 (比如你應該保證 lockfiles 的正常存在)。然而,如果它們都是空的,那麼就可以直接執行mount -a 而不必重啟電腦。在重啟前你可以執行 mount /tmp 等來啟用其中一些選項,其餘的則要在重啟後生效。

在進行了如上面的改動後,要檢驗它是否如願起作用你可以用 df 命令( df -h):

 tmpfs                 2.0G   20K  2.0G   1% /tmp  tmpfs                  10M     0   10M   0% /var/lock  tmpfs                  10M   48K   10M   1% /var/run 

修正因 /var 分割槽造成關機異常問題

將 /var/lock 和 /var/run 掛載為 tmpfs 時, 如果是一個獨立的分割槽 /var 將不能在關機時被解除安裝。這是因為 tmpfs 檔案系統不被 rc.shutdown 所解除安裝。

要修復這一問題,需要建立 /etc/rc.d/functions.d/clean_umount 檔案,在其中加入

clean_umount() {     umount /var/lock     umount /var/run } add_hook shutdown_postkillall clean_umount # vim: set ft=sh : 

這將使 /var/lock 和 /var/run 在所有程序和守護程序結束後,在解除安裝 /var 之前被解除安裝。

解決包含有空格的路徑名無法使用的問題

你可以使用 "\040" 轉義字元來表示空格(以三位八進位制數來進行表示)

/dev/sda7                /home/username/Camera\040Picures   ext4  defaults,noatime       0  2 UUID=7D4500B3071E18B2    /media/100\040GB\040(Storage)      ntfs  defaults,noatime,user  0  0 

外部裝置

外部裝置可以被即時地掛載,但是如果加入了 nofail 選項將被忽略。這用於阻止啟動時的報錯。

/dev/sdg1 /media/backup jfs noauto,nofail,rw,noatime,nodiratime 0 2

用fstab自動掛載FAT32和NTFS分割槽

1.先在用fdisk -l(可能需要在root許可權下)得到硬碟資訊表,例如:

#  Device Boot      Start         End      Blocks   Id  System /dev/sda1   *           1        2397    19253871    b  W95 FAT32 /dev/sda2            2398        3144     6000277+  83  Linux /dev/sda3            3145        9729    52894012+   5  Extended /dev/sda5            3145        3152       64228+  83  Linux /dev/sda6            3153        3276      995998+  82  Linux swap / Solaris /dev/sda7            3277        7340    32644048+  83  Linux /dev/sda8            7341        9729    19189611    7  HPFS/NTFS 

從上面知道,這臺電腦上只有一個硬碟,其中分割槽sda1和sda8為NTFS格式,sda1為可以啟動的,因而可能為window的系統所在盤。 下面把系統盤以只讀方式持載上去,非系統盤sda8以讀寫方式掛載上去(不能掛載在"/"及其以下的任何目錄)。

2.用你喜歡的編輯器在終端中開啟/etc/fstab,例如: nano /etc/fstab

在檔案末尾加入:

/dev/sda1 /mnt/WindowsC vfat defaults,codepage=936,iocharset=cp936,umask=0222 0 0 /dev/sda8 /mnt/WindowsD ntfs defaults,iocharset=utf8,umask=000,nls=utf8 0 0 

儲存,退出。

Warning: 使用936的codepage掛在fat32分割槽可能會造成linux下識別中文正常但是到windows下反而出現亂碼,推薦替換成utf8,但是dmesg提示警告,沒有關係,n多人用了這麼長時間都沒有問題
/dev/sda1 /mnt/WindowsC vfat user,utf8,umask=000 0 0 

3.在終端中輸入 mount -a ,你就應該能在/mnt/WindowsC下找到你的系統分割槽sda1內容,在/home/username/WindowsD中找到sda8的內容(其中username指使用者名稱)。

相關內容

參考資料