跳轉到內容

Unix 指南/解釋/檔案系統和交換空間

來自華夏公益教科書,開放的書籍,開放的世界

Unix 類檔案系統的一個共同特徵是所有檔案都出現在一個檔案層次結構中。儲存層次結構基礎的檔案系統被稱為根檔案系統。/,包含所有其他目錄的目錄,本身稱為根目錄。其他檔案系統被掛載在/下的目錄上,這使得這些檔案系統看起來像是根檔案系統中的目錄。例如,包含檔案的 CD-ROM 可以被掛載到/mnt/cdrom。在這個例子中,/mnt/cdrom 被稱為掛載點。對裝置的訪問是由另一個掛載在/dev上的檔案系統提供的。這裡可以訪問代表物理和虛擬裝置的檔案。檔案系統本身以/dev中的檔案形式表示,例如/dev/cdrom,並且可以掛載到根檔案系統中的目錄,例如/mnt/cdrom。每個磁碟或儲存介質可以包含一個或多個檔案系統,每個檔案系統都包含可以包含資料的檔案。有些磁碟還用於交換空間,在記憶體已滿時,為記憶體中的資料提供臨時儲存空間。雖然“交換空間”駐留在磁碟上,但它實際上不是一個檔案系統。


Clipboard

待辦事項


Clipboard

待辦事項


檔案系統型別列表

[編輯 | 編輯原始碼]

Unix 類系統的選擇會影響檔案系統的選擇。檔案系統有兩種。

  • 具有完整 Unix 支援的檔案系統可以儲存所有型別的 Unix 檔案,包括普通檔案、目錄、命名管道、符號連結和裝置節點。它們還支援完整的 Unix 使用者和組許可權模型。這使得這些檔案系統適合掛載在/上,以及/home/tmp/usr/var和任何其他這樣的檔案系統,如果這些是獨立的分割槽。
  • 非 Unix 檔案系統最初是為非 Unix 作業系統設計的,或者用於在不同的檔案系統之間交換檔案。有時,檔案系統上每個檔案的許可權必須相同,並且只允許普通檔案和目錄。

具有完整 Unix 支援的檔案系統

[編輯 | 編輯原始碼]
  • Unix 檔案系統 (ufs/ffs) 是*BSD 和幾種商業 Unix 變體的檔案系統。UFS 是磁碟上的佈局,而 FFS 是 *BSD 中對 UFS 的一些核心最佳化。UFS 有幾個不相容的擴充套件,包括 FreeBSD、NetBSD 和 Mac OS X 的 UFS2。因此,UFS 適用於根檔案系統,但不適合在實現 UFS 不相容的不同 Unix 類作業系統之間交換檔案。
  • Linux 第二擴充套件檔案系統 (ext2ext3ext4) 受 ufs/ffs 的啟發,並且類似。ext2 是Linux的主要檔案系統實現,可以用作根檔案系統。與 ufs/ffs 不同,ext2 始終具有相同的磁碟佈局,並且可以在不同的 Linux 系統之間以及理解 ext2 的其他系統之間共享。請注意,ext3實際上與 ext2 相同,但啟用了日誌記錄,並且支援雜湊 B 樹,這加快了更大目錄中的查詢。Linux 還提供了其他你可以使用而不是 ext2 的檔案系統。
  • reiserfsLinux上 ext2 的替代品。Reiserfs 是一個由 Hans Reiser 編寫的快速日誌檔案系統。
  • jfs 是一個由 IBM 編寫的,最初用於 IBM AIX,然後由同一家公司移植到 Linux 的高效能日誌檔案系統。
  • xfs 是一個由 SGI 編寫的,高效能日誌檔案系統。這個檔案系統最初是為 SGI 的 Irix 作業系統編寫的,它已經使用一個墊片層移植到 Linux,將 Linux VFS 和鎖機制轉換為 Irix 語義。
  • HFS+ (hfsplus) 是Mac OS X的主要檔案系統實現,可以用作根檔案系統。與 ext2 一樣,HFS+ 始終具有相同的磁碟佈局,並且可以在不同的 Mac 系統之間共享。HFS+ 支援 Unix 和 Mac 檔案屬性。HFS+ 具有二叉樹,這使得它有時比 ffs 和 ext2 更快。

外部檔案系統

[編輯 | 編輯原始碼]
  • iso9660 是 CD-ROM 的通用檔案系統。大多數 Unix 類系統都可以讀取它。
  • UDF 是 DVD 的通用檔案系統。一些較新的 Unix 類系統可以讀取和寫入它。
  • msdos (FAT) 是來自 MS-DOS、FreeDOS、ReactOS 和 Microsoft Windows 的檔案系統。通常你可以有普通檔案和目錄,但沒有特殊檔案、符號連結,也沒有 Unix 檔案許可權。由於幾乎每個 Unix 類系統(包括 Linux、*BSD 和 Mac OS X)以及 DOS/Windows 都理解它,因此 msdos 檔案系統通常用於在計算機之間或在啟動多個作業系統的計算機之間交換檔案。
  • ntfs 是來自 Microsoft Windows NT 的較新檔案系統。一些 Linux 核心可以讀取它們。

磁碟分割槽

[編輯 | 編輯原始碼]

如果磁碟沒有分割槽,它可以用於一個檔案系統,或全部用作交換空間。

  • 在 Linux 上,IDE/ATA 磁碟被稱為 /dev/hda、/dev/hdb、/dev/hdc...
  • 在 Linux 上,SCSI 磁碟被稱為 /dev/sda、/dev/sdb、/dev/sdc...
  • 在 *BSD 上,IDE/ATA 磁碟被稱為 /dev/wd0c、/dev/wd1c、/dev/wd2c...
    • 在 FreeBSD 上,IDE/ATA 磁碟被稱為 /dev/ad0c、/dev/ad1c、/dev/ad2c...
  • 在 *BSD 上,SCSI 磁碟被稱為 /dev/sd0c、/dev/sd1c、/dev/sd2c...
  • 在 *BSD 上,光碟 (CD) 被稱為 /dev/cd0c、/dev/cd1c...
  • 在 Mac OS X 上,磁碟被稱為 /dev/disk0、/dev/disk1、/dev/disk2...
  • NetBSD/OpenBSD 磁碟映像是 /dev/svnd0c、/dev/svnd1c、/dev/svnd2c...

分割槽磁碟允許使用多個檔案系統和交換空間。

  • 在 Linux 上,hda 被分割槽為 /dev/hda1、/dev/hda2、/dev/hda3、/dev/hda4...
  • 在 *BSD 上,wd0 被分割槽為 /dev/wd0a、/dev/wd0b、/dev/wd0c、/dev/wd0d...
  • 在 Mac OS X 上,disk0 被分割槽為 /dev/disk0s1、/dev/disk0s2、/dev/disk0s3...

此外,*BSD 還有一些額外的規則

  • 分割槽 'c' (/dev/wd0c) 必須是整個磁碟。
  • 如果 *BSD 作業系統在磁碟上啟動,那麼分割槽 'a' 必須是根 (/),'b' 必須是交換空間。(如果磁碟上沒有作業系統,那麼 'a' 可以用於任何檔案系統)。

章節 分割槽磁碟 更詳細地描述了格式以及如何編輯分割槽表。

掛載檔案系統和啟用交換空間

[編輯 | 編輯原始碼]

使用的命令是

  • mount 用於掛載檔案系統
  • umount 用於解除安裝檔案系統
  • swapctlswaponswapoff

簡單掛載

[編輯 | 編輯原始碼]

假設 /dev/hdb 是一個裝置(例如 CD 驅動器),而 /mnt/cdrom 是掛載的位置。那麼掛載命令是

mount /dev/hdb /mnt/cdrom

還有更多掛載選項,因此可以在 Unix 命令指南 中查詢 mount。

使用 fstab 掛載

[編輯 | 編輯原始碼]

/etc/fstab 檔案透過指定預設掛載點來幫助你掛載。

  1. 為 /dev/hdb 建立一個 /etc/fstab 條目。
  2. 執行以下命令
mount /dev/hdb

解除安裝

[edit | edit source]

它是稱為 umount,而不是 unmount...

umount /dev/hdb

使用者掛載

[edit | edit source]

使用者掛載 是指非超級使用者使用者對檔案系統的掛載和解除安裝。不幸的是,不同的 Unix 變體對這項任務有不同的方法。(另一種方法是配置“sudo”以允許使用者在掛載和解除安裝時成為 root。)以下是一些 root 允許使用者掛載的方法

  • Linux 允許使用者執行透過/etc/fstab檔案允許的掛載。每個包含掛載選項“user”的行描述了允許的掛載。例如,mount /dev/cdrom非 root 使用者將掛載/dev/cdrom使用掛載點和選項顯示在/etc/fstab中,但前提是“user”在掛載選項中列出。
  • 許多流行的 BSD 家族作業系統允許使用者掛載任何使用者可以讀取和寫入的裝置。使用者可以選擇使用者擁有的任何掛載點。在大多數系統中,必須由 root 使用者更改 sysctl 值才能執行此操作。
    • 在 OpenBSD 中,kern.usermount 必須設定為 1。
    • 在 NetBSD 中,vfs.generic.usermount 必須設定為 1。
    • 在 FreeBSD、PcBSD 和 DragonflyBSD 中,vfs.usermount 必須設定為 1。

聯合掛載

[edit | edit source]

通常,檔案系統被掛載到空目錄。如果目錄不為空,則其檔案將被隱藏,直到檔案系統被解除安裝。聯合掛載 允許這些檔案顯示出來。目錄中每個現有檔案只在掛載的檔案系統中沒有相同位置的檔案時才會顯示。所有新檔案都在掛載的檔案系統上建立。請注意,聯合掛載很奇怪,可能無法在您的系統上正常工作。

一些作業系統為其提供了 mount(8) 選項 -o union。在這個例子中,一個非分割槽 SCSI 磁碟 sd0 將被掛載到 /etc(它通常不是掛載點)。我們擁有的任何 /etc 檔案,如果不在 sd0 上,都將仍然可用。

# mount -o union /dev/sd0c /etc

磁碟映像

[edit | edit source]

檔案系統可以儲存在另一個檔案系統上的檔案上。這些檔案稱為 磁碟映像,它們有幾個應用

  • 使用 dd 將資料從裝置節點複製到普通檔案,以保留小磁碟的內容,例如軟盤。
  • 一些程式允許您在刻錄到 CD 之前製作 iso9660 磁碟映像。您可能希望以只讀方式掛載磁碟映像以在燒錄之前檢查它。還可以將此類映像移動到裝有 CD 燒錄機的計算機,或提供映像供下載,以便其他人燒錄它。
  • 如果您在磁碟上沒有用於新分割槽的可用空間,但某些分割槽有可用空間,則如果您需要新的檔案系統,則可以建立磁碟映像。有時這有助於建立加密檔案系統。

本指南僅描述原始磁碟映像,其中僅包含檔案系統。還有其他格式(例如 Mac OS X NDIF 格式),但這些格式必須轉換或以特殊方式處理。

在 NetBSD 和 OpenBSD 上掛載磁碟映像

[edit | edit source]

通常,NetBSD 和 OpenBSD 僅允許掛載儲存在裝置上的檔案系統。因此,涉及五個步驟

  1. 將磁碟映像與 svnd 裝置相關聯。
  2. 掛載 svnd 裝置。
  3. 使用磁碟映像。
  4. 解除安裝 svnd 裝置。
  5. 取消將磁碟映像與裝置關聯。

關聯和取消關聯由 vnconfig(8) 命令處理。在這個例子中,/the/disk/image 將與 /dev/svnd0c 相關聯。此特定磁碟映像具有一個包含分割槽“a”上的檔案系統的磁碟標籤,我們將其掛載到 /mnt 上。如果沒有磁碟標籤,我們將改為掛載分割槽“c”。

# vnconfig -c /dev/svnd0c /the/disk/image
# mount /dev/svnd0a /mnt
...
# umount /dev/svnd0a
# vnconfig -u /dev/svnd0c

在 FreeBSD 5 上掛載磁碟映像

[edit | edit source]

在 FreeBSD 5 中,使用帶有 vnode 支援儲存的 mdconfig(8)

在 Linux 上掛載磁碟映像

[edit | edit source]

mount(8) 選項 -o loop 可用於掛載磁碟映像而不是裝置。

# mount -o loop /the/disk/image /mnt
...
# umount /mnt

一些 Linux 核心可以掛載 cloop(壓縮迴圈),它是一個壓縮的磁碟映像。此類映像必須以只讀方式掛載。首先準備映像,然後如何壓縮它?然後如何掛載它?Knoppix livecd 使用 cloop 將更多程式放到 CD 中。

建立磁碟映像

[edit | edit source]

在您掛載並開始使用新建立的空磁碟映像之前,需要執行兩個步驟

  1. 使用 dd(1) 建立一個具有正確大小的新的零檔案。
  2. 使用分割槽和檔案系統格式化磁碟映像。

這是一個例子。我們使用 dd 和無限的零 /dev/zero 來建立一個 1440 千位元組的磁碟映像(1440 個 1024 位元組的塊)。然後我們使用 mkfs.ext3(8) 來建立一個未分割槽 ext3 檔案系統。請注意,mkfs.ext3 不會執行掛載,因此它不關心它是否格式化的是裝置還是磁碟映像。(FIXME 這是否正確?)

$ dd bs=1024 count=1440 if=/dev/zero of=example
$ mkfs.ext3 example

*BSD newfs(8)newfs_msdos(8) 實用程式只堅持格式化裝置。這可以透過 vnconfig(8) 解決。如果我們要對磁碟映像進行分割槽,我們也會製作一個磁碟標籤。可以忽略虛構的磁碟幾何形狀。

$ dd bs=1024 count=1440 if=/dev/zero of=example
$ sudo vnconfig -c /dev/svnd0c example
$ sudo newfs /dev/rsvnd0c
...
$ sudo vnconfig -u /dev/svnd0c

實際上,在 *BSD 上,最好始終使用磁碟標籤,尤其是在建立 ffs 檔案系統時,這樣檔案系統就會在標籤中正確列出,並且字母將與“c”不同。

$ dd bs=1024 count=1440 if=/dev/zero of=example
$ sudo vnconfig -c /dev/svnd0c example
$ sudo disklabel -E svnd0

Initial label editor (enter '?' for help at any prompt)
> a
partition: [a]
offset: [0]
size: [2880]
FS type: [4.2BSD]
> p
device: /dev/rsvnd0c
type: SCSI
disk: vnd device
label: fictitious
bytes/sector: 512
sectors/track: 100
tracks/cylinder: 1
sectors/cylinder: 100
cylinders: 28
total sectors: 2880
free sectors: 0
rpm: 3600

16 partitions:
#             size        offset  fstype [fsize bsize  cpg]
  a:          2880             0  4.2BSD   2048 16384   32 # Cyl     0 -    28*
  c:          2880             0  unused      0     0      # Cyl     0 -    28*
> q
Write new label?: [y]
$ sudo newfs /dev/rsvnd0a
...
$ sudo vnconfig -u /dev/svnd0c

加密檔案系統

[edit | edit source]

OpenBSD 上的加密檔案系統

[edit | edit source]

由於 OpenBSD 集成了加密,因此可以預期有一種方法可以擁有加密檔案系統。OpenBSD 僅為磁碟映像提供 Blowfish 加密。這可以透過 -k 標誌對 vnconfig(8) 使用 -c 來實現。

在這個例子中,我們將掛載名為 /secrets 的加密磁碟映像,它包含一個名為“a”的單個分割槽字母

# vnconfig -ck /dev/svnd0c /secrets
Encryption key:
# mount /dev/svnd0a
...
# umount /dev/svnd0a
# vnconfig -u /dev/svnd0c

請注意,如果您輸入了錯誤的加密金鑰,vnconfig 仍然會成功。掛載將失敗,因為磁碟標籤和檔案系統頭無法讀取。在這種情況下,您必須 vnconfig -u,然後使用正確的金鑰 vnconfig -ck。在最初格式化新的磁碟映像時,請確保使用正確的金鑰。

要擁有整個加密磁碟分割槽,請建立一個普通的未加密磁碟映像,將其掛載,然後使用一個大檔案填充分割槽以用作磁碟映像。

Linux 上的加密檔案系統

[edit | edit source]

一些 Linux 核心配置允許您使用 losetup 加密磁碟映像。想想 lo(opback) 設定,而不是 lose tup。

參考資料

[編輯 | 編輯原始碼]
華夏公益教科書