在前面章節(jié)中,我們已經(jīng)從文件級(jí)別看了操作數(shù)據(jù)。在這章里,我們將從設(shè)備級(jí)別來(lái)考慮數(shù)據(jù)。 Linux 有著令人驚奇的能力來(lái)處理存儲(chǔ)設(shè)備,不管是物理設(shè)備,比如說(shuō)硬盤,還是網(wǎng)絡(luò)設(shè)備,或者是 虛擬存儲(chǔ)設(shè)備,像 RAID(獨(dú)立磁盤冗余陣列)和 LVM(邏輯卷管理器)。
然而,這不是一本關(guān)于系統(tǒng)管理的書(shū)籍,我們不會(huì)試圖深入地覆蓋整個(gè)主題。我們將努力做的就是 介紹一些概念和用來(lái)管理存儲(chǔ)設(shè)備的重要命令。
我們將會(huì)使用 USB 閃存,CD-RW 光盤(因?yàn)橄到y(tǒng)配備了 CD-ROM 燒寫(xiě)器)和一張軟盤(若系統(tǒng)這樣配備), 來(lái)做這章的練習(xí)題。
我們將看看以下命令:
mount – 掛載一個(gè)文件系統(tǒng)
umount – 卸載一個(gè)文件系統(tǒng)
fsck – 檢查和修復(fù)一個(gè)文件系統(tǒng)
fdisk – 分區(qū)表控制器
mkfs – 創(chuàng)建文件系統(tǒng)
fdformat – 格式化一張軟盤
dd — 把面向塊的數(shù)據(jù)直接寫(xiě)入設(shè)備
genisoimage (mkisofs) – 創(chuàng)建一個(gè) ISO 9660的映像文件
wodim (cdrecord) – 把數(shù)據(jù)寫(xiě)入光存儲(chǔ)媒介
Linux 桌面系統(tǒng)的最新進(jìn)展已經(jīng)使存儲(chǔ)設(shè)備管理對(duì)于桌面用戶來(lái)說(shuō)極其容易。大多數(shù)情況下,我們 只要把設(shè)備連接到系統(tǒng)中,它就能工作。在過(guò)去(比如說(shuō),2004年),這個(gè)工作必須手動(dòng)完成。 在非桌面系統(tǒng)中(例如,服務(wù)器中),這仍然是一個(gè)主要地手動(dòng)過(guò)程,因?yàn)榉?wù)器經(jīng)常有極端的存儲(chǔ)需求 和復(fù)雜的配置要求。
管理存儲(chǔ)設(shè)備的第一步是把設(shè)備連接到文件系統(tǒng)樹(shù)中。這個(gè)過(guò)程叫做掛載,允許設(shè)備參與到操作系統(tǒng)中。 回想一下第三章,類 Unix 的操作系統(tǒng),像 Linux,維護(hù)單一文件系統(tǒng)樹(shù),設(shè)備連接到各個(gè)結(jié)點(diǎn)上。 這與其它操作系統(tǒng)形成對(duì)照,比如說(shuō) MS-DOS 和 Windows 系統(tǒng)中,每個(gè)設(shè)備(例如 C:\,D:\,等) 保持著單獨(dú)的文件系統(tǒng)樹(shù)。
有一個(gè)叫做/etc/fstab 的文件可以列出系統(tǒng)啟動(dòng)時(shí)要掛載的設(shè)備(典型地,硬盤分區(qū))。下面是 來(lái)自于 Fedora 7系統(tǒng)的/etc/fstab 文件實(shí)例:
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
在這個(gè)實(shí)例中所列出的大多數(shù)文件系統(tǒng)是虛擬的,并不適用于我們的討論。就我們的目的而言, 前三個(gè)是我們感興趣的:
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
這些是硬盤分區(qū)。每行由六個(gè)字段組成,如下所示:
| 字段 | 內(nèi)容 | 說(shuō)明 |
|---|---|---|
| 1 | 設(shè)備名 | 傳統(tǒng)上,這個(gè)字段包含與物理設(shè)備相關(guān)聯(lián)的設(shè)備文件的實(shí)際名字,比如說(shuō)/dev/hda1(第一個(gè) IDE 通道上第一個(gè)主設(shè)備分區(qū))。然而今天的計(jì)算機(jī),有很多熱插拔設(shè)備(像 USB 驅(qū)動(dòng)設(shè)備),許多 現(xiàn)代的 Linux 發(fā)行版用一個(gè)文本標(biāo)簽和設(shè)備相關(guān)聯(lián)。當(dāng)這個(gè)設(shè)備連接到系統(tǒng)中時(shí), 這個(gè)標(biāo)簽(當(dāng)儲(chǔ)存媒介格式化時(shí),這個(gè)標(biāo)簽會(huì)被添加到存儲(chǔ)媒介中)會(huì)被操作系統(tǒng)讀取。 那樣的話,不管賦給實(shí)際物理設(shè)備哪個(gè)設(shè)備文件,這個(gè)設(shè)備仍然能被系統(tǒng)正確地識(shí)別。 |
| 2 | 掛載點(diǎn) | 設(shè)備所連接到的文件系統(tǒng)樹(shù)的目錄。 |
| 3 | 文件系統(tǒng)類型 | Linux 允許掛載許多文件系統(tǒng)類型。大多數(shù)本地的 Linux 文件系統(tǒng)是 ext3, 但是也支持很多其它的,比方說(shuō) FAT16 (msdos), FAT32 (vfat),NTFS (ntfs),CD-ROM (iso9660),等等。 |
| 4 | 選項(xiàng) | 文件系統(tǒng)可以通過(guò)各種各樣的選項(xiàng)來(lái)掛載。有可能,例如,掛載只讀的文件系統(tǒng), 或者掛載阻止執(zhí)行任何程序的文件系統(tǒng)(一個(gè)有用的安全特性,避免刪除媒介。) |
| 5 | 頻率 | 一位數(shù)字,指定是否和在什么時(shí)間用 dump 命令來(lái)備份一個(gè)文件系統(tǒng)。 |
| 6 | 次序 | 一位數(shù)字,指定 fsck 命令按照什么次序來(lái)檢查文件系統(tǒng)。 |
這個(gè) mount 命令被用來(lái)掛載文件系統(tǒng)。執(zhí)行這個(gè)不帶參數(shù)的命令,將會(huì)顯示 一系列當(dāng)前掛載的文件系統(tǒng):
[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)
這個(gè)列表的格式是:設(shè)備 on 掛載點(diǎn) type 文件系統(tǒng)類型(可選的)。例如,第一行所示設(shè)備/dev/sda2 作為根文件系統(tǒng)被掛載,文件系統(tǒng)類型是 ext3,并且可讀可寫(xiě)(這個(gè)“rw”選項(xiàng))。在這個(gè)列表的底部有 兩個(gè)有趣的條目。倒數(shù)第二行顯示了在讀卡器中的一張2G 的 SD 內(nèi)存卡,掛載到了/media/disk 上。最后一行 是一個(gè)網(wǎng)絡(luò)設(shè)備,掛載到了/misc/musicbox 上。
第一次實(shí)驗(yàn),我們將使用一張 CD-ROM。首先,在插入 CD-ROW 之前,我們將看一下系統(tǒng):
[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)
這個(gè)列表來(lái)自于 CentOS 5系統(tǒng),使用 LVM(邏輯卷管理器)來(lái)創(chuàng)建它的根文件系統(tǒng)。正如許多現(xiàn)在的 Linux 發(fā)行版一樣,這個(gè) 系統(tǒng)試圖自動(dòng)掛載插入的 CD-ROM。當(dāng)我們插入光盤后,我們看看下面的輸出:
[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)
當(dāng)我們插入光盤后,除了額外的一行之外,我們看到和原來(lái)一樣的列表。在列表的末尾,我們 看到 CD-ROW 已經(jīng)掛載到了/media/live-1.0.10-8上,它的文件類型是 iso9660(CD-ROW)。 就我們的實(shí)驗(yàn)?zāi)康亩裕覀儗?duì)這個(gè)設(shè)備的名字感興趣。當(dāng)你自己進(jìn)行這個(gè)實(shí)驗(yàn)時(shí),這個(gè) 設(shè)備名字是最有可能不同的。
警告:在隨后的實(shí)例中,至關(guān)重要的是你要密切注意用在你系統(tǒng)中的實(shí)際設(shè)備名,并且 不要使用此文本中使用的名字!
還要注意音頻 CD 和 CD-ROW 不一樣。音頻 CD 不包含文件系統(tǒng),這樣在通常意義上,它就不能被掛載了。
現(xiàn)在我們擁有 CD-ROW 光盤的設(shè)備名字,讓我們卸載這張光盤,并把它重新掛載到文件系統(tǒng)樹(shù) 的另一個(gè)位置。我們需要超級(jí)用戶身份(使用系統(tǒng)相應(yīng)的命令)來(lái)進(jìn)行操作,并且用 umount(注意這個(gè)命令的拼寫(xiě))來(lái)卸載光盤:
[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]# umount /dev/hdc
下一步是創(chuàng)建一個(gè)新的光盤掛載點(diǎn)。簡(jiǎn)單地說(shuō),一個(gè)掛載點(diǎn)就是文件系統(tǒng)樹(shù)中的一個(gè)目錄。它沒(méi)有 什么特殊的。它甚至不必是一個(gè)空目錄,即使你把設(shè)備掛載到了一個(gè)非空目錄上,你也不能看到 這個(gè)目錄中原來(lái)的內(nèi)容,直到你卸載這個(gè)設(shè)備。就我們的目的而言,我們將創(chuàng)建一個(gè)新目錄:
[root@linuxbox ~]# mkdir /mnt/cdrom
最后,我們把這個(gè) CD-ROW 掛載到一個(gè)新的掛載點(diǎn)上。這個(gè)-t 選項(xiàng)用來(lái)指定文件系統(tǒng)類型:
[root@linuxbox ~]# mount -t iso9660 /dev/hdc /mnt/cdrom
之后,我們可以通過(guò)這個(gè)新掛載點(diǎn)來(lái)查看 CD-ROW 的內(nèi)容:
[root@linuxbox ~]# cd /mnt/cdrom
[root@linuxbox cdrom]# ls
注意當(dāng)我們?cè)噲D卸載這個(gè) CD-ROW 時(shí),發(fā)生了什么事情。
[root@linuxbox cdrom]# umount /dev/hdc
umount: /mnt/cdrom: device is busy
這是怎么回事呢?原因是我們不能卸載一個(gè)設(shè)備,如果某個(gè)用戶或進(jìn)程正在使用這個(gè)設(shè)備的話。在這種 情況下,我們把工作目錄更改到了 CD-ROW 的掛載點(diǎn),這個(gè)掛載點(diǎn)導(dǎo)致設(shè)備忙碌。我們可以很容易地修復(fù)這個(gè)問(wèn)題 通過(guò)把工作目錄改到其它目錄而不是這個(gè)掛載點(diǎn)。
[root@linuxbox cdrom]# cd
[root@linuxbox ~]# umount /dev/hdc
現(xiàn)在這個(gè)設(shè)備成功卸載了。
為什么卸載重要
如果你看一下 free 命令的輸出結(jié)果,這個(gè)命令用來(lái)顯示關(guān)于內(nèi)存使用情況的統(tǒng)計(jì)信息,你 會(huì)看到一個(gè)統(tǒng)計(jì)值叫做”buffers“。計(jì)算機(jī)系統(tǒng)旨在盡可能快地運(yùn)行。系統(tǒng)運(yùn)行速度的 一個(gè)阻礙是緩慢的設(shè)備。打印機(jī)是一個(gè)很好的例子。即使最快速的打印機(jī)相比于計(jì)算機(jī)標(biāo)準(zhǔn)也 極其地緩慢。一臺(tái)計(jì)算機(jī)確實(shí)會(huì)運(yùn)行地非常慢,如果它要停下來(lái)等待一臺(tái)打印機(jī)打印完一頁(yè)。 在早期的個(gè)人電腦時(shí)代(多任務(wù)之前),這真是個(gè)問(wèn)題。如果你正在編輯電子表格 或者是文本文檔,每次你要打印文件時(shí),計(jì)算機(jī)都會(huì)停下來(lái)而且變得不能使用。 計(jì)算機(jī)能以打印機(jī)可接受的最快速度把數(shù)據(jù)發(fā)送給打印機(jī),但由于打印機(jī)不能快速地打印, 這個(gè)發(fā)送速度會(huì)非常慢。這個(gè)問(wèn)題被解決了,由于打印機(jī)緩存的出現(xiàn),一個(gè)包含一些 RAM 內(nèi)存 的設(shè)備,位于計(jì)算機(jī)和打印機(jī)之間。通過(guò)打印機(jī)緩存,計(jì)算機(jī)把要打印的結(jié)果發(fā)送到這個(gè)緩存區(qū), 數(shù)據(jù)會(huì)迅速地存儲(chǔ)到這個(gè) RAM 中,這樣計(jì)算機(jī)就能回去工作,而不用等待。與此同時(shí),打印機(jī)緩存將會(huì) 以打印機(jī)可接受的速度把緩存中的數(shù)據(jù)緩慢地輸出給打印機(jī)。
緩存被廣泛地應(yīng)用于計(jì)算機(jī)中,使其運(yùn)行地更快。別讓偶爾地需要讀取或?qū)懭肼O(shè)備阻礙了 系統(tǒng)的運(yùn)行速度。在實(shí)際與慢設(shè)備交互之前,操作系統(tǒng)會(huì)盡可能多的讀取或?qū)懭霐?shù)據(jù)到內(nèi)存中的 存儲(chǔ)設(shè)備里。以 Linux 操作系統(tǒng)為例,你會(huì)注意到系統(tǒng)看似填充了多于它所需要的內(nèi)存。 這不意味著 Linux 正在使用所有的內(nèi)存,它意味著 Linux 正在利用所有可用的內(nèi)存,來(lái)作為緩存區(qū)。
這個(gè)緩存區(qū)允許非常快速地寫(xiě)入存儲(chǔ)設(shè)備,因?yàn)閷?xiě)入物理設(shè)備的操作被延遲到后面進(jìn)行。同時(shí), 這些注定要傳送到設(shè)備中的數(shù)據(jù)正在內(nèi)存中堆積起來(lái)。時(shí)不時(shí)地,操作系統(tǒng)會(huì)把這些數(shù)據(jù) 寫(xiě)入物理設(shè)備。
卸載一個(gè)設(shè)備需要把所有剩余的數(shù)據(jù)寫(xiě)入這個(gè)設(shè)備,所以設(shè)備可以被安全地移除。如果 沒(méi)有卸載設(shè)備,就移除了它,就有可能沒(méi)有把注定要發(fā)送到設(shè)備中的數(shù)據(jù)輸送完畢。在某些情況下, 這些數(shù)據(jù)可能包含重要的目錄更新信息,這將導(dǎo)致文件系統(tǒng)損壞,這是發(fā)生在計(jì)算機(jī)中的最壞的事情之一。
有時(shí)很難來(lái)確定設(shè)備名稱。在以前,這并不是很難。一臺(tái)設(shè)備總是在某個(gè)固定的位置,也不會(huì) 挪動(dòng)它。類 Unix 的系統(tǒng)喜歡設(shè)備那樣安排。之前在開(kāi)發(fā) Unix 系統(tǒng)的時(shí)候,“更改一個(gè)磁盤驅(qū)動(dòng)器”要用一輛 叉車從機(jī)房中移除一臺(tái)如洗衣機(jī)大小的設(shè)備。最近幾年,典型的桌面硬件配置已經(jīng)變得相當(dāng)動(dòng)態(tài),并且 Linux 已經(jīng)發(fā)展地比其祖先更加靈活。在以上事例中,我們利用現(xiàn)代 Linux 桌面系統(tǒng)的功能來(lái)“自動(dòng)地”掛載 設(shè)備,然后再確定設(shè)備名稱。但是如果我們正在管理一臺(tái)服務(wù)器或者是其它一些(這種自動(dòng)掛載功能)不會(huì) 發(fā)生的環(huán)境,我們又如何能查清設(shè)備名呢?
首先,讓我們看一下系統(tǒng)怎樣來(lái)命名設(shè)備。如果我們列出目錄/dev(所有設(shè)備的住所)的內(nèi)容,我們 會(huì)看到許許多多的設(shè)備:
[me@linuxbox ~]$ ls /dev
這個(gè)列表的內(nèi)容揭示了一些設(shè)備命名的模式。這里有幾個(gè):
| 模式 | 設(shè)備 |
|---|---|
| /dev/fd* | 軟盤驅(qū)動(dòng)器 |
| /dev/hd* | 老系統(tǒng)中的 IDE(PATA)磁盤。典型的主板包含兩個(gè) IDE 連接器或者是通道,每個(gè)連接器 帶有一根纜線,每根纜線上有兩個(gè)硬盤驅(qū)動(dòng)器連接點(diǎn)。纜線上的第一個(gè)驅(qū)動(dòng)器叫做主設(shè)備, 第二個(gè)叫做從設(shè)備。設(shè)備名稱這樣安排,/dev/hdb 是指第一通道上的主設(shè)備名;/dev/hdb 是第一通道上的從設(shè)備名;/dev/hdc 是第二通道上的主設(shè)備名,等等。末尾的數(shù)字表示 硬盤驅(qū)動(dòng)器上的分區(qū)。例如,/dev/hda1是指系統(tǒng)中第一硬盤驅(qū)動(dòng)器上的第一個(gè)分區(qū),而 /dev/hda 則是指整個(gè)硬盤驅(qū)動(dòng)器。 |
| /dev/lp* | 打印機(jī) |
| /dev/sd* | SCSI 磁盤。在最近的 Linux 系統(tǒng)中,內(nèi)核把所有類似于磁盤的設(shè)備(包括 PATA/SATA 硬盤, 閃存,和 USB 存儲(chǔ)設(shè)備,比如說(shuō)可移動(dòng)的音樂(lè)播放器和數(shù)碼相機(jī))看作 SCSI 磁盤。 剩下的命名系統(tǒng)類似于上述所描述的舊的/dev/hd*命名方案。 |
| /dev/sr* | 光盤(CD/DVD 讀取器和燒寫(xiě)器) |
另外,我們經(jīng)常看到符號(hào)鏈接比如說(shuō)/dev/cdrom,/dev/dvd 和/dev/floppy,它們指向?qū)嶋H的 設(shè)備文件,提供這些鏈接是為了方便使用。如果你工作的系統(tǒng)不能自動(dòng)掛載可移動(dòng)的設(shè)備,你可以使用 下面的技巧來(lái)決定當(dāng)可移動(dòng)設(shè)備連接后,它是怎樣被命名的。首先,啟動(dòng)一個(gè)實(shí)時(shí)查看文件/var/log/messages (你可能需要超級(jí)用戶權(quán)限):
[me@linuxbox ~]$ sudo tail -f /var/log/messages
這個(gè)文件的最后幾行會(huì)被顯示,然后停止。下一步,插入這個(gè)可移動(dòng)的設(shè)備。在 這個(gè)例子里,我們將使用一個(gè)16MB 閃存。瞬間,內(nèi)核就會(huì)發(fā)現(xiàn)這個(gè)設(shè)備, 并且探測(cè)它:
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,重新得到提示符。輸出結(jié)果的有趣部分是一再提及“[sdb]”, 這正好符和我們期望的 SCSI 磁盤設(shè)備名稱。知道這一點(diǎn)后,有兩行輸出變得頗具啟發(fā)性:
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
這告訴我們這個(gè)設(shè)備名稱是/dev/sdb 指整個(gè)設(shè)備,/dev/sdb1是這個(gè)設(shè)備的第一分區(qū)。 正如我們所看到的,使用 Linux 系統(tǒng)充滿了有趣的監(jiān)測(cè)工作。
小貼士:使用這個(gè) tail -f /var/log/messages 技巧是一個(gè)很不錯(cuò)的方法,可以實(shí)時(shí) 觀察系統(tǒng)的一舉一動(dòng)。
既然知道了設(shè)備名稱,我們就可以掛載這個(gè)閃存驅(qū)動(dòng)器了:
[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
這個(gè)設(shè)備名稱會(huì)保持不變只要設(shè)備與計(jì)算機(jī)保持連接并且計(jì)算機(jī)不會(huì)重新啟動(dòng)。
假若我們想要用 Linux 本地文件系統(tǒng)來(lái)重新格式化這個(gè)閃存驅(qū)動(dòng)器,而不是它現(xiàn)用的 FAT32系統(tǒng)。 這涉及到兩個(gè)步驟:1.(可選的)創(chuàng)建一個(gè)新的分區(qū)布局若已存在的分區(qū)不是我們喜歡的。2. 在這個(gè)閃存上創(chuàng)建一個(gè)新的空的文件系統(tǒng)。
注意!在下面的練習(xí)中,我們將要格式化一個(gè)閃存驅(qū)動(dòng)器。拿一個(gè)不包含有用數(shù)據(jù)的驅(qū)動(dòng)器 作為實(shí)驗(yàn)品,因?yàn)樗鼘?huì)被擦除!再次,請(qǐng)確定你指定了正確的系統(tǒng)設(shè)備名稱。未能注意此 警告可能導(dǎo)致你格式化(即擦除)錯(cuò)誤的驅(qū)動(dòng)器!
這個(gè) fdisk 程序允許我們直接在底層與類似磁盤的設(shè)備(比如說(shuō)硬盤驅(qū)動(dòng)器和閃存驅(qū)動(dòng)器)進(jìn)行交互。 使用這個(gè)工具可以在設(shè)備上編輯,刪除,和創(chuàng)建分區(qū)。以我們的閃存驅(qū)動(dòng)器為例, 首先我們必須卸載它(如果需要的話),然后調(diào)用 fdisk 程序,如下所示:
[me@linuxbox ~]$ sudo umount /dev/sdb1
[me@linuxbox ~]$ sudo fdisk /dev/sdb
注意我們必須指定設(shè)備名稱,就整個(gè)設(shè)備而言,而不是通過(guò)分區(qū)號(hào)。這個(gè)程序啟動(dòng)后,我們 將看到以下提示:
Command (m for help):
輸入"m"會(huì)顯示程序菜單:
Command action
a toggle a bootable flag
....
我們想要做的第一件事情是檢查已存在的分區(qū)布局。輸入"p"會(huì)打印出這個(gè)設(shè)備的分區(qū)表:
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
在此例中,我們看到一個(gè)16MB 的設(shè)備只有一個(gè)分區(qū)(1),此分區(qū)占用了可用的1008個(gè)柱面中的1006個(gè), 并被標(biāo)識(shí)為 Windows 95 FAT32分區(qū)。有些程序會(huì)使用這個(gè)標(biāo)志符來(lái)限制一些可以對(duì)磁盤所做的操作, 但大多數(shù)情況下更改這個(gè)標(biāo)志符沒(méi)有危害。然而,為了敘述方便,我們將會(huì)更改它, 以此來(lái)表明是個(gè) Linux 分區(qū)。在更改之前,首先我們必須找到被用來(lái)識(shí)別一個(gè) Linux 分區(qū)的 ID 號(hào)碼。 在上面列表中,我們看到 ID 號(hào)碼“b”被用來(lái)指定這個(gè)已存在的分區(qū)。要查看可用的分區(qū)類型列表, 參考之前的程序菜單。我們會(huì)看到以下選項(xiàng):
l list known partition types
如果我們?cè)谔崾痉螺斎搿發(fā)”,就會(huì)顯示一個(gè)很長(zhǎng)的可能類型列表。在它們之中會(huì)看到“b”為已存在分區(qū) 類型的 ID 號(hào),而“83”是針對(duì) Linux 系統(tǒng)的 ID 號(hào)。
回到之前的菜單,看到這個(gè)選項(xiàng)來(lái)更改分區(qū) ID 號(hào):
t change a partition's system id
我們先輸入“t”,再輸入新的 ID 號(hào):
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)
這就完成了我們需要做得所有修改。到目前為止,還沒(méi)有接觸這個(gè)設(shè)備(所有修改都存儲(chǔ)在內(nèi)存中, 而不是在此物理設(shè)備中),所以我們將會(huì)把修改過(guò)的分區(qū)表寫(xiě)入此設(shè)備,再退出。為此,我們輸入 在提示符下輸入"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 ~]$
如果我們已經(jīng)決定保持設(shè)備不變,可在提示符下輸入"q",這將退出程序而沒(méi)有寫(xiě)更改。我們 可以安全地忽略這些不祥的警告信息。
完成了分區(qū)編輯工作(它或許是輕量級(jí)的),是時(shí)候在我們的閃存驅(qū)動(dòng)器上創(chuàng)建一個(gè)新的文件系統(tǒng)了。 為此,我們會(huì)使用 mkfs("make file system"的簡(jiǎn)寫(xiě)),它能創(chuàng)建各種格式的文件系統(tǒng)。 在此設(shè)備上創(chuàng)建一個(gè) ext3文件系統(tǒng),我們使用"-t" 選項(xiàng)來(lái)指定這個(gè)"ext3"系統(tǒng)類型,隨后是我們要格式化的設(shè)備分區(qū)名稱:
[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 ~]$
當(dāng) ext3被選為文件系統(tǒng)類型時(shí),這個(gè)程序會(huì)顯示許多信息。若把這個(gè)設(shè)備重新格式化為它最初的 FAT32文件 系統(tǒng),指定"vfat"作為文件系統(tǒng)類型:
[me@linuxbox ~]$ sudo mkfs -t vfat /dev/sdb1
任何時(shí)候添加額外的存儲(chǔ)設(shè)備到系統(tǒng)中時(shí),都可以使用這個(gè)分區(qū)和格式化的過(guò)程。雖然我們 只以一個(gè)小小的閃存驅(qū)動(dòng)器為例,同樣的操作可以被應(yīng)用到內(nèi)部硬盤和其它可移動(dòng)的存儲(chǔ)設(shè)備上 像 USB 硬盤驅(qū)動(dòng)器。
在之前討論文件/etc/fstab 時(shí),我們會(huì)在每行的末尾看到一些神秘的數(shù)字。每次系統(tǒng)啟動(dòng)時(shí), 在掛載系統(tǒng)之前,都會(huì)按照慣例檢查文件系統(tǒng)的完整性。這個(gè)任務(wù)由 fsck 程序(是"file system check"的簡(jiǎn)寫(xiě))完成。每個(gè) fstab 項(xiàng)中的最后一個(gè)數(shù)字指定了設(shè)備的檢查順序。 在上面的實(shí)例中,我們看到首先檢查根文件系統(tǒng),然后是 home 和 boot 文件系統(tǒng)。若最后一個(gè)數(shù)字 是零則相應(yīng)設(shè)備不會(huì)被檢查。
除了檢查文件系統(tǒng)的完整性之外,fsck 還能修復(fù)受損的文件系統(tǒng),其成功度依賴于損壞的數(shù)量。 在類 Unix 的文件系統(tǒng)中,文件恢復(fù)的部分被放置于 lost+found 目錄里面,位于每個(gè)文件 系統(tǒng)的根目錄下面。
檢查我們的閃存驅(qū)動(dòng)器(首先應(yīng)該卸載),我們能執(zhí)行下面的操作:
[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
以我的經(jīng)驗(yàn),文件系統(tǒng)損壞情況相當(dāng)罕見(jiàn),除非硬件存在問(wèn)題,如磁盤驅(qū)動(dòng)器故障。 在大多數(shù)系統(tǒng)中,系統(tǒng)啟動(dòng)階段若探測(cè)到文件系統(tǒng)已經(jīng)損壞了,則會(huì)導(dǎo)致系統(tǒng)停止下來(lái), 在系統(tǒng)繼續(xù)執(zhí)行之前,會(huì)指導(dǎo)你運(yùn)行 fsck 程序。
什么是 fsck?
在 Unix 文化中,"fsck"這個(gè)單詞往往會(huì)被用來(lái)代替一個(gè)流行的詞,“fsck”和這個(gè)詞共享了三個(gè) 字母。這個(gè)尤其適用,因?yàn)槟憧赡軙?huì)說(shuō)出上文提到的詞,若你發(fā)現(xiàn)自己處于這種境況下, 被強(qiáng)制來(lái)運(yùn)行 fsck 命令時(shí)。
對(duì)于那些還在使用配備了軟盤驅(qū)動(dòng)器的計(jì)算機(jī)的用戶,我們也能管理這些設(shè)備。準(zhǔn)備一 張可用的空白軟盤要分兩個(gè)步驟。首先,對(duì)這張軟盤執(zhí)行低級(jí)格式化,然后創(chuàng)建一個(gè)文件系統(tǒng)。 為了完成格式化,我們使用 fdformat 程序,同時(shí)指定軟盤設(shè)備名稱(通常為/dev/fd0):
[me@linuxbox ~]$ sudo fdformat /dev/fd0
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done
接下來(lái),通過(guò) mkfs 命令,給這個(gè)軟盤創(chuàng)建一個(gè) FAT 文件系統(tǒng):
[me@linuxbox ~]$ sudo mkfs -t msdos /dev/fd0
注意我們使用這個(gè)“msdos”文件系統(tǒng)類型來(lái)得到舊(小的)風(fēng)格的文件分配表。當(dāng)一個(gè)軟磁盤 被準(zhǔn)備好之后,則可能像其它設(shè)備一樣掛載它。
雖然我們通常認(rèn)為計(jì)算機(jī)中的數(shù)據(jù)以文件形式來(lái)組織數(shù)據(jù),也可以“原始的”形式來(lái)考慮數(shù)據(jù)。 如果我們看一下磁盤驅(qū)動(dòng)器,例如, 我們看到它由大量的數(shù)據(jù)“塊”組成,而操作系統(tǒng)卻把這些數(shù)據(jù)塊看作目錄和文件。然而,如果 把磁盤驅(qū)動(dòng)器簡(jiǎn)單地看成一個(gè)數(shù)據(jù)塊大集合,我們就能執(zhí)行有用的任務(wù),如克隆設(shè)備。
這個(gè) dd 程序能執(zhí)行此任務(wù)。它可以把數(shù)據(jù)塊從一個(gè)地方復(fù)制到另一個(gè)地方。它使用獨(dú)特的語(yǔ)法(由于歷史原因) ,經(jīng)常它被這樣使用:
dd if=input_file of=output_file [bs=block_size [count=blocks]]
比方說(shuō)我們有兩個(gè)相同容量的 USB 閃存驅(qū)動(dòng)器,并且要精確地把第一個(gè)驅(qū)動(dòng)器(中的內(nèi)容) 復(fù)制給第二個(gè)。如果連接兩個(gè)設(shè)備到計(jì)算機(jī)上,它們各自被分配到設(shè)備/dev/sdb 和 /dev/sdc 上,這樣我們就能通過(guò)下面的命令把第一個(gè)驅(qū)動(dòng)器中的所有數(shù)據(jù)復(fù)制到第二個(gè) 驅(qū)動(dòng)器中。
dd if=/dev/sdb of=/dev/sdc
或者,如果只有第一個(gè)驅(qū)動(dòng)器被連接到計(jì)算機(jī)上,我們可以把它的內(nèi)容復(fù)制到一個(gè)普通文件中供 以后恢復(fù)或復(fù)制數(shù)據(jù):
dd if=/dev/sdb of=flash_drive.img
警告!這個(gè) dd 命令非常強(qiáng)大。雖然它的名字來(lái)自于“數(shù)據(jù)定義”,有時(shí)候也把它叫做“清除磁盤” 因?yàn)橛脩艚?jīng)常會(huì)誤輸入 if 或 of 的規(guī)范。在按下回車鍵之前,要再三檢查輸入與輸出規(guī)范!
寫(xiě)入一個(gè)可記錄的 CD-ROM(一個(gè) CD-R 或者是 CD-RW)由兩步組成;首先,構(gòu)建一個(gè) iso 映像文件, 這就是一個(gè) CD-ROM 的文件系統(tǒng)映像,第二步,把這個(gè)映像文件寫(xiě)入到 CD-ROM 媒介中。
如果想要制作一張現(xiàn)有 CD-ROM 的 iso 映像,我們可以使用 dd 命令來(lái)讀取 CD-ROW 中的所有數(shù)據(jù)塊, 并把它們復(fù)制到本地文件中。比如說(shuō)我們有一張 Ubuntu CD,用它來(lái)制作一個(gè) iso 文件,以后我們可以用它來(lái)制作更多的拷貝。插入這張 CD 之后,確定 它的設(shè)備名稱(假定是/dev/cdrom),然后像這樣來(lái)制作 iso 文件:
dd if=/dev/cdrom of=ubuntu.iso
這項(xiàng)技術(shù)也適用于 DVD 光盤,但是不能用于音頻 CD,因?yàn)樗鼈儾皇褂梦募到y(tǒng)來(lái)存儲(chǔ)數(shù)據(jù)。 對(duì)于音頻 CD,看一下 cdrdao 命令。
創(chuàng)建一個(gè)包含目錄內(nèi)容的 iso 映像文件,我們使用 genisoimage 程序。為此,我們首先創(chuàng)建 一個(gè)目錄,這個(gè)目錄中包含了要包括到此映像中的所有文件,然后執(zhí)行這個(gè) genisoimage 命令 來(lái)創(chuàng)建映像文件。例如,如果我們已經(jīng)創(chuàng)建一個(gè)叫做~/cd-rom-files 的目錄,然后用文件 填充此目錄,再通過(guò)下面的命令來(lái)創(chuàng)建一個(gè)叫做 cd-rom.iso 映像文件:
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files
"-R"選項(xiàng)添加元數(shù)據(jù)為 Rock Ridge 擴(kuò)展,這允許使用長(zhǎng)文件名和 POSIX 風(fēng)格的文件權(quán)限。 同樣地,這個(gè)"-J"選項(xiàng)使 Joliet 擴(kuò)展生效,這樣 Windows 中就支持長(zhǎng)文件名了。
一個(gè)有著其它名字的程序。。。
如果你看一下關(guān)于創(chuàng)建和燒寫(xiě)光介質(zhì)如 CD-ROMs 和 DVD 的在線文檔,你會(huì)經(jīng)常碰到兩個(gè)程序 叫做 mkisofs 和 cdrecord。這些程序是流行軟件包"cdrtools"的一部分,"cdrtools"由 Jorg Schilling 編寫(xiě)成。在2006年春天,Schilling 先生更改了部分 cdrtools 軟件包的協(xié)議,Linux 社區(qū)許多人的看法是, 這創(chuàng)建了一個(gè)與 GNU GPL 不相兼容的協(xié)議。結(jié)果,就 fork 了這個(gè) cdrtools 項(xiàng)目, 目前新項(xiàng)目里面包含了 cdrecord 和 mkisofs 的替代程序,分別是 wodim 和 genisoimage。
有了一個(gè)映像文件之后,我們可以把它燒寫(xiě)到光盤中。下面討論的大多數(shù)命令對(duì)可 記錄的 CD-ROW 和 DVD 媒介都適用。
有一個(gè)訣竅,我們可以用它來(lái)掛載 iso 映像文件,雖然此文件仍然在我們的硬盤中,但我們 當(dāng)作它已經(jīng)在光盤中了。添加 "-o loop" 選項(xiàng)來(lái)掛載(同時(shí)帶有必需的 "-t iso9660" 文件系統(tǒng)類型), 掛載這個(gè)映像文件就好像它是一臺(tái)設(shè)備,把它連接到文件系統(tǒng)樹(shù)上:
mkdir /mnt/iso_image
mount -t iso9660 -o loop image.iso /mnt/iso_image
上面的示例中,我們創(chuàng)建了一個(gè)掛載點(diǎn)叫做/mnt/iso_image,然后把此映像文件 image.iso 掛載到掛載點(diǎn)上。映像文件被掛載之后,可以把它當(dāng)作,就好像它是一張 真正的 CD-ROM 或者 DVD。當(dāng)不再需要此映像文件后,記得卸載它。
可重寫(xiě)入的 CD-RW 媒介在被重使用之前需要擦除或清空。為此,我們可以用 wodim 命令,指定 設(shè)備名稱和清空的類型。此 wodim 程序提供了幾種清空類型。最?。ㄇ易羁欤┑氖?"fast" 類型:
wodim dev=/dev/cdrw blank=fast
寫(xiě)入一個(gè)映像文件,我們?cè)俅问褂?wodim 命令,指定光盤設(shè)備名稱和映像文件名:
wodim dev=/dev/cdrw image.iso
除了設(shè)備名稱和映像文件之外,wodim 命令還支持非常多的選項(xiàng)。常見(jiàn)的兩個(gè)選項(xiàng)是,"-v" 可詳細(xì)輸出, 和 "-dao" 以 disk-at-once 模式寫(xiě)入光盤。如果你正在準(zhǔn)備一張光盤為的是商業(yè)復(fù)制,那么應(yīng)該使用這種模式。 wodim 命令的默認(rèn)模式是 track-at-once,這對(duì)于錄制音樂(lè)很有用。
我們剛才談到了很多方法,可以使用命令行管理存儲(chǔ)介質(zhì)。看看我們所講過(guò)命令的手冊(cè)頁(yè)。 一些命令支持大量的選項(xiàng)和操作。此外,尋找一些如何添加硬盤驅(qū)動(dòng)器到 Linux 系統(tǒng)(有許多)的在線教程, 這些教程也要適用于光介質(zhì)存儲(chǔ)設(shè)備。
通常驗(yàn)證一下我們已經(jīng)下載的 iso 映像文件的完整性很有用處。在大多數(shù)情況下,iso 映像文件的貢獻(xiàn)者也會(huì)提供 一個(gè) checksum 文件。一個(gè) checksum 是一個(gè)神奇的數(shù)學(xué)運(yùn)算的計(jì)算結(jié)果,這個(gè)數(shù)學(xué)計(jì)算會(huì)產(chǎn)生一個(gè)能表示目標(biāo)文件內(nèi)容的數(shù)字。 如果目標(biāo)文件的內(nèi)容即使更改一個(gè)二進(jìn)制位,checksum 的結(jié)果將會(huì)非常不一樣。 生成 checksum 數(shù)字的最常見(jiàn)方法是使用 md5sum 程序。當(dāng)你使用 md5sum 程序的時(shí)候, 它會(huì)產(chǎn)生一個(gè)獨(dú)一無(wú)二的十六進(jìn)制數(shù)字:
md5sum image.iso
34e354760f9bb7fbf85c96f6a3f94ece image.iso
當(dāng)你下載完映像文件之后,你應(yīng)該對(duì)映像文件執(zhí)行 md5sum 命令,然后把運(yùn)行結(jié)果與發(fā)行商提供的 md5sum 數(shù)值作比較。
除了檢查下載文件的完整性之外,我們也可以使用 md5sum 程序驗(yàn)證新寫(xiě)入的光學(xué)存儲(chǔ)介質(zhì)。 為此,首先我們計(jì)算映像文件的 checksum 數(shù)值,然后計(jì)算此光學(xué)存儲(chǔ)介質(zhì)的 checksum 數(shù)值。 這種驗(yàn)證光學(xué)介質(zhì)的技巧是限定只對(duì) 光學(xué)存儲(chǔ)介質(zhì)中包含映像文件的部分計(jì)算 checksum 數(shù)值。 通過(guò)確定映像文件所包含的 2048 個(gè)字節(jié)塊的數(shù)目(光學(xué)存儲(chǔ)介質(zhì)總是以 2048 個(gè)字節(jié)塊的方式寫(xiě)入) 并從存儲(chǔ)介質(zhì)中讀取那么多的字節(jié)塊,我們就可以完成操作。 某些類型的存儲(chǔ)介質(zhì),并不需要這樣做。一個(gè)以 disk-at-once 模式寫(xiě)入的 CD-R,可以用下面的方式檢驗(yàn):
md5sum /dev/cdrom
34e354760f9bb7fbf85c96f6a3f94ece /dev/cdrom
許多存儲(chǔ)介質(zhì)類型,如 DVD 需要精確地計(jì)算字節(jié)塊的數(shù)目。在下面的例子中,我們檢驗(yàn)了映像文件 dvd-image.iso 以及 DVD 光驅(qū)中磁盤 /dev/dvd 文件的完整性。你能弄明白這是怎么回事嗎?
md5sum dvd-image.iso; dd if=/dev/dvd bs=2048 count=$(( $(stat -c "%s" dvd-image.iso) / 2048 )) | md5sum