在前面章節中,我們已經從文件級別看了操作數據。在這章里,我們將從設備級別來考慮數據。 Linux 有著令人驚奇的能力來處理存儲設備,不管是物理設備,比如說硬盤,還是網絡設備,或者是 虛擬存儲設備,像 RAID(獨立磁盤冗余陣列)和 LVM(邏輯卷管理器)。
然而,這不是一本關于系統管理的書籍,我們不會試圖深入地覆蓋整個主題。我們將努力做的就是 介紹一些概念和用來管理存儲設備的重要命令。
我們將會使用 USB 閃存,CD-RW 光盤(因為系統配備了 CD-ROM 燒寫器)和一張軟盤(若系統這樣配備), 來做這章的練習題。
我們將看看以下命令:
> * mount – 掛載一個文件系統
> * umount – 卸載一個文件系統
> * fsck – 檢查和修復一個文件系統
> * fdisk – 分區表控制器
> * mkfs – 創建文件系統
> * fdformat – 格式化一張軟盤
> * dd — 把面向塊的數據直接寫入設備
> * genisoimage (mkisofs) – 創建一個 ISO 9660的映像文件
> * wodim (cdrecord) – 把數據寫入光存儲媒介
> * md5sum – 計算 MD5檢驗碼
## 掛載和卸載存儲設備
Linux 桌面系統的最新進展已經使存儲設備管理對于桌面用戶來說極其容易。大多數情況下,我們 只要把設備連接到系統中,它就能工作。在過去(比如說,2004年),這個工作必須手動完成。 在非桌面系統中(例如,服務器中),這仍然是一個主要地手動過程,因為服務器經常有極端的存儲需求 和復雜的配置要求。
管理存儲設備的第一步是把設備連接到文件系統樹中。這個過程叫做掛載,允許設備參與到操作系統中。 回想一下第三章,類 Unix 的操作系統,像 Linux,維護單一文件系統樹,設備連接到各個結點上。 這與其它操作系統形成對照,比如說 MS-DOS 和 Windows 系統中,每個設備(例如 C:\,D:\,等) 保持著單獨的文件系統樹。
有一個叫做/etc/fstab 的文件可以列出系統啟動時要掛載的設備(典型地,硬盤分區)。下面是 來自于 Fedora 7系統的/etc/fstab 文件實例:
~~~
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
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
LABEL=SWAP-sda3 /swap swap defaults 0 0
~~~
在這個實例中所列出的大多數文件系統是虛擬的,并不適用于我們的討論。就我們的目的而言, 前三個是我們感興趣的:
~~~
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
~~~
這些是硬盤分區。每行由六個字段組成,如下所示:
表16-1: /etc/fstab 字段
| 字段 | 內容 | 說明 |
|------|----|------|
| 1 | 設備名 | 傳統上,這個字段包含與物理設備相關聯的設備文件的實際名字,比如說/dev/hda1(第一個 IDE 通道上第一個主設備分區)。然而今天的計算機,有很多熱插拔設備(像 USB 驅動設備),許多 現代的 Linux 發行版用一個文本標簽和設備相關聯。當這個設備連接到系統中時, 這個標簽(當儲存媒介格式化時,這個標簽會被添加到存儲媒介中)會被操作系統讀取。 那樣的話,不管賦給實際物理設備哪個設備文件,這個設備仍然能被系統正確地識別。 |
| 2 | 掛載點 | 設備所連接到的文件系統樹的目錄。 |
| 3 | 文件系統類型 | Linux 允許掛載許多文件系統類型。大多數本地的 Linux 文件系統是 ext3, 但是也支持很多其它的,比方說 FAT16 (msdos), FAT32 (vfat),NTFS (ntfs),CD-ROM (iso9660),等等。 |
| 4 | 選項 | 文件系統可以通過各種各樣的選項來掛載。有可能,例如,掛載只讀的文件系統, 或者掛載阻止執行任何程序的文件系統(一個有用的安全特性,避免刪除媒介。) |
| 5 | 頻率 | 一位數字,指定是否和在什么時間用 dump 命令來備份一個文件系統。 |
| 6 | 次序 | 一位數字,指定 fsck 命令按照什么次序來檢查文件系統。 |
## 查看掛載的文件系統列表
這個 mount 命令被用來掛載文件系統。執行這個不帶參數的命令,將會顯示 一系列當前掛載的文件系統:
~~~
[me@linuxbox ~]$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /home type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdd1 on /media/disk type vfat (rw,nosuid,nodev,noatime,
uhelper=hal,uid=500,utf8,shortname=lower)
twin4:/musicbox on /misc/musicbox type nfs4 (rw,addr=192.168.1.4)
~~~
這個列表的格式是:設備 on 掛載點 type 文件系統類型(可選的)。例如,第一行所示設備/dev/sda2 作為根文件系統被掛載,文件系統類型是 ext3,并且可讀可寫(這個“rw”選項)。在這個列表的底部有 兩個有趣的條目。倒數第二行顯示了在讀卡器中的一張2G 的 SD 內存卡,掛載到了/media/disk 上。最后一行 是一個網絡設備,掛載到了/misc/musicbox 上。
第一次實驗,我們將使用一張 CD-ROM。首先,在插入 CD-ROW 之前,我們將看一下系統:
~~~
[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
~~~
這個列表來自于 CentOS 5系統,使用 LVM(邏輯卷管理器)來創建它的根文件系統。正如許多現在的 Linux 發行版一樣,這個 系統試圖自動掛載插入的 CD-ROM。當我們插入光盤后,我們看看下面的輸出:
~~~
[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/hdc on /media/live-1.0.10-8 type iso9660 (ro,noexec,nosuid,
nodev,uid=500)
~~~
當我們插入光盤后,除了額外的一行之外,我們看到和原來一樣的列表。在列表的末尾,我們 看到 CD-ROW 已經掛載到了/media/live-1.0.10-8上,它的文件類型是 iso9660(CD-ROW)。 就我們的實驗目的而言,我們對這個設備的名字感興趣。當你自己進行這個實驗時,這個 設備名字是最有可能不同的。
警告:在隨后的實例中,至關重要的是你要密切注意用在你系統中的實際設備名,并且 不要使用此文本中使用的名字!
還要注意音頻 CD 和 CD-ROW 不一樣。音頻 CD 不包含文件系統,這樣在通常意義上,它就不能被掛載了。
現在我們擁有 CD-ROW 光盤的設備名字,讓我們卸載這張光盤,并把它重新掛載到文件系統樹 的另一個位置。我們需要超級用戶身份(使用系統相應的命令)來進行操作,并且用 umount(注意這個命令的拼寫)來卸載光盤:
~~~
[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]# umount /dev/hdc
~~~
下一步是創建一個新的光盤掛載點。簡單地說,一個掛載點就是文件系統樹中的一個目錄。它沒有 什么特殊的。它甚至不必是一個空目錄,即使你把設備掛載到了一個非空目錄上,你也不能看到 這個目錄中原來的內容,直到你卸載這個設備。就我們的目的而言,我們將創建一個新目錄:
~~~
[root@linuxbox ~]# mkdir /mnt/cdrom
~~~
最后,我們把這個 CD-ROW 掛載到一個新的掛載點上。這個-t 選項用來指定文件系統類型:
~~~
[root@linuxbox ~]# mount -t iso9660 /dev/hdc /mnt/cdrom
~~~
之后,我們可以通過這個新掛載點來查看 CD-ROW 的內容:
~~~
[root@linuxbox ~]# cd /mnt/cdrom
[root@linuxbox cdrom]# ls
~~~
注意當我們試圖卸載這個 CD-ROW 時,發生了什么事情。
~~~
[root@linuxbox cdrom]# umount /dev/hdc
umount: /mnt/cdrom: device is busy
~~~
這是怎么回事呢?原因是我們不能卸載一個設備,如果某個用戶或進程正在使用這個設備的話。在這種 情況下,我們把工作目錄更改到了 CD-ROW 的掛載點,這個掛載點導致設備忙碌。我們可以很容易地修復這個問題 通過把工作目錄改到其它目錄而不是這個掛載點。
~~~
[root@linuxbox cdrom]# cd
[root@linuxbox ~]# umount /dev/hdc
~~~
現在這個設備成功卸載了。
> 為什么卸載重要
>
> 如果你看一下 free 命令的輸出結果,這個命令用來顯示關于內存使用情況的統計信息,你 會看到一個統計值叫做”buffers“。計算機系統旨在盡可能快地運行。系統運行速度的 一個阻礙是緩慢的設備。打印機是一個很好的例子。即使最快速的打印機相比于計算機標準也 極其地緩慢。一臺計算機確實會運行地非常慢,如果它要停下來等待一臺打印機打印完一頁。 在早期的個人電腦時代(多任務之前),這真是個問題。如果你正在編輯電子表格 或者是文本文檔,每次你要打印文件時,計算機都會停下來而且變得不能使用。 計算機能以打印機可接受的最快速度把數據發送給打印機,但由于打印機不能快速地打印, 這個發送速度會非常慢。這個問題被解決了,由于打印機緩存的出現,一個包含一些 RAM 內存 的設備,位于計算機和打印機之間。通過打印機緩存,計算機把要打印的結果發送到這個緩存區, 數據會迅速地存儲到這個 RAM 中,這樣計算機就能回去工作,而不用等待。與此同時,打印機緩存將會 以打印機可接受的速度把緩存中的數據緩慢地輸出給打印機。
>
> 緩存被廣泛地應用于計算機中,使其運行地更快。別讓偶爾地需要讀取或寫入慢設備阻礙了 系統的運行速度。在實際與慢設備交互之前,操作系統會盡可能多的讀取或寫入數據到內存中的 存儲設備里。以 Linux 操作系統為例,你會注意到系統看似填充了多于它所需要的內存。 這不意味著 Linux 正在使用所有的內存,它意味著 Linux 正在利用所有可用的內存,來作為緩存區。
>
> 這個緩存區允許非常快速地寫入存儲設備,因為寫入物理設備的操作被延遲到后面進行。同時, 這些注定要傳送到設備中的數據正在內存中堆積起來。時不時地,操作系統會把這些數據 寫入物理設備。
>
> 卸載一個設備需要把所有剩余的數據寫入這個設備,所以設備可以被安全地移除。如果 沒有卸載設備,就移除了它,就有可能沒有把注定要發送到設備中的數據輸送完畢。在某些情況下, 這些數據可能包含重要的目錄更新信息,這將導致文件系統損壞,這是發生在計算機中的最壞的事情之一。
## 確定設備名稱
有時很難來確定設備名稱。在以前,這并不是很難。一臺設備總是在某個固定的位置,也不會 挪動它。類 Unix 的系統喜歡設備那樣安排。之前在開發 Unix 系統的時候,“更改一個磁盤驅動器”要用一輛 叉車從機房中移除一臺如洗衣機大小的設備。最近幾年,典型的桌面硬件配置已經變得相當動態,并且 Linux 已經發展地比其祖先更加靈活。在以上事例中,我們利用現代 Linux 桌面系統的功能來“自動地”掛載 設備,然后再確定設備名稱。但是如果我們正在管理一臺服務器或者是其它一些(這種自動掛載功能)不會 發生的環境,我們又如何能查清設備名呢?
首先,讓我們看一下系統怎樣來命名設備。如果我們列出目錄/dev(所有設備的住所)的內容,我們 會看到許許多多的設備:
~~~
[me@linuxbox ~]$ ls /dev
~~~
這個列表的內容揭示了一些設備命名的模式。這里有幾個:
表16-2: Linux 存儲設備名稱
| 模式 | 設備 |
|---------|------------|
| /dev/fd* | 軟盤驅動器 |
| /dev/hd* | 老系統中的 IDE(PATA)磁盤。典型的主板包含兩個 IDE 連接器或者是通道,每個連接器 帶有一根纜線,每根纜線上有兩個硬盤驅動器連接點。纜線上的第一個驅動器叫做主設備, 第二個叫做從設備。設備名稱這樣安排,/dev/hdb 是指第一通道上的主設備名;/dev/hdb 是第一通道上的從設備名;/dev/hdc 是第二通道上的主設備名,等等。末尾的數字表示 硬盤驅動器上的分區。例如,/dev/hda1是指系統中第一硬盤驅動器上的第一個分區,而 /dev/hda 則是指整個硬盤驅動器。 |
| /dev/lp* | 打印機 |
| /dev/sd* | SCSI 磁盤。在最近的 Linux 系統中,內核把所有類似于磁盤的設備(包括 PATA/SATA 硬盤, 閃存,和 USB 存儲設備,比如說可移動的音樂播放器和數碼相機)看作 SCSI 磁盤。 剩下的命名系統類似于上述所描述的舊的/dev/hd*命名方案。 |
| /dev/sr* | 光盤(CD/DVD 讀取器和燒寫器) |
另外,我們經常看到符號鏈接比如說/dev/cdrom,/dev/dvd 和/dev/floppy,它們指向實際的 設備文件,提供這些鏈接是為了方便使用。如果你工作的系統不能自動掛載可移動的設備,你可以使用 下面的技巧來決定當可移動設備連接后,它是怎樣被命名的。首先,啟動一個實時查看文件/var/log/messages (你可能需要超級用戶權限):
~~~
[me@linuxbox ~]$ sudo tail -f /var/log/messages
~~~
這個文件的最后幾行會被顯示,然后停止。下一步,插入這個可移動的設備。在 這個例子里,我們將使用一個16MB 閃存。瞬間,內核就會發現這個設備, 并且探測它:
~~~
Jul 23 10:07:53 linuxbox kernel: usb 3-2: new full speed USB device
using uhci_hcd and address 2
Jul 23 10:07:53 linuxbox kernel: usb 3-2: configuration #1 chosen
from 1 choice
Jul 23 10:07:53 linuxbox kernel: scsi3 : SCSI emulation for USB Mass
Storage devices
Jul 23 10:07:58 linuxbox kernel: scsi scan: INQUIRY result too short
(5), using 36
Jul 23 10:07:58 linuxbox kernel: scsi 3:0:0:0: Direct-Access Easy
Disk 1.00 PQ: 0 ANSI: 2
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte
hardware sectors (16 MB)
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Write Protect is
off
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Assuming drive
cache: write through
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte
hardware sectors (16 MB)
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Write Protect is
off
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Assuming drive
cache: write through
Jul 23 10:07:59 linuxbox kernel: sdb: sdb1
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI
removable disk
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: Attached scsi generic
sg3 type 0
~~~
顯示再次停止之后,輸入 Ctrl-c,重新得到提示符。輸出結果的有趣部分是一再提及“[sdb]”, 這正好符和我們期望的 SCSI 磁盤設備名稱。知道這一點后,有兩行輸出變得頗具啟發性:
~~~
Jul 23 10:07:59 linuxbox kernel: sdb: sdb1
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI
removable disk
~~~
這告訴我們這個設備名稱是/dev/sdb 指整個設備,/dev/sdb1是這個設備的第一分區。 正如我們所看到的,使用 Linux 系統充滿了有趣的監測工作。
小貼士:使用這個 tail -f /var/log/messages 技巧是一個很不錯的方法,可以實時 觀察系統的一舉一動。
既然知道了設備名稱,我們就可以掛載這個閃存驅動器了:
~~~
[me@linuxbox ~]$ sudo mkdir /mnt/flash
[me@linuxbox ~]$ sudo mount /dev/sdb1 /mnt/flash
[me@linuxbox ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 15115452 5186944 9775164 35% /
/dev/sda5 59631908 31777376 24776480 57% /home
/dev/sda1 147764 17277 122858 13% /boot
tmpfs 776808 0 776808 0% /dev/shm
/dev/sdb1 15560 0 15560 0% /mnt/flash
~~~
這個設備名稱會保持不變只要設備與計算機保持連接并且計算機不會重新啟動。
## 創建新的文件系統
假若我們想要用 Linux 本地文件系統來重新格式化這個閃存驅動器,而不是它現用的 FAT32系統。 這涉及到兩個步驟:1.(可選的)創建一個新的分區布局若已存在的分區不是我們喜歡的。2\. 在這個閃存上創建一個新的空的文件系統。
注意!在下面的練習中,我們將要格式化一個閃存驅動器。拿一個不包含有用數據的驅動器 作為實驗品,因為它將會被擦除!再次,請確定你指定了正確的系統設備名稱。未能注意此 警告可能導致你格式化(即擦除)錯誤的驅動器!
## 用 fdisk 命令操作分區
這個 fdisk 程序允許我們直接在底層與類似磁盤的設備(比如說硬盤驅動器和閃存驅動器)進行交互。 使用這個工具可以在設備上編輯,刪除,和創建分區。以我們的閃存驅動器為例, 首先我們必須卸載它(如果需要的話),然后調用 fdisk 程序,如下所示:
~~~
[me@linuxbox ~]$ sudo umount /dev/sdb1
[me@linuxbox ~]$ sudo fdisk /dev/sdb
~~~
注意我們必須指定設備名稱,就整個設備而言,而不是通過分區號。這個程序啟動后,我們 將看到以下提示:
~~~
Command (m for help):
~~~
輸入”m”會顯示程序菜單:
~~~
Command action
a toggle a bootable flag
....
~~~
我們想要做的第一件事情是檢查已存在的分區布局。輸入”p”會打印出這個設備的分區表:
~~~
Command (m for help): p
Disk /dev/sdb: 16 MB, 16006656 bytes
1 heads, 31 sectors/track, 1008 cylinders
Units = cylinders of 31 * 512 = 15872 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 2 1008 15608+ b w95 FAT32
~~~
在此例中,我們看到一個16MB 的設備只有一個分區(1),此分區占用了可用的1008個柱面中的1006個, 并被標識為 Windows 95 FAT32分區。有些程序會使用這個標志符來限制一些可以對磁盤所做的操作, 但大多數情況下更改這個標志符沒有危害。然而,為了敘述方便,我們將會更改它, 以此來表明是個 Linux 分區。在更改之前,首先我們必須找到被用來識別一個 Linux 分區的 ID 號碼。 在上面列表中,我們看到 ID 號碼“b”被用來指定這個已存在的分區。要查看可用的分區類型列表, 參考之前的程序菜單。我們會看到以下選項:
~~~
l list known partition types
~~~
如果我們在提示符下輸入“l”,就會顯示一個很長的可能類型列表。在它們之中會看到“b”為已存在分區 類型的 ID 號,而“83”是針對 Linux 系統的 ID 號。
回到之前的菜單,看到這個選項來更改分區 ID 號:
~~~
t change a partition's system id
~~~
我們先輸入“t”,再輸入新的 ID 號:
~~~
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 83
Changed system type of partition 1 to 83 (Linux)
~~~
這就完成了我們需要做得所有修改。到目前為止,還沒有接觸這個設備(所有修改都存儲在內存中, 而不是在此物理設備中),所以我們將會把修改過的分區表寫入此設備,再退出。為此,我們輸入 在提示符下輸入”w”:
~~~
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
[me@linuxbox ~]$
~~~
如果我們已經決定保持設備不變,可在提示符下輸入”q”,這將退出程序而沒有寫更改。我們 可以安全地忽略這些不祥的警告信息。
## 用 mkfs 命令創建一個新的文件系統
完成了分區編輯工作(它或許是輕量級的),是時候在我們的閃存驅動器上創建一個新的文件系統了。 為此,我們會使用 mkfs(”make file system”的簡寫),它能創建各種格式的文件系統。 在此設備上創建一個 ext3文件系統,我們使用”-t” 選項來指定這個”ext3”系統類型,隨后是我們要格式化的設備分區名稱:
~~~
[me@linuxbox ~]$ sudo mkfs -t ext3 /dev/sdb1
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
3904 inodes, 15608 blocks
780 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=15990784
2 block groups
8192 blocks per group, 8192 fragments per group
1952 inodes per group
Superblock backups stored on blocks:
8193
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[me@linuxbox ~]$
~~~
當 ext3被選為文件系統類型時,這個程序會顯示許多信息。若把這個設備重新格式化為它最初的 FAT32文件 系統,指定”vfat”作為文件系統類型:
~~~
[me@linuxbox ~]$ sudo mkfs -t vfat /dev/sdb1
~~~
任何時候添加額外的存儲設備到系統中時,都可以使用這個分區和格式化的過程。雖然我們 只以一個小小的閃存驅動器為例,同樣的操作可以被應用到內部硬盤和其它可移動的存儲設備上 像 USB 硬盤驅動器。
## 測試和修復文件系統
在之前討論文件/etc/fstab 時,我們會在每行的末尾看到一些神秘的數字。每次系統啟動時, 在掛載系統之前,都會按照慣例檢查文件系統的完整性。這個任務由 fsck 程序(是”file system check”的簡寫)完成。每個 fstab 項中的最后一個數字指定了設備的檢查順序。 在上面的實例中,我們看到首先檢查根文件系統,然后是 home 和 boot 文件系統。若最后一個數字 是零則相應設備不會被檢查。
除了檢查文件系統的完整性之外,fsck 還能修復受損的文件系統,其成功度依賴于損壞的數量。 在類 Unix 的文件系統中,文件恢復的部分被放置于 lost+found 目錄里面,位于每個文件 系統的根目錄下面。
檢查我們的閃存驅動器(首先應該卸載),我們能執行下面的操作:
~~~
[me@linuxbox ~]$ sudo fsck /dev/sdb1
fsck 1.40.8 (13-Mar-2008)
e2fsck 1.40.8 (13-Mar-2008)
/dev/sdb1: clean, 11/3904 files, 1661/15608 blocks
~~~
以我的經驗,文件系統損壞情況相當罕見,除非硬件存在問題,如磁盤驅動器故障。 在大多數系統中,系統啟動階段若探測到文件系統已經損壞了,則會導致系統停止下來, 在系統繼續執行之前,會指導你運行 fsck 程序。
> 什么是 fsck?
>
> 在 Unix 文化中,”fsck”這個單詞往往會被用來代替一個流行的詞,“fsck”和這個詞共享了三個 字母。這個尤其適用,因為你可能會說出上文提到的詞,若你發現自己處于這種境況下, 被強制來運行 fsck 命令時。
## 格式化軟盤
對于那些還在使用配備了軟盤驅動器的計算機的用戶,我們也能管理這些設備。準備一 張可用的空白軟盤要分兩個步驟。首先,對這張軟盤執行低級格式化,然后創建一個文件系統。 為了完成格式化,我們使用 fdformat 程序,同時指定軟盤設備名稱(通常為/dev/fd0):
~~~
[me@linuxbox ~]$ sudo fdformat /dev/fd0
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done
~~~
接下來,通過 mkfs 命令,給這個軟盤創建一個 FAT 文件系統:
~~~
[me@linuxbox ~]$ sudo mkfs -t msdos /dev/fd0
~~~
注意我們使用這個“msdos”文件系統類型來得到舊(小的)風格的文件分配表。當一個軟磁盤 被準備好之后,則可能像其它設備一樣掛載它。
## 直接把數據移入/出設備
雖然我們通常認為計算機中的數據以文件形式來組織數據,也可以“原始的”形式來考慮數據。 如果我們看一下磁盤驅動器,例如, 我們看到它由大量的數據“塊”組成,而操作系統卻把這些數據塊看作目錄和文件。然而,如果 把磁盤驅動器簡單地看成一個數據塊大集合,我們就能執行有用的任務,如克隆設備。
這個 dd 程序能執行此任務。它可以把數據塊從一個地方復制到另一個地方。它使用獨特的語法(由于歷史原因) ,經常它被這樣使用:
~~~
dd if=input_file of=output_file [bs=block_size [count=blocks]]
~~~
比方說我們有兩個相同容量的 USB 閃存驅動器,并且要精確地把第一個驅動器(中的內容) 復制給第二個。如果連接兩個設備到計算機上,它們各自被分配到設備/dev/sdb 和 /dev/sdc 上,這樣我們就能通過下面的命令把第一個驅動器中的所有數據復制到第二個 驅動器中。
~~~
dd if=/dev/sdb of=/dev/sdc
~~~
或者,如果只有第一個驅動器被連接到計算機上,我們可以把它的內容復制到一個普通文件中供 以后恢復或復制數據:
~~~
dd if=/dev/sdb of=flash_drive.img
~~~
* * *
警告!這個 dd 命令非常強大。雖然它的名字來自于“數據定義”,有時候也把它叫做“清除磁盤” 因為用戶經常會誤輸入 if 或 of 的規范。在按下回車鍵之前,要再三檢查輸入與輸出規范!
* * *
## 創建 CD-ROM 映像
寫入一個可記錄的 CD-ROM(一個 CD-R 或者是 CD-RW)由兩步組成;首先,構建一個 iso 映像文件, 這就是一個 CD-ROM 的文件系統映像,第二步,把這個映像文件寫入到 CD-ROM 媒介中。
### 創建一個 CD-ROM 的映像拷貝
如果想要制作一張現有 CD-ROM 的 iso 映像,我們可以使用 dd 命令來讀取 CD-ROW 中的所有數據塊, 并把它們復制到本地文件中。比如說我們有一張 Ubuntu CD,用它來制作一個 iso 文件,以后我們可以用它來制作更多的拷貝。插入這張 CD 之后,確定 它的設備名稱(假定是/dev/cdrom),然后像這樣來制作 iso 文件:
~~~
dd if=/dev/cdrom of=ubuntu.iso
~~~
這項技術也適用于 DVD 光盤,但是不能用于音頻 CD,因為它們不使用文件系統來存儲數據。 對于音頻 CD,看一下 cdrdao 命令。
### 從文件集合中創建一個映像
創建一個包含目錄內容的 iso 映像文件,我們使用 genisoimage 程序。為此,我們首先創建 一個目錄,這個目錄中包含了要包括到此映像中的所有文件,然后執行這個 genisoimage 命令 來創建映像文件。例如,如果我們已經創建一個叫做~/cd-rom-files 的目錄,然后用文件 填充此目錄,再通過下面的命令來創建一個叫做 cd-rom.iso 映像文件:
~~~
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files
~~~
“-R”選項添加元數據為 Rock Ridge 擴展,這允許使用長文件名和 POSIX 風格的文件權限。 同樣地,這個”-J”選項使 Joliet 擴展生效,這樣 Windows 中就支持長文件名了。
> 一個有著其它名字的程序。。。
>
> 如果你看一下關于創建和燒寫光介質如 CD-ROMs 和 DVD 的在線文檔,你會經常碰到兩個程序 叫做 mkisofs 和 cdrecord。這些程序是流行軟件包”cdrtools”的一部分,”cdrtools”由 Jorg Schilling 編寫成。在2006年春天,Schilling 先生更改了部分 cdrtools 軟件包的協議,Linux 社區許多人的看法是, 這創建了一個與 GNU GPL 不相兼容的協議。結果,就 fork 了這個 cdrtools 項目, 目前新項目里面包含了 cdrecord 和 mkisofs 的替代程序,分別是 wodim 和 genisoimage。
## 寫入 CD-ROM 鏡像
有了一個映像文件之后,我們可以把它燒寫到光盤中。下面討論的大多數命令對可 記錄的 CD-ROW 和 DVD 媒介都適用。
### 直接掛載一個 ISO 鏡像
有一個訣竅,我們可以用它來掛載 iso 映像文件,雖然此文件仍然在我們的硬盤中,但我們 當作它已經在光盤中了。添加 “-o loop” 選項來掛載(同時帶有必需的 “-t iso9660” 文件系統類型), 掛載這個映像文件就好像它是一臺設備,把它連接到文件系統樹上:
~~~
mkdir /mnt/iso_image
mount -t iso9660 -o loop image.iso /mnt/iso_image
~~~
上面的示例中,我們創建了一個掛載點叫做/mnt/iso_image,然后把此映像文件 image.iso 掛載到掛載點上。映像文件被掛載之后,可以把它當作,就好像它是一張 真正的 CD-ROM 或者 DVD。當不再需要此映像文件后,記得卸載它。
### 清除一張可重寫入的 CD-ROM
可重寫入的 CD-RW 媒介在被重使用之前需要擦除或清空。為此,我們可以用 wodim 命令,指定 設備名稱和清空的類型。此 wodim 程序提供了幾種清空類型。最小(且最快)的是 “fast” 類型:
~~~
wodim dev=/dev/cdrw blank=fast
~~~
### 寫入鏡像
寫入一個映像文件,我們再次使用 wodim 命令,指定光盤設備名稱和映像文件名:
~~~
wodim dev=/dev/cdrw image.iso
~~~
除了設備名稱和映像文件之外,wodim 命令還支持非常多的選項。常見的兩個選項是,”-v” 可詳細輸出, 和 “-dao” 以 disk-at-once 模式寫入光盤。如果你正在準備一張光盤為的是商業復制,那么應該使用這種模式。 wodim 命令的默認模式是 track-at-once,這對于錄制音樂很有用。
## 拓展閱讀
我們剛才談到了很多方法,可以使用命令行管理存儲介質。看看我們所講過命令的手冊頁。 一些命令支持大量的選項和操作。此外,尋找一些如何添加硬盤驅動器到 Linux 系統(有許多)的在線教程, 這些教程也要適用于光介質存儲設備。
## 友情提示
通常驗證一下我們已經下載的 iso 映像文件的完整性很有用處。在大多數情況下,iso 映像文件的貢獻者也會提供 一個 checksum 文件。一個 checksum 是一個神奇的數學運算的計算結果,這個數學計算會產生一個能表示目標文件內容的數字。 如果目標文件的內容即使更改一個二進制位,checksum 的結果將會非常不一樣。 生成 checksum 數字的最常見方法是使用 md5sum 程序。當你使用 md5sum 程序的時候, 它會產生一個獨一無二的十六進制數字:
~~~
md5sum image.iso
34e354760f9bb7fbf85c96f6a3f94ece image.iso
~~~
當你下載完映像文件之后,你應該對映像文件執行 md5sum 命令,然后把運行結果與發行商提供的 md5sum 數值作比較。
除了檢查下載文件的完整性之外,我們也可以使用 md5sum 程序驗證新寫入的光學存儲介質。 為此,首先我們計算映像文件的 checksum 數值,然后計算此光學存儲介質的 checksum 數值。 這種驗證光學介質的技巧是限定只對 光學存儲介質中包含映像文件的部分計算 checksum 數值。 通過確定映像文件所包含的 2048 個字節塊的數目(光學存儲介質總是以 2048 個字節塊的方式寫入) 并從存儲介質中讀取那么多的字節塊,我們就可以完成操作。 某些類型的存儲介質,并不需要這樣做。一個以 disk-at-once 模式寫入的 CD-R,可以用下面的方式檢驗:
~~~
md5sum /dev/cdrom
34e354760f9bb7fbf85c96f6a3f94ece /dev/cdrom
~~~
許多存儲介質類型,如 DVD 需要精確地計算字節塊的數目。在下面的例子中,我們檢驗了映像文件 dvd-image.iso 以及 DVD 光驅中磁盤 /dev/dvd 文件的完整性。你能弄明白這是怎么回事嗎?
~~~
md5sum dvd-image.iso; dd if=/dev/dvd bs=2048 count=$(( $(stat -c "%s" dvd-image.iso) / 2048 )) | md5sum
~~~
- 第一章:引言
- 第二章:什么是shell
- 第三章:文件系統中跳轉
- 第四章:研究操作系統
- 第五章:操作文件和目錄
- 第六章:使用命令
- 第七章:重定向
- 第八章:從shell眼中看世界
- 第九章:鍵盤高級操作技巧
- 第十章:權限
- 第十一章:進程
- 第十二章:shell環境
- 第十三章:VI簡介
- 第十四章:自定制shell提示符
- 第十五章:軟件包管理
- 第十六章:存儲媒介
- 第十七章:網絡系統
- 第十八章:查找文件
- 第十九章:歸檔和備份
- 第二十章:正則表達式
- 第二十一章:文本處理
- 第二十二章:格式化輸出
- 第二十三章:打印
- 第二十四章:編譯程序
- 第二十五章:編寫第一個shell腳本
- 第二十六章:啟動一個項目
- 第二十七章:自頂向下設計
- 第二十八章:流程控制 if分支結構
- 第二十九章:讀取鍵盤輸入
- 第三十章:流程控制 while/until 循環
- 第三十一章:疑難排解
- 第三十二章:流程控制 case分支
- 第三十三章:位置參數
- 第三十四章:流程控制 for循環
- 第三十五章:字符串和數字
- 第三十六章:數組
- 第三十七章:奇珍異寶