歡迎您光臨本站 註冊首頁

讓你快速成LINUX系統管理員

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

  本章概述Linux系統。首先描述操作系統提供的主要服務。然後說明實現這些服務的程序 with a considerable lack of detail。本章的目的是理解系統整體,以後再詳細說明每個部分。

  一個操作系統的不同部分

  一個UNIX操作系統包括一個核心程序kernel和一些系統程序system programs。還有一些做某件事情的應用程序application programs。核心是操作系統的心臟 。它跟蹤磁碟上的文件,啟動程序並運行它們,給不同的進程分配內存和其他資源,從網路接收和向網路發送包,等等。核心很少自己幹活,但它提供工具,用這些工具可以建立所有服務。它還阻止任何人直接存取硬體,強制每個人使用它提供的工具。這樣,核心給每個用戶與其他用戶之間提供保護。核心提供的工具通過系統調用system calls使用;要了解關於這的更多的信息,看手冊頁第二節。

  系統程序使用核心提供的工具實現操作系統要求的不同的服務。系統程序和所有其他程序運行在核心之上,叫做用戶模式user mode。系統程序和應用程序的區別是目的:應用程序意圖完成一些有用的工作(或遊戲),而系統程序則為系統工作而需要。字處理器是應用;telnet 是系統程序。區別經常有些模糊,也許,只是為了強制分類。

  雖然編程語言不必是操作系統的一部分,操作系統也可以包括編譯器及其相關的庫(Linux下是gcc和C庫)。文檔、有時甚至遊戲,可以是操作系統的一部分。傳統上,操作系統被定義為安裝磁帶或磁碟上的內容;對於Linux就更不清楚,因為它分佈在全世界的FTP站點上。

  核心的重要部件

  Linux核心包括幾個重要部分:進程管理、存儲器管理、硬體設備驅動、文件系統驅動、網路管理和其他不同的部分。圖2.1顯示了它們的一些。

  可能核心最重要的部分(沒有它們什麼也不能工作)是存儲器管理和進程管理。存儲器管理負責分配進程的存儲器區域和對換空間區域、核心的部件及buffer cache。進程管理產生進程,用切換處理器上的活動進程來實現多任務。

  在最低級,核心對它支持的每種硬體包含一個硬體設備驅動。因為世界上存在大量不同的硬體,硬體設備驅動的數量極大。有許多不同的硬體,因此軟體控制方法不同。但其相似性可能分類驅動,支持相似的操作;每類的每個成員有相同的與核心其他部分介面,但具體實現是不同的。例如,所有的硬碟驅動與核心其他部分介面相同,即他們都有初始化驅動器、讀N扇區、寫N扇區。

  核心自己提供的有些軟體服務有類似的抽象屬性,因此可以抽象分類。例如,不同的網路協議已經被抽象為一個編程介面:BSD socket庫。另一個例子是虛擬文件系統virtual filesystem(VFS)層,它從文件系統操作實現中抽象出文件系統操作。每個文件系統類型提供了每個文件系統操作的實現。當一些實體企圖使用一個文件系統時,請求通過VFS送出,它將請求發送到適當的文件系統驅動。
UNIX系統的主要服務

  本節說明一些最重要的UNIX服務,但不太詳細。以後的章節中將更詳細地說明。

  init

  UNIX系統里最重要的服務是由init 提供的。 init 是每個UNIX系統在核心引導最後啟動的第一個進程。 init 啟動后,它做不同的啟動工作繼續引導過程(檢查和mount文件系統、啟動守侯程序等)
init 做的具體事情的列表依賴於用戶意願; init 有多個啟動選擇。通常提供單用戶模式single user mode的概念,此時沒有用戶能登錄,root 在控制台使用一個shell;通常的模式叫多用戶模式multiuser mode。一般說來這稱為運行級run levels;單用戶和多用戶模式可以理解為2個運行級,還可以有其他運行級,例如,在控制台上運行X。

  在普通操作中,init 確認getty 正常運行(允許用戶登錄),並收養孤兒進程(父進程已死的進程;UNIX中,所有進程 必須在一棵樹中,因此孤兒進程必須收養)。

  當系統關閉時,init 負責殺死所有其他進程,unmount所有文件系統並停止處理器,根據設置。

  從終端登錄

  從終端登錄(通過串列線)和控制台(當不運行X時)是由getty 程序提供的。 init 為每個允許登錄的終端啟動一個單獨的getty 實例 getty 讀用戶名並運行login 程序,由它讀口令。如果用戶名和口令正確,login 就運行shell。當shell終止時,即用戶註銷,或login 因用戶名和口令不對而終止時, init 知道並啟動一個新的getty 實例。核心沒有登錄的概念,這都由系統程序處理。

  Syslog

  核心和許多系統程序會產生錯誤、警告和其他信息。這些信息在以後能看經常是很重要的,甚至很久以後,所以它們應該被寫到一個文件。這個程序是syslog 。它能設置成根據輸出信息的程序或重要程度將信息排序到不同的文件。例如,核心信息經常與其他信息分開,單獨定向到一個分離的文件,因為核心信息經常更重要且需要有規律地閱讀以確定問題。

  定時執行命令: cron 和at

  用戶和系統管理員經常需要定時運行命令。例如,系統管理員可能想運行一個程序從老文件中清除暫存文件的目錄 (/tmp 和/var/tmp ),以免磁碟滿,因為並非所有程序都正確地清除自己的暫存文件。

  cron 服務是做這個的。每個用戶有個crontab ,在這裡列出他要執行的命令和想執行的時間。 cron 守侯進程負責在特定的時間啟動命令。

  at 服務與cron 類似,但它只執行一次:命令在給定的時間執行,但不可自動重複。

  圖形用戶介面GUI

  UNIX和Linux不將用戶介面合在核心中,而是用用戶級程序實現。用戶介面同時提供文本和圖形環境。

  這樣的安排使系統更靈活,但有容易對每個程序實現不同的用戶介面的缺點,使系統較難學。

  Linux使用的主要的圖形環境叫X Window系統(簡稱X)。 X也不實現用戶介面;它只實現一個窗口系統,即可以實現圖形用戶介面的工具。 3種最流行的基於X實現的用戶介面風格是Athena、Motif和Open Look。

  網路

  網路連接2台或更多的計算機使之能互相通信。連接和通信的實際方法有些複雜,但結果非常有用。

  UNIX操作系統具有許多網路特徵。最基本的服務:文件系統、列印、備份等都可以通過網路完成。這可使系統管理更簡單,因為它允許集中管理,同時獲得小型機和分佈計算的優點,例如降低成本和更好的容錯能力。

  然而,本書只概述網路;更多的信息請見《Linux網路管理員指南》,包括一個網路如何操作的基本說明。

  網路登錄

  網路登錄與普通登錄有一點不同。可以登錄的每個終端各有一條單獨的物理串列線。從網路登錄的每個人,有一條單獨的虛擬網路連接,並且可以有任意數量 。因此不可能為每個可能的虛擬連接運行單獨的getty 。通過網路登錄有若干不同的方法, telnet 和rlogin 是TCP/IP網路中的主要方法。

  網路登錄為每種登錄方法提供一個單獨的守侯程序(telnet 和rlogin 使用不同的守侯程序),而不是使用一群getty ,來偵聽所有的輸入的登錄企圖。當發現一個登錄企圖,就啟動一個自己的新實例來處理這個企圖;原來的實例繼續偵聽其他企圖。新實例的工作和getty 類似。

  網路文件系統

  網路服務的一個最有用的東西是通過網路文件系統network file system共享文件。這個服務一般用Sun公司開發的網路文件系統Network File System,或NFS。

  通過網路文件系統,任何文件操作可以由一台機器的一個程序通過網路發送到其他任何機器。這愚弄了程序,使它以為其他機器上的所有文件是在程序運行的機器上。這極大地簡化了信息共享,因為它對程序無須任何修改。

  郵件

  電子郵件通常是通過計算機通信的最重要的方法。一封電子信件用特定的格式存儲在一個文件中,使用特定的郵件程序來收發郵件。

  每個用戶有一個收件箱incoming mailbox(一個特定格式的文件),所有新郵件存在這裡。當什麼人發送郵件時,郵件程序定位收件人的郵箱,並在郵箱文件中添加信件。如果收件人的郵箱在另一台機器上,信件就被發送到那台機器,由它用它覺得最合適的方法來投遞郵箱。

  郵件系統包括很多程序。投遞郵件到本地或遠程郵箱使用一個程序(mail transfer agent或MTA,例如,sendmail 或smail ),而用戶使用的則有很多不同的程序(mail user agent或MUA,例如pine 或elm )。郵箱一般存在/var/spool/mail 中。

  列印

  同時只能有一個人使用某一台印表機,但各用戶不共享印表機是不經濟的。因此印表機由軟體來管理,實現一個列印隊列print queue:所有的列印任務放進一個隊列,印表機完成一個任務后,自動再列印下一個。這無須用戶來組織列印隊列,迴避了直接控制印表機。

  列印隊列軟體也把列印輸出spools到磁碟,即,當任務在隊列中時,列印輸出存在一個文件中。這允許應用程序快速地完成一個列印任務到列印隊列程序,應用程序無須等到列印任務真正完成就可以繼續下去。這真的很方便,因為它允許列印出一個版本,無須列印完成,就繼續修改一個新版本。

  文件系統布局

  文件系統分為許多部分,通常從根文件系統有: /bin , /lib , /etc , /dev , 及一些其他; /usr 文件系統包含程序和不改變的數據; /var 文件系統包含改變的數據(例如log文件); /home 文件系統包含每個用戶的個人文件。依賴於硬體配置和系統管理員的決定,方法不同,甚至所有東西可能在一個文件系統中。

  3章將更詳細地說明文件系統布局,Linux文件系統標準(Linux Filesystem Standard)中有更詳細的說明。

  目錄樹概述

  本章說明標準Linux目錄樹的重要部分,基於FSSTND文件系統標準。概述根據不同的目的和給定的要求將目錄樹分為若干分離的文件系統的一般方法。也說明一些其他方法。

  背景

  本章鬆散地基於Linux文件系統標準FSSTND版本1.2(見參考書目[Qui95]),它意圖建立一個如何組織Linux系統目錄樹的標準。這樣一個標準具有易於寫或port(移植?)Linux軟體、管理Linux系統的優點,因為所有東西都將在他們的一般地方。此標準沒有強制所有人遵從的權威,但它有最多的Linux distributions的支持。如果沒有什麼特殊的理由,不遵從FSSTND不是個好主意。 FSSTND意圖遵從Unix傳統和當前趨勢,使熟悉其他Unix系統的人對Linux系統更容易接受(反之亦然)。

  本章並非如FSSTND那麼詳細。一個系統管理員應該閱讀FSSTND以得到全部的理解。

  本章不詳細解釋所有文件。其意圖並非說明每個文件,而是從文件系統的視角給出系統的一個概覽。每個文件的更多的信息在本手冊或man頁的其他地方。

  有意將全目錄樹可以分為小的部分,每個部分可以在自己的磁碟或分區上,以能為磁碟容量所容納,並易於備份及其他系統管理。主要部分是根、/usr 、/var 和 /home 文件系統。每個部分有不同的目的。目錄樹已被設計成能在Linux機器的網路中很好地工作,可以通過只讀設備(如CDROM)或NFS網路共享文件系統的一些部分。

  下面說明目錄樹不同部分的任務。

  每台機器都有根文件系統(一般在本地盤中,當然也可以在RAM盤或網路盤中),它包含系統引導和使其他文件系統得以mount所必要的文件,根文件系統應該有單用戶狀態所必須的足夠的內容。還應該包括修復損壞系統、恢復備份等的工具。

  /usr 文件系統包含所有命令、庫、man頁和其他一般操作中所需的不改變的文件。 /usr 應該沒有對給定機器特定的文件,也不應該有一般使用中要修改的文件。這樣允許此文件系統中的文件通過網路共享,這樣可以更有效,因為這樣節省了磁碟空間(/usr 很容易是數百兆),且易於管理(當升級應用時,只有主/usr 需要改變,而無須改變每台機器) 即使此文件系統在本地盤上,也可以只讀mount,以減少系統崩潰時文件系統的損壞。

  /var 文件系統包含會改變的文件,比如spool目錄(mail、news、印表機等用的), log文件、formatted manual pages和暫存文件。傳統上/var 的所有東西曾在 /usr 下的某個地方,但這樣/usr 就不可能只讀安裝了。

  /home 文件系統包含用戶家目錄,即系統上的所有實際數據。將家目錄分到自己的目錄樹或文件系統中易於備份,其他部分經常不必備份,至少不必經常備份(它們很少改變)。一個大的/home 可能要分為若干文件系統,需要在/home 下加一級名字,如/home/students 、/home/staff 等。

  雖然上面將不同的部分稱為文件系統,但它們不必是真的分離的文件系統。如果系統是小的單用戶系統,而用戶希望簡單化,可以很容易地放在一個文件系統中。根據磁碟容量和不同目的所需分配的空間,目錄樹也可以分到不同的文件系統中。重要的是使用標準的名字,即使/var 和/usr 在同一分區上,名字/usr/lib/libc.a 和/var/adm/messages 必須能工作,例如將/var 下的文件移動到/usr/var ,並將/var 作為/usr/var 的符號連接。

  Unix文件結構根據目的來分組文件,即所有的命令在一個地方,所有的數據在另一個地方,所有的文檔又在一個地方,等等。另一個方法是根據屬於的程序分組文件,即所有Emacs文件在一個目錄中,所有TeX文件在另一個中,等等。后一種方法的問題是文件難於共享(程序目錄經常同時包含靜態可共享的和動態不可共享的文件),有時難於查找 (例如man頁在極大數量的地方,使man程序查找它們極其困難)。
根文件系統

  根文件系統一般應該比較小,因為包括嚴格的文件和一個小的不經常改變的文件系統不容易損壞。損壞的根文件系統一般意味著除非用特定的方法(例如從軟盤)系統無法引導,所以不應該冒這個險。

  根目錄一般不含任何文件,除了可能的標準的系統引導映象,通常叫/vmlinuz 。所有其他文件在根文件系統的子目錄中。
CODE:
/bin
引導啟動所需的命令或普通用戶可能用的命令(可能在引導啟動后)。

/sbin
類似/bin ,但不給普通用戶使用,雖然如果必要且允許時可以使用。

/etc
特定機器的配置文件。

/root
root用戶的家目錄。

/lib
根文件系統上的程序所需的共享庫。

/lib/modules
核心可載入模塊,特別是那些恢復損壞系統時引導所需的(例如網路和文件系統驅動)。

/dev
設備文件。

/tmp
臨時文件。引導啟動后運行的程序應該使用/var/tmp ,而不是/tmp ,因為前者可能在一個擁有更多空間的磁碟上。

/boot
引導載入器(bootstrap loader)使用的文件,如LILO。核心映象也經常在這裡,而不是在根目錄。如果有許多核心映象,這個目錄可能變得很大,這時可能使用單獨的文件系統更好。另一個理由是要確保核心映象必須在IDE硬碟的前1024柱面內。

/mnt
系統管理員臨時mount的安裝點。程序並不自動支持安裝到/mnt 。 /mnt 可以分為子目錄(例如/mnt/dosa 可能是使用MSDOS文件系統的軟碟機,而/mnt/exta 可能是使用ext2文件系統的軟碟機)。

/proc , /usr , /var , /home
其他文件系統的安裝點。

/etc目錄
/etc 目錄包含很多文件。下面說明其中的一些。其他的你應該知道它們屬於哪個程序,並閱讀該程序的man頁。許多網路配置文件也在/etc 中,它們在《網路管理指南》中說明。

/etc/rc or /etc/rc.d or /etc/rc.d
啟動、或改變運行級時運行的scripts或scripts的目錄,更詳細的信息見關於init 的章。

/etc/passwd
用戶資料庫,其中的域給出了用戶名、真實姓名、家目錄、加密的口令和用戶的其他信息。格式見passwd 的man頁。

/etc/fdprm
軟盤參數表。說明不同的軟盤格式。用setfdprm 設置。更多的信息見setfdprm 的man頁。

/etc/fstab
啟動時mount -a命令(在/etc/rc 或等效的啟動文件中)自動mount的文件系統列表。 Linux下,也包括用swapon -a啟用的swap區的信息。見4.8.5節和mount 的man頁。

/etc/group
類似/etc/passwd ,但說明的不是用戶而是組。見group 的man頁。

/etc/inittab
init 的配置文件。

/etc/issue
getty 在登錄提示符前的輸出信息。通常包括系統的一段短說明或歡迎信息。內容由系統管理員確定。

/etc/magic
file 的配置文件。包含不同文件格式的說明,file 基於它猜測文件類型。見magic 和file 的man頁。

/etc/motd
Message Of The Day,成功登錄后自動輸出。內容由系統管理員確定。經常用於通告信息,如計劃關機時間的警告。

/etc/mtab
當前安裝的文件系統列表。由scripts初始化,並由mount 命令自動更新。需要一個當前安裝的文件系統的列表時使用,例如df 命令。

/etc/shadow
在安裝了影子口令軟體的系統上的影子口令文件。影子口令文件將/etc/passwd 文件中的加密口令移動到/etc/shadow 中,而後者只對root可讀。這使破譯口令更困難。

/etc/login.defs
login 命令的配置文件。

/etc/printcap
類似/etc/termcap ,但針對印表機。語法不同。

/etc/profile , /etc/csh.login , /etc/csh.cshrc
登錄或啟動時Bourne或C shells執行的文件。這允許系統管理員為所有用戶建立全局預設環境。各shell見man頁。

/etc/securetty
確認安全終端,即哪個終端允許root登錄。一般只列出虛擬控制台,這樣就不可能(至少很困難)通過modem或網路闖入系統並得到超級用戶特權。

/etc/shells
列出可信任的shell。chsh 命令允許用戶在本文件指定範圍內改變登錄shell。提供一台機器FTP服務的服務進程ftpd 檢查用戶shell是否列在 /etc/shells 文件中,如果不是將不允許該用戶登錄。

/etc/termcap
終端性能資料庫。說明不同的終端用什麼"轉義序列"控制。寫程序時不直接輸出轉義序列(這樣只能工作於特定品牌的終端),而是從/etc/termcap 中查找要做的工作的正確序列。這樣,多數的程序可以在多數終端上運行。見termcap 、 curs_termcap 和terminfo 的man頁。

/dev目錄
/dev 目錄包括所有設備的設備文件。設備文件用特定的約定命名,這在設備列表中說明 (見[Anv])。設備文件在安裝是產生,以後可以用 /dev/MAKEDEV 描述。 /dev/MAKEDEV.local 是系統管理員為本地設備文件(或連接)寫的描述文稿 (即如一些非標準設備驅動不是標準MAKEDEV 的一部分)。

/usr文件系統
/usr 文件系統經常很大,因為所有程序安裝在這裡。 /usr 里的所有文件一般來自Linux distribution;本地安裝的程序和其他東西在/usr/local 下。這樣可能在升級新版系統或新distribution時無須重新安裝全部程序。 /usr 的有些子目錄在下面列出(一些不太重要的目錄省略了,更多信息見FSSTND)。

/usr/X11R6
X Window系統的所有文件。為簡化X的開發和安裝,X的文件沒有集成到系統中。 X自己在/usr/X11R6 下類似/usr 。

/usr/X386
類似/usr/X11R6 ,但是給X11 Release 5的。

/usr/bin
幾乎所有用戶命令。有些命令在/bin 或/usr/local/bin 中。

/usr/sbin
根文件系統不必要的系統管理命令,例如多數服務程序。

/usr/man , /usr/info , /usr/doc
手冊頁、GNU信息文檔和各種其他文檔文件。

/usr/include
C編程語言的頭文件。為了一致性這實際上應該在/usr/lib 下,但傳統上支持這個名字。

/usr/lib
程序或子系統的不變的數據文件,包括一些site-wide配置文件。名字lib來源於庫(library); 編程的原始庫存在/usr/lib 里。

/usr/local
本地安裝的軟體和其他文件放在這裡。

/var文件系統
/var 包括系統一般運行時要改變的數據。每個系統是特定的,即不通過網路與其他計算機共享。

/var/catman
當要求格式化時的man頁的cache。man頁的源文件一般存在/usr/man/man* 中;有些man頁可能有預格式化的版本,存在/usr/man/cat* 中。而其他的man頁在第一次看時需要格式化,格式化完的版本存在/var/man 中,這樣其他人再看相同的頁時就無須等待格式化了。 (/var/catman 經常被清除,就象清除臨時目錄一樣。)

/var/lib
系統正常運行時要改變的文件。

/var/local
/usr/local 中安裝的程序的可變數據(即系統管理員安裝的程序)。注意,如果必要,即使本地安裝的程序也會使用其他/var 目錄,例如/var/lock 。

/var/lock
鎖定文件。許多程序遵循在/var/lock 中產生一個鎖定文件的約定,以支持他們正在使用某個特定的設備或文件。其他程序注意到這個鎖定文件,將不試圖使用這個設備或文件。

/var/log
各種程序的Log文件,特別是login (/var/log/wtmp log所有到系統的登錄和註銷) 和syslog (/var/log/messages 里存儲所有核心和系統程序信息。 /var/log 里的文件經常不確定地增長,應該定期清除。

/var/run
保存到下次引導前有效的關於系統的信息文件。例如, /var/run/utmp 包含當前登錄的用戶的信息。

/var/spool
mail, news, 列印隊列和其他隊列工作的目錄。每個不同的spool在/var/spool 下有自己的子目錄,例如,用戶的郵箱在/var/spool/mail 中。

/var/tmp
比/tmp 允許的大或需要存在較長時間的臨時文件。 (雖然系統管理員可能不允許/var/tmp 有很舊的文件。)

/proc文件系統
/proc 文件系統是一個假的文件系統。它不存在在磁碟某個磁碟上。而是由核心在內存中產生。用於提供關於系統的信息(originally about processes, hence the name)。下面說明一些最重要的文件和目錄。 /proc 文件系統在proc man頁中有更詳細的說明。

/proc/1
關於進程1的信息目錄。每個進程在/proc 下有一個名為其進程號的目錄。

/proc/cpuinfo
處理器信息,如類型、製造商、型號和性能。

/proc/devices
當前運行的核心配置的設備驅動的列表。

/proc/dma
顯示當前使用的DMA通道。

/proc/filesystems
核心配置的文件系統。

/proc/interrupts
顯示使用的中斷,and how many of each there have been.

/proc/ioports
當前使用的I/O埠。

/proc/kcore
系統物理內存映象。與物理內存大小完全一樣,但不實際佔用這麼多內存;it is generated on the fly as programs access it. (記住:除非你把它拷貝到什麼地方,/proc 下沒有任何東西佔用任何磁碟空間。)

/proc/kmsg
核心輸出的消息。也被送到syslog 。

/proc/ksyms
核心符號表。

/proc/loadavg
系統"平均負載";3個沒有意義的指示器指出系統當前的工作量。

/proc/meminfo
存儲器使用信息,包括物理內存和swap。

/proc/modules
當前載入了哪些核心模塊。

/proc/net
網路協議狀態信息。

/proc/self
到查看/proc 的程序的進程目錄的符號連接。當2個進程查看/proc 時,是不同的連接。這主要便於程序得到它自己的進程目錄。

/proc/stat
系統的不同狀態,such as the number of page faults since the system was booted.

/proc/uptime
系統啟動的時間長度。

/proc/version
核心版本。

  注意所有上述文件給出易讀的文本文件,有時可能是不易讀的格式。有許多命令做了些格式化以更容易讀。例如,free 程序讀/proc/meminfo 並將給出的位元組數轉換為千位元組(並增加了一些信息)。

  磁碟和其他存貯介質的使用

 安裝和升級系統時,需要對硬碟做很多工作。必須在硬碟上做文件系統,使文件能存在其上,並為系統不同的部分保留空間。

  本章說明所有這些初始化工作。通常,一旦你建立了系統,就不必再做這些工作(除了使用軟盤)。如果你要增加一個新硬碟或更好地調整你的硬碟的使用,那麼可能回到這一章。

  管理磁碟的基本任務有:

  格式化磁碟。這為磁碟進入使用做一些工作,比如檢查壞扇區。(現在多數硬碟無須格式化。)

  給硬碟分區,如果想用於互相不干擾的幾件事。分區的一個原因是要在一個硬碟上存不同的操作系統。另一個原因是將用戶文件和系統文件分開,以簡化備份並在系統崩潰時有助於保護系統文件。

  在每個磁碟或分區上建立合適類型的文件系統,然後文件就可以在其上產生和存取。在你建立文件系統前,磁碟對Linux沒有意義。

  將不同的文件系統安裝起來形成一個單獨的樹結構,按需要可以自動或手工完成。 (手工安裝的文件系統通常還要手工unmount)

  5章包括虛擬內存和磁碟cache的信息,使用磁碟應該知道這些。

  本章說明對硬碟、軟盤、CDROM和磁帶機應該知道什麼。

  2種設備

  UNIX及Linux,識別2類設備:隨機存取的塊設備(如磁碟)和字元設備(如磁帶和串列線),有些是串列的,有些是隨機存取的。文件系統支持的每種看來是個設備文件。當讀寫設備文件時,數據與設備聯繫。這樣沒有必要為存取設備編製特別的程序(程序不直接獲取中斷或讀取串口),例如,發送文件到印表機,只需:

  $ cat filename > /dev/lp1
  $

  文件內容就被列印了(當然,文件必須是印表機能理解的格式)。當然,因為不應該讓多人同時cat文件到同一印表機,一般用特定的程序發送文件去列印(通常是lpr )。這個程序能確保同時只有一個文件被列印,並自動在完成後發送下一個。多數設備有類似需要。實際上,根本很少需要關心設備文件。

  因為設備被視為文件系統中的文件(在/dev 目錄中),很容易看到存在哪些設備文件,使用ls 或其他的適當的命令即可。在ls -l 的輸出中,第一列包含文件類型和許可權。例如,查看我系統上的一個串列設備:

  $ ls -l /dev/cua0
  crw-rw-rw- 1 root uucp 5, 64 Nov 30 1993 /dev/cua0
  $

  第一列第一個字元,即crw-rw-rw-中的c告訴用戶文件的種類,這是一個字元設備。一般文件的第一個字元是"-",目錄是"d",塊設備是"b";更多的信息見ls man頁。

  注意即使設備沒有安裝,一般所有設備文件都存在。因此有/dev/sda 文件並不意味著你真的有個SCSI硬碟。有所有的設備文件使安裝程序更簡單,也易於增加新硬體(無須再為產生新設備的設備文件找出正確的參數)。

  硬碟

  本節介紹有關硬碟的術語。如果你已經知道這些項目和內容,可以跳過本節。

  硬碟包括一到數片碟片platters, 其一個或兩個面surfaces塗有磁性材料用於記錄數據。每面有一個讀寫頭read-write head用於讀寫數據。碟片有一個共同的軸,典型的旋轉速度是每分鐘3600轉,高性能的硬碟轉速可能更高。磁頭可沿著碟片的半徑移動,磁頭移動加上碟片旋轉可以使詞頭存取磁碟表面的任何一個位置。

  處理器(CPU)和實際磁碟通過磁碟控制器disk controller通訊。這使計算機其他部分不必知道如何使用驅動器,因為不同磁碟的控制器可以做成對計算機其他部分相同的介面。這樣,計算機只要說"嗨,磁碟,給我我要的東西",而不是用一串長而複雜的電信號來移動磁頭到正確的位置,並等正確的位置到了磁頭下后再做那些不愉快的工作。 (實際上,到控制器的介面仍然很複雜,但比沒有好多了。) 控制器還可以做一些其他的事,比如緩衝,或自動壞扇區替換等。用電信號控制操作機械部件,

  以上只是理解硬體所需的。還有其他好多工作,比如馬達旋轉磁碟、移動磁頭,但這都與理解硬碟工作原理無關。

  磁碟表面通常被分為同心圓環,叫磁軌tracks,磁軌又被分為扇區sectors。用這樣分來將磁碟定位,用於為文件定位磁碟空間。要在硬碟上找到給定的位置,可能?quot;3面5道7扇區"。通常所有磁軌有相同的扇區數,但也有硬碟在外圈磁軌放較多的扇區(所有扇區用同樣大小的物理空間,這樣在較長的外圈磁軌可以容納更多的數據)。一般一個扇區容納512位元組數據。磁碟不能處理比一個扇區更小的數據量。

  每個面以相同的方式分為磁軌和扇區。這意味著當一個磁頭在某個磁軌時,其他磁頭也在相應的位置,所有相同位置的磁軌組成柱面cylinder。磁頭從一個磁軌(柱面)移動到另一個需要花時間,所以將經常要在一起存取的數據(如一個文件)放在一個柱面里。這改善了性能。當然不可能完全作到,文件被放在幾個相分離的位置叫碎片fragmented。

  磁碟的面(或頭,實際是一樣的)、柱面、扇區數各不相同,硬碟這些數目叫硬碟參數geometry。硬碟參數通常存在一個特定的、由電池供電的存儲區中,叫CMOS RAM,操作系統在引導啟動或驅動器初始化時可以從那裡得到硬碟參數。

  不幸的是,BIOS 有一個設計限制,就是不能在CMOS RAM中定義大於1024的磁軌數,這對大硬碟來說就太小了。為了克服這個問題,硬碟控制器在磁碟參數上做了一個欺騙,用地址轉換translates the addresses使計算機接受。例如,一個硬碟可能有8個磁頭,2048個磁軌,每磁軌35個扇區。其控制器可以對計算機謊稱它有16個磁頭,1024個磁軌,每磁軌35個扇區,這樣就沒有超過磁軌數的限制,地址轉換將磁頭數減半,磁軌數加倍後傳給硬碟。實際的演算法可能更複雜,因為數量可能不象我們在這裡假設的這麼好(但這不影響我們理解原理)。這個轉換在操作系統來看產生了錯覺,並可能影響操作系統對把所有數據存在相同柱面的企圖受到影響。

  轉換隻是IDE硬碟的問題。SCSI硬碟使用連續的扇區號(即控制器將連續的扇區好轉換成磁頭、柱面、扇區的三參數組),對CPU與控制器的通信使用完全不同的方法,因此不會有這個問題。注意,計算機可能根本不知道一個SCSI硬碟的實際參數。

  由於Linux經常不知道一個硬碟的真正參數,其文件系統也不試圖將文件存在一個柱面里。而是爭取給一個文件分配連續編號的山區,這樣能得到類似的性能。對於控制器上有cashe或控制器能自動預取的硬碟,情況將更複雜。

  每個硬碟表現為一個單獨的設備文件。通常只能有2-4個IDE硬碟。這就是 /dev/hda , /dev/hdb , /dev/hdc , 和 /dev/hdd 。 SCSI是 /dev/sda , /dev/sdb , 等等。其他硬碟類型有類似的命名約定,更多的信息見[Anv]。注意硬碟的設備文件給出整個硬碟的存取,而不是分區(下面討論的),因此如果不小心可能搞亂分區或數據。硬碟的設備文件只在存取主引導扇(也將在下面討論)時使用。

  軟盤

  軟盤的一面或兩面塗有和硬碟類似的磁性介質。軟盤自己沒有讀寫頭,讀寫頭在驅動器上。軟盤相當於硬碟的一張碟片,但可移動,一個驅動器可以存取不同的軟盤,而硬碟則是一個獨立的單元。

  如同硬碟,一張軟盤也分為磁軌和扇區(軟盤2面上的相同的磁軌組成柱面),但數量要比硬碟少得多。

  軟碟機通常可以使用幾中不同的碟片,例如,一個3.5'軟碟機可以使用720KB和1.44MB的軟盤。因為軟碟機操作有些不同,而操作系統必須知道軟盤的容量,所以軟碟機有許多設備文件,每個都與軟碟機和軟盤種類有關。因此,/dev/fd0H1440 是第一個軟碟機(fd0),必須是3.5'軟碟機,使用3.5'高密度軟盤(H),容量是1440KB(1440),即普通的3.5'HD軟盤。軟盤設備的命名約定見[Anv]。

  軟碟機的名字是複雜的,因此Linux有一個特定的軟碟機設備類型,能自動檢測軟碟機中軟盤的種類。它使用不同的軟盤類型試圖讀取新插入的軟盤的第一個扇區,直到找到正確的一個。這自然要求軟盤是已經格式化過的。自動設備叫/dev/fd0 、/dev/fd1 等。

  存取軟盤的自動設備的參數可用程序setfdprm 設定。這可使你使用不是通常容量的軟盤,例如有非標準扇區數的軟盤,或自動檢測由於某種原因失敗或適當的設備文件丟失。

  Linux除了所有標準的,還能處理許多非標準的軟盤格式。這有時需要特殊的格式化程序。我們現在先跳過這些軟盤格式,同時你可以查看/etc/fdprm 文件。它定義了setfdprm 識別的設定。

  操作系統必須知道軟碟機何時換了軟盤,例如,以免使用上一張軟盤的cache數據。不幸的是,當用於此的信號線斷了或不好時,當在MSDOS中使用時,這並不總有效。如果你曾遇到過軟碟機的這種怪異的問題,可能是這個原因。解決這個問題的唯一方法是修理軟碟機。

  CD-ROM

  CD-ROM驅動器使用一個光學可讀的塑料塗布的碟片。信息記錄在碟片表面 的從中心的邊沿的螺旋型小坑上。驅動器發出一束激光來讀盤。當激光射到小坑上,激光以一種方式反射;當它射到光滑表面上,它以另一種方式反射。這很容易地編碼成bit,組成信息。其他很容易,不過是機械。

  CD-ROM驅動器比硬碟慢。典型的硬碟的平均尋道(seek)時間小於15毫秒,而快速的CD-ROM驅動器要花零點幾秒。實際數據傳輸率則相當快,在數百KB/s。速度慢使CDROM驅動器不能代替硬碟使用 (有些Linux distributions提供"live" CD-ROM文件系統,使之不必拷貝文件到硬碟,使安裝簡單並節約了許多硬碟空間),雖然是可能的。要安裝新軟體,CD-ROM很好,因為在安裝時速度並非最重要的。

  有多種方法在CDROM上安排數據。最流行的是國際標準化組織定義的ISO9660。這個標準定義了一個最小的文件系統,甚至比MSDOS更粗糙。這樣,由於它是這麼小,所有操作系統都可以將它映射到自己的系統。

  不同UNIX不能使用ISO9660文件系統,因此開發了對這個標準的一個增強,叫Rock Ridge增強。 Rock Ridge允許長文件名、符號連接和許多其他優點,使CD-ROM更象UNIX文件系統。同時,Rock Ridge文件系統仍然是一個有效的ISO9660文件系統,使非UNIX一樣可以使用。 Linux同時支持ISO9660和Rock Ridge增強,增強被自動識別和使用。

  文件系統只是一部分,許多CD-ROM包含的數據需要特定的程序存取,而多數程序不能運行在Linux下 (當然,可能運行在Linux的MSDOS模擬器dosemu下)。

  CD-ROM驅動器通過相關的設備文件存取。有多種方法將CDROM連接到計算機:SCSI、音效卡或EIDE。要完成這的硬體hacking工作超出了本書的範圍,但連接方法決定了設備文件。指導見[Anv]

  磁帶

  磁帶驅動器使用磁帶,類似 音樂用的盒帶。磁帶是串列的,即如果要得到給定部分的數據,必須經過所有部分。磁碟可以隨機存取,即可以直接跳到磁碟上的某個部分。串列存取的磁帶當然慢了。

  另外一方面,磁帶相當便宜,因為無須快速。也容易做得很長,因此可以容納大量的數據。這使磁帶很適於如歸檔、備份等無須高速的、但需要低成本和大容量的事情。

  格式化

  格式化在磁介質上寫用於標記磁軌和扇區的標誌的過程。磁碟格式化前,其磁表面是完成的一塊。格式化后,混沌變為秩序,建立的磁軌,劃分了扇區。實際細節並非準確地這樣,但重要的是:磁碟不經過格式化是不能使用的。

  這裡術語有些模糊:MS-DOS中,格式化(format)這個詞還包括了產生文件系統的過程(下面將討論的)。這兩個過程經常一起使用,尤其是軟盤。當必須區分時,真正的格式化被稱為低級格式化low-level formatting,而建立文件系統被成為高級格式化high-level formatting。在UNIX圈中,這兩者叫格式畫format和建立文件系統make a filesystem,本書中也這樣稱。

  IDE硬碟和一些SCSI硬碟實際上廠商已經做了格式化,並無須重複;因為多數人無須關心它。實際上,格式化硬碟可能反而不好,比如因為硬碟可能需要用特定的方法格式化使壞扇區被自動替換。

  磁碟經常需要特定的程序來格式化,因為驅動器的格式化邏輯的介面每個驅動器都不一樣。格式化程序經常在控制器BIOS上,或用MSDOS程序提供,這都不太容易在Linux中使用。

  格式化中可能會發現磁碟的壞點,叫壞塊bad blocks or bad sectors。這有時由驅動器自己處理。但有時,如果壞塊太多,需要一些工作來避免使用磁碟的這部分。 The logic to do this is built into the filesystem; 下面將說明如何增加這些信息到文件系統。另外,產生一個只覆蓋這些壞的部分的小分區也是一個辦法。如果壞區較大,這可能是個好辦法,因為文件系統有時難以處理大量的壞區。

  軟盤格式化使用fdformat 。軟盤設備使用給定的參數,例如下面的命令在第一個軟碟機中格式化一張高密度3.5'軟盤:

  $ fdformat /dev/fd0H1440
  Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
  Formatting ... done
  Verifying ... done
  $

  注意,如果想使用自動檢測設備(如/dev/fd0 ), 必須用先setfdprm 設定參數。要得到與上面一樣的結果,可以這樣:

  $ setfdprm /dev/fd0 1440/1440
  $ fdformat /dev/fd0
  Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
  Formatting ... done
  Verifying ... done
  $

  選擇與軟盤類型相符的正確的設備文件通常更方便。注意,比軟盤設計格式化更多的信息容量是沒有意義的。

  fdformat 也將驗證軟盤,例如檢查壞塊。它在壞塊試驗幾次(你通常能聽到,驅動器的雜訊很明顯)。 If the floppy is only marginally bad (due to dirt on the read/write head, some errors are false signals), fdformat 可能沒事,而真正的錯誤可能退出有效過程。核心把發現的每個I/O錯誤列印log信息,送到控制台,或者,如果使用了syslog ,也送到/usr/adm/messages 文件。fdformat 自己不說明哪裡出錯(也不必考慮,軟盤很便宜,壞了就扔)。

  $ fdformat /dev/fd0H1440
  Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
  Formatting ... done
  Verifying ... read: Unknown error
  $

  badblocks 命令可用於查找任何磁碟或分區的壞塊(包括軟盤)。它不格式化磁碟,因此可以用於檢查存在的文件系統。下面的例子檢查出一張3.5'軟盤上的2個壞塊:

  $ badblocks /dev/fd0H1440 1440
  718
  719
  $

  badblocks 輸出發現的壞塊的塊號。多數文件系統可以避免這樣的壞塊。他們維護一個已知的壞塊列表,在文件系統建立時初始化,並可以在以後修改。初始的壞塊查找可由mkfs 命令完成(它初始化文件系統),以後可以用badblocks 來檢查,新的塊可以用fsck 加入。後面我們將說明mkfs 和fsck 。

  許多新型的硬碟自動發現壞塊,並企圖用一個特定的、保護的好塊來代替它。這對操作系統是不可見的。這種特徵應該在硬碟手冊的文檔中,如果你好奇的話。但即使這樣的硬碟也可能失敗,如果壞塊數量太大的話,雖然如果這樣,那硬碟就基本上不能用了。

  分區

  一個硬碟可分為幾個分區。每個分區好象是單獨的硬碟。這樣,你如果只有一個硬碟,卻想安裝2個操作系統,你可以把這個硬碟分為2個分區。每個操作系統任意使用自己的分區而不干擾另一個。這種方法,2個操作系統可以在同一硬碟上和平共處。如果沒有分區,你只能為每個操作系統購買一個硬碟。

  軟盤不分區。這沒有技術原因,只因為太小,沒有必要。CDROM一般也不分區,因為作為一個大盤更易於使用,而且很少有多操作系統的需要。

  MBR(主引導記錄), 啟動扇區和分區表

  一個硬碟如何分區的信息存在它的第一個扇區(即第一面第一道第一扇區)。這個第一扇區是硬碟的主引導記錄(MBR);這是計算機啟動時BIOS讀入和啟動的扇區。主引導記錄包括一段小程序,讀入分區表,檢查哪個分區是活動分區(即啟動分區),並讀入活動分區的第一個扇區:該分區的啟動扇區(MBR也是啟動扇區,只不過因為其特殊地位,所以使用特殊的名字)。這個啟動扇區包括另一個小程序,讀入這個分區(假設是可啟動的)上操作系統的第一個部分,然後啟動它。

  這個分區方案不是內置於硬體和BIOS的,只是許多操作系統遵循的約定。並非所有的操作系統都遵循這個約定,也有例外。有些操作系統支持分區,但他們佔領硬碟上的一個分區,然後使用他們自己的內部分區方法管理這個分區。較新的操作系統可以和其他操作系統和平共處(包括Linux),而無需特殊的措施,但不支持分區的操作系統無法在同一硬碟上與其他操作系統共存。

  為安全預防,最好先在紙上寫下分區表,這樣在錯誤發生時不會丟失你的文件。(可以使用fdisk 修復壞的分區表)。 )相關信息可用fdisk -l 命令給出:

  $ fdisk -l /dev/hda

  Disk /dev/hda: 15 heads, 57 sectors, 790 cylinders
  Units = cylinders of 855 * 512 bytes

  Device Boot Begin Start End Blocks Id System
  /dev/hda1 1 1 24 10231+ 82 Linux swap
  /dev/hda2 25 25 48 10260 83 Linux native
  /dev/hda3 49 49 408 153900 83 Linux native
  /dev/hda4 409 409 790 163305 5 Extended
  /dev/hda5 409 409 744 143611+ 83 Linux native
  /dev/hda6 745 745 790 19636+ 83 Linux native
  $

  擴展和邏輯分區

  PC硬碟的最初的分區方案只允許4個分區。實際使用中這太少了,比如有人想裝多於4個操作系統 (Linux, MS-DOS, OS/2, Minix, FreeBSD, NetBSD, Windows/NT等),或有時一個操作系統有多個分區更好,例如由於速度的原因,Linux的對換區最好單獨使用自己的分區,而不是在主 Linux分區中(下文詳述)。

  為克服這個設計問題,發明了擴展分區。這個方法允許將基本分區分為若干子分區,因而被子分區的基本分區稱為擴展分區,而子分區稱為邏輯分區,他們的表現類似基本分區 ,但產生方法不同。他們之間沒有速度差別。

  硬碟的分區結構可能類似。這個硬碟被分為3個基本分區,第二個被分為2個邏輯分區。部分硬碟根本沒有分區。硬碟是一個整體,每個基本分區有一個啟動扇區。

  分區種類

  分區表(MBR和擴展分區里都有)中,對每個分區,有一個位元組指出分區種類。這試圖確定使用該分區的操作系統,或用於何操作系統。其目的是避免2個操作系統使用同一分區。可實際上,操作系統並不真的注意分區種類位元組;例如,Linux根本不管它是什麼。較壞的情況是,有些操作系統錯誤地使用它:例如有些版本的DR-DOS忽略了它的最高位(MSB),而其他一些系統則不是。

  沒有一個標準化組織定義分區種類位元組每個值的意義,但一些共同接受的值包括在表 4.1中。相同的列表可以通過Linux的fdisk 命令得到。

  給硬碟分區

  有許多產生和刪除分區的程序。許多操作系統自帶,最好使用其自帶的,除非要做一些它不能作到的。許多這種程序叫fdisk , 包括Linux, 或其變種。 Linux fdisk 的使用細節可見其Man手冊。 cfdisk 命令類似fdisk , 但有更好的用戶界面(全屏的)。

  使用IDE硬碟時,啟動分區(帶可啟動核心映象文件的分區)必須全在前1024個柱面內。這是因為硬碟通過BIOS啟動(在系統進入保護模式前),而BIOS不能處理多於1024柱面。有時也可能使用部分在前1024柱面的啟動分區,這要求所有用BIOS讀入的文件都在前1024柱面內。由於這難與安排,因此這是個很差的主意;你不可能知道什麼時候核心升級或磁碟碎片整理會導致系統無法啟動。因此,應該確認你的啟動分區完全在前1024柱面內。

  事實上,一些新版的BIOS和IDE硬碟可以處理多於1024柱面。如果你有這樣一個系統,你可以忘卻這個問題;如果你不能確認,還是把啟動分區放在前1024柱面內。

  每個分區擁有一塊連續的扇區。因為Linux文件系統使用1 kB的塊,即2個扇區,所以奇數個扇區會導致最後一個扇區不能使用,這不會有什麼問題,但不好,有些版本的 fdisk 會對此給出警告。

  改變分區大小一般要求首先備分此分區想保留的所有東西(為防萬一,最好備分整個硬碟),然後刪除此分區,產生新分區,最後回存所有東西到新分區。如果是擴大分區,你可能需要調整相鄰分區的大小(並備分、回存)。

  由於改變分區大小是如此痛苦,最好一次就確定。或擁有一個有效而易用的備分系統。如果你通過無須太多人工干預的介質安裝(例如CDROM,而不是軟盤),那麼開始可以比較容易地玩玩各種設置。因為你無須備分什麼數據,改幾次分區大小不會太過痛苦。

  有個MSDOS的程序叫fips , 可以無須備分和回存地改變MSDOS分區的大小, 但對其他文件系統,備分回存還是必須的。

  設備文件和分區

  每個分區和擴展分區有自己的設備文件。這些文件的命名規定是在整個盤的名字加分區號,並約定1-4是基本分區(不管真的有幾個基本分區),5-8是邏輯分區(不管它在哪個基本分區中)。例如,/dev/hda1 是第一個IDE硬碟的第一個基本分區,而/dev/sdb7 是第二個SCSI硬碟的第三個擴展分區。設備列表 [Anv]給出更詳細的信息。

  文件系統

  什麼是文件系統?

  文件系統是操作系統用於明確磁碟或分區上的文件的方法和數據結構;即在磁碟上組織文件的方法。也指用於存儲文件的磁碟或分區,或文件系統種類。因此,可以說"我有2個文件系統"意思是他有2個分區,一個存文件,或他用 "擴展文件系統",意思是文件系統的種類。

  磁碟或分區和它所包括的文件系統的不同是很重要的。少數程序(包括最有理由的產生文件系統的程序)直接對磁碟或分區的原始扇區進行操作;這可能破壞一個存在的文件系統。大部分程序基於文件系統進行操作,在不同種文件系統上不能工作。

  一個分區或磁碟能作為文件系統使用前,需要初始化,並將記錄數據結構寫到磁碟上。這個過程就叫建立文件系統。

  大部分UNIX文件系統種類具有類似的通用結構,即使細節有些變化。其中心概念是超級塊superblock, i節點inode, 數據塊data block,目錄塊directory block, 和間接塊indirection block。超級塊包括文件系統的總體信息,比如大小(其準確信息依賴文件系統)。 i節點包括除了名字外的一個文件的所有信息,名字與i節點數目一起存在目錄中,目錄條目包括文件名和文件的i節點數目。 i節點包括幾個數據塊的數目,用於存儲文件的數據。 i節點中只有少量數據塊數的空間,如果需要更多,會動態分配指向數據塊的指針空間。這些動態分配的塊是間接塊;為了找到數據塊,這名字指出它必須先找到間接塊的號碼。

  UNIX文件系統通常允許在文件中產生孔(hole) (用lseek ; 請看手冊), 意思是文件系統假裝文件中有一個特殊的位置只有0位元組,但沒有為這文件的這個位置保留實際的磁碟空間(這意味著這個文件將少用一些磁碟空間)。這對小的二進位文件經常發生,Linux共享庫、一些資料庫和其他一些特殊情況。 (孔由存儲在間接塊或i節點中的作為數據塊地址的一個特殊值實現,這個特殊地址說明沒有為文件的這個部分分配數據塊,即,文件中有一個孔。)

  孔有一定的用處。在筆者的系統中,一個簡單的測量工具顯示在200MB使用的磁碟空間中,由於孔,節約了大約4MB。在這個系統中,程序相對較少,沒有資料庫文件。有關這個測量工具的細節請看附錄 A.

  Filesystems galore

  Linux支持多種文件系統。下面是最重要的幾個:

minix
最老的,相信是最可靠的,但缺少特色(有些沒有時間標記,文件名最長30個字元),能力有局限(每個文件系統最多64MB)。

xia
minix文件系統的一個修正版本,提升了文件名和文件系統大小的局限,但沒有新的特色。不太流行,但據說工作得很好。

ext2
最好的Linux自己的文件系統,也是當前最通用的。其設計易於向上兼容,所以新版的文件系統代碼無需重做已有的文件系統。

ext
ext2的老版,且不向上兼容。難於用新版安裝程序安裝,大部分人都改用ext2。

  另外,支持多種其他現存的外圍文件系統,很容易與其他外圍文件系統交換文件。這些外圍文件系統好象是自己的一樣,除了可能缺少一些一般UNIX的特徵,或有些不同的局限。

msdos
與MSDOS、OS/2等的FAT文件系統兼容。

umsdos
Linux下的擴展msdos文件系統驅動,支持長文件名、所有者、允許許可權、連接和設備文件。允許一個普通的msdos文件系統用於Linux,而無須為Linux建立單獨的分區。

iso9660
標準CDROM文件系統,通用的Rock Ridge增強,允許長文件名。

nfs
網路文件系統,允許多台計算機之間共享文件系統,易於從所有這些計算機上存取文件。

hpfs
OS/2文件系統。

sysv
SystemV/386, Coherent, 和Xenix文件系統。

  根據情況選擇文件系統。如兼容性或其他原因必需使用非Linux文件系統,那就必須用。如果可以自由選擇,可能最明智的選擇是ext2,因為它擁有全部特徵而無須忍受性能缺陷。

  還有proc文件系統, 一般在/proc 目錄, 它不是一個真正的文件系統,雖然好象是。proc文件系統使用戶易於存取全部核心數據結構,比如進程列表。它使這些數據結構看起來象個文件系統,且此文件系統可以用所有一般的文件工具操作。例如,要得到所有進程的列表,可以使用命令

$ ls -l /proc
total 0
dr-xr-xr-x 4 root root 0 Jan 31 20:37 1
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 63
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 94
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 95
dr-xr-xr-x 4 root users 0 Jan 31 20:37 98
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 99
-r--r--r-- 1 root root 0 Jan 31 20:37 devices
-r--r--r-- 1 root root 0 Jan 31 20:37 dma
-r--r--r-- 1 root root 0 Jan 31 20:37 filesystems
-r--r--r-- 1 root root 0 Jan 31 20:37 interrupts
-r-------- 1 root root 8654848 Jan 31 20:37 kcore
-r--r--r-- 1 root root 0 Jan 31 11:50 kmsg
-r--r--r-- 1 root root 0 Jan 31 20:37 ksyms
-r--r--r-- 1 root root 0 Jan 31 11:51 loadavg
-r--r--r-- 1 root root 0 Jan 31 20:37 meminfo
-r--r--r-- 1 root root 0 Jan 31 20:37 modules
dr-xr-xr-x 2 root root 0 Jan 31 20:37 net
dr-xr-xr-x 4 root root 0 Jan 31 20:37 self
-r--r--r-- 1 root root 0 Jan 31 20:37 stat
-r--r--r-- 1 root root 0 Jan 31 20:37 uptime
-r--r--r-- 1 root root 0 Jan 31 20:37 version
$

(可能有些文件與進程不符。上面的例子被簡短了。)

  注意雖然叫文件系統,proc文件系統沒有一個部分與磁碟有關,它只在核心映象中存在。任何人任何時候想看proc文件系統的任何部分,核心使它看起來好象這部分在什麼地方存在(雖然沒有)。因此,雖然/proc/kcore 文件有好多兆位元組,但它根本沒用任何磁碟空間。

  應該用哪個文件系統?

一般沒有什麼理由用許多不同的文件系統。當前,ext2fs是最流行的,可能是最明智的選擇。根據記錄結構、速度、(感覺的)可靠性、兼容性和其他不同的理由,適當地使用其他文件系統。個別情況需要個別決定。

  建立文件系統

  用mkfs 命令建立文件系統,即初始化。實際上,對每個不同種類的文件系統有一個單獨的程序。 mkfs 只是為了建立不同文件系統種類確定運行不同程序的一個前端。用-t fstype選項選擇種類。

  被mkfs 調用的程序有不同的命令行介面。最通用和最重要的選項如下,細節請看手冊。

-t fstype
選擇文件系統種類。

-c
查找壞塊,初始化壞塊列表。

-l filename
從文件filename讀入壞塊列表。

用如下命令在軟盤上產生ext2文件系統:
$ fdformat -n /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
$ badblocks /dev/fd0H1440 1440 > bad-blocks
$ mkfs -t ext2 -l bad-blocks /dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group

Writing inode tables: done
Writing superblocks and filesystem accounting information: done
$
  首先,格式化軟盤(-n選項不進行確認,即壞塊檢查)。然後用badblocks 查找壞塊, 輸出定向到文件bad-blocks。最後,產生文件系統,壞塊列表由文件badblocks 初始化。
-c選項可以與mkfs 一起使用,而無須badblocks 和一個單獨的文件。如下:

$ mkfs -t ext2 -c /dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group

Checking for bad blocks (read-only test): done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
$
  使用-c比用單獨使用badblocks 更方便, 但建立文件系統后檢查,badblocks 是必要的。
在硬碟或分區上準備文件系統的過程和軟盤是一樣的,除了無須格式化。

  Mount和unmount

  一個文件系統可以使用之前,必須mount。操作系統然後做一些記錄以確認正常。因為UNIX所有的文件在一個目錄樹中, mount操作的結果使新的文件系統的內容好象在某個已經mount的文件系統的一個已經存在的子目錄中。

  上面的mount可能使用如下命令:

$ mount /dev/hda2 /home
$ mount /dev/hda3 /usr
$
  mount 命令使用2個參數。第一個是與包括文件系統的磁碟或分區相關的設備文件。第二個是要mount到的目錄。 mount以後,這2個文件系統的內容好象是/home 和/usr 目錄。這樣就可以說:/dev/hda2 被mount到 /home , /usr 也同樣。要看每個文件系統,就看其被安裝的目錄,好象它就是在那裡。注意設備文件的區別,/dev/hda2 , 和安裝到的目錄/home 。設備文件給出硬碟原始內容的存取,安裝到的目錄給出磁碟上文件的存取。安裝到的目錄叫安裝點。

  Linux支持許多文件系統。mount 會試著猜測文件系統種類。也可以使用-t fstype 選項直接定義種類;這有時是必要的,因為自檢測mount 並非總能成功。例如要mount一個MSDOS軟盤,可以用如下命令:

$ mount -t msdos /dev/fd0 /floppy
$

  安裝點目錄不必是空的,但必須存在。其中的所有文件當文件系統mount后將不可用名字存取(已經打開的文件將繼續可存取。有其他目錄硬連接的文件可以通過那些名字存取)。這沒有壞處,反而可能更有用。例如,有人喜歡將/tmp 和/var/tmp 作為同義,將/tmp 作為/var/tmp 的符號連接。系統啟動時,在/usr 文件系統被mount之前,使用駐留在根文件系統的 /var/tmp 目錄。當/usr 被mount上以後,根文件系統上的/var/tmp 將不可用,如果根文件系統上不存在 /var/tmp ,那麼在mount上/var 之前將不可能使用暫存文件。

  如果不打算在一個文件系統上寫任何東西,可以使用mount 的-r開關做一個只讀mount。這將使核心停止任何對此文件系統的寫要求,也將停止核心的對i節點的文件存取時間的更新。只讀mount對不可寫介質是必要的,例如CDROM。

  細心的讀者可能已經注意到一個小的邏輯問題。第一個文件系統(叫根文件系統,因為它包含根目錄)如何mount,因為很明顯,它不能mount到另一個文件系統? Well, the answer is that it is done by magic. The root filesystem is magically mounted at boot time, and one can rely on it to always be mounted-- 如果根文件系統不能mount,系統將不能啟動。 The name of the filesystem that is magically mounted as root 被編譯進核心,或用LILO或rdev 設置。

  根文件系統通常先被只讀mount。然後啟動手稿運行fsck 校驗它的有效性,如果沒有問題,將re-mount它,使之可寫。fsck 不能運行於一個已mount的文件系統,因為fsck 運行時,任何文件系統的改變將導致錯誤。因為根文件系統在被檢查時是只讀,fsck 可以無慮地修復任何問題,因為re-mount 操作將刷新文件系統在內存中的所有數據。

  在有其他文件系統的許多系統中,啟動時要自動mount,可以在/etc/fstab 文件中定義:文件格式細節請參考fstab 的手冊頁。 mount特別的文件系統的特別細節依賴於許多因素,可以根據需要由每個管理員設置。 When the chapter on booting is finished, you may read all about it there.

  當一個文件系統不需要再mount著,可以用umount . umount 加一個參數unmount它,參數可以是設備文件或安裝點。例如,要unmount上面例子中的目錄,可以用:

$ umount /dev/hda2
$ umount /usr
$

  要了解使用這個命令的更多的說明,參閱手冊。注意:記住unmount已經mount的軟盤, 而不能僅僅將軟盤彈出軟碟機!由於磁碟緩衝,在你unmount軟盤之前無須回寫,因此過早取出軟盤將導致內容不正確。只從軟盤上讀還不要緊,如果寫,就可能發生災難性的損失。

  mount和umount需要超級擁護特權,即只有root 用戶可以做。原因是:如果任何用戶都可以mount軟盤到任何目錄,那麼很容易用軟盤做,比如,用特洛伊木馬替換/bin/sh , 或者其他常用的程序。但是允許用戶使用軟盤經常又是必要的,有幾種方法:

  給用戶root 口令,很明顯這對安全不利,但是最簡單的方法。如果沒有安全要求,這個方法很好,比如在非網路的、個人系統上。

  使用一個程序比如sudo 允許擁護使用mount。這同樣對安全不利,但沒有直接給任何人超級用戶特權。

  讓用戶使用mtools , 這是一個利用MSDOS文件系統的軟體包,無須mount。如果是MSDOS軟盤這樣做很好,否則不好。

  在/etc/fstab 中用合適的選項列出軟碟機設備和允許的安裝點。

  最後一個選擇可以在/etc/fstab 文件中加類似下面的一行來完成:

  /dev/fd0 /floppy msdos user,noauto 0 0

  各列分別是:要mount的設備文件,要安裝到的目錄,文件系統類型,選項,備份頻率(用於dump ) 和fsck 次序(定義啟動時文件系統被檢查的次序,0表示不檢查)。

noauto選項使系統啟動是不自動mount(即, it stops mount -a from mounting it)。 user允許任何用戶mount這個文件系統,並且,由於安全原因,不允許執行程序(normal or setuid) and interpretation of device files from the mounted filesystem。這樣,任何用戶都可以用如下命令mount一個msdos文件系統的軟盤:

$ mount /floppy
$

  軟盤可以用相關的umount 被unmount。

  如果想提供多種軟盤的存取,需要給出多個安裝點。對每個安裝點的設置可以不同。例如,提供MSDOS和ext2文件系統的存取,可以在/etc/fstab 文件中加如下行:

/dev/fd0 /dosfloppy msdos user,noauto 0 0
/dev/fd0 /ext2floppy ext2 user,noauto 0 0

  對於MSDOS文件系統(不僅是軟盤),可能需要用uid, gid,和umask 文件系統選項來限制存取許可權,請看mount 手冊頁。如果不小心,mount一個MS-DOS文件系統將給予任何用戶至少是讀許可權,這可不是一個好主意。

  用fsck檢查文件系統完整性

  文件系統很複雜,因此易於發生錯誤。可以用fsck 命令檢查文件系統是否正確和有效。它可以根據指令修復找到的小錯誤,並將未修復錯誤報告用戶。幸運的是,文件系統的代碼非常有效,所以根本極少出現問題,並且問題通常原因是電源失敗、硬體失敗、或操作錯誤,例如沒有正常關閉系統。

  大多數系統設置為啟動時自動運行fsck ,因此任何錯誤將在系統使用前被檢測到(並根據希望修正)。使用有錯誤的文件系統可能使問題變得更壞:如果數據結構有問題,使用這個文件系統可能使之更糟,導致更多的數據丟失。當然,在大的文件系統上運行fsck 會花一定的時間,如果系統正常關閉,幾乎從不發生錯誤,因此有一些方法可以不進行檢查。如果文件/etc/fastboot 存在,就不檢查。另外,如果ext2文件系統在超級快中有一個特定的標記告知該文件系統在上次mount后沒有正常unmount. 如果標記指出unmount正常完成(假設正常unmount指出沒問題),e2fsck (fsck 的ext2文件系統版) 就不檢查系統。/etc/fastboot 是否影響系統依賴於你的啟動手稿,但ext2標記則在你使用e2fsck 時發生作用--基於一個e2fsck 選項(參閱e2fsck 手冊頁)

  自動檢查只對啟動時自動mount的文件系統發生作用。使用fsck 手工檢查其他文件系統,比如軟盤。

  如果fsck 發現為修復的問題,你需要深入了解文件系統的一般工作原理和有問題的文件系統的細節,或好的備份。最後一個辦法容易(雖然冗長)安排,如果你自己不知道,有時可以通過朋友、Linux新聞組、電子郵件列表或其他支持源安排。我很想告訴你更多,但我對這的學習和實踐也並不多。Theodore T'so的debugfs 程序應該有用。

  fsck 只能運行於未mount的文件系統,不要用於已mount的文件系統(除了啟動時的只讀根文件系統)。這是因為它存取原始磁碟,在操作系統不知道的情況下修改文件系統。 There will be trouble, if the operating system is confused.

  用badblocks檢查磁碟錯誤

  應該周期性地用badblocks 命令檢查壞塊它輸出找到的所有壞塊的編號的列表。列表給fsck 記錄在文件系統數據結構中,使操作系統存儲數據時不使用這些壞塊。舉例:

$ badblocks /dev/fd0H1440 1440 > bad-blocks
$ fsck -t ext2 -l bad-blocks /dev/fd0H1440
Parallelizing fsck version 0.5a (5-Apr-94)
e2fsck 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Check reference counts.
Pass 5: Checking group summary information.

/dev/fd0H1440: ***** FILE SYSTEM WAS MODIFIED *****
/dev/fd0H1440: 11/360 files, 63/1440 blocks
$

  如果badblocks報告一個塊已經使用,e2fsck 將試著將此塊移到其他地方。如果該塊真的壞了,而不是在壞塊邊緣,文件內容可能丟失。

  Fighting fragmentation

  文件寫到磁碟時,不一定在連續的塊中。沒在連續塊中的文件叫碎片。因為磁碟的讀寫頭回更多地移動,讀碎片文件會花較長的時間。雖然如果有好的讀前緩衝系統不會有什麼問題,但最好還是避免碎片。

  Ext2文件系統試圖使碎片最少,即使不能將一個文件的所有塊存在連續扇區中,也盡量靠近。 Ext2通常有效地安排里文件其他塊最近的空閑塊,因此很少需要關心碎片問題。 Ext2文件系統有一個消除碎片程序,請看參考書目中的 [TV]。

  有許多MSDOS消碎片程序在文件系統中移動塊以消除碎片。其他一些文件系統,消碎片必須通過備份-重產生-回存文件系統來完成。對於所有文件系統,消碎片應該備份文件系統,因為很多原因可能在消碎片過程中導致錯誤。

  對所有文件系統的其他工具

  一些其他工具對管理文件系統有用。 df (Disk Free)顯示一個或多個文件系統的空閑磁碟空間。 du (Disk Usage)顯示一個目錄和其內的所有文件使用了多少磁碟空間。這用於發現磁碟空間浪費。

  sync 強制將磁碟緩衝的所有未寫塊寫入磁碟(見 5.6)。這一般無須手工完成,由守護進程update 自動完成。這在有些情況下很有用,例如,如果update 或其輔助進程bdflush 死了,或你不能等運行update 必須馬上 關閉電源。

  對ext2文件系統的其他工具

  除了產生文件系統的mke2fs 和檢查文件系統的e2fsck 直接或通過與文件系統類型無關的前端存取外,Ext2文件系統還有幾個有用的工具。

  tune2fs 調整文件系統參數。一些有趣的參數有:

  最大mount數。當文件系統被mount過多少次以後,即使標誌是乾淨的,e2fsck 強制檢查。對用於開發或測試的系統,應該降低這個限制數。

  最大檢查間隔。到達這個間隔時間,即使標誌是乾淨的,e2fsck 強制檢查。如果文件系統不是經常mount,可以不使能這個功能。

  保留給root的塊數。Ext2給root保留一些塊,這樣如果文件系統滿了,還可能無須刪除任何東西做系統管理。保留量確省是5%,這在大多數磁碟上不會造成浪費。當然,軟盤沒有理由保留塊。

dumpe2fs 顯示一個ext2文件系統的信息,大部分來源於超級塊。有些輸出信息是技術性的,要求對文件系統工作的理解(見附錄 ), 但許多即使是一般管理員是也易於理解的。

  debugfs 是一個文件系統調試器。它允許直接存取磁碟上的文件系統數據結構,可用於修復fsck 不能自動修復的磁碟。它也可用於恢復被刪除的文件。但是,debugfs 非常要求你理解你所乾的事,錯誤的理解和操作將破壞你的所有數據。

  dump 和restore 可用於備份一個ext2文件系統。它們是傳統UNIX備份工具的ext2版。關於更有關備份的信息見 9章。

  沒有文件系統的磁碟

  並非所有磁碟或分區都作為文件系統使用。例如對換分區,就沒有文件系統。許多軟盤作為磁帶模擬使用,所以tar 或其他文件可以直接寫到原始磁碟,而不是文件系統。Linux啟動軟盤不包括文件系統,只是原始核心。

  不用文件系統的優點是有更多的磁碟可用空間,因為文件系統需要一些記錄。也更容易與其他系統兼容;例如tar 文件格式在所有系統上相同,而文件系統則在大多數系統上不同。如果需要,你會很快使用沒有文件系統的磁碟。可啟動的 Linux軟盤無需文件系統,雖然有也可能。

  使用原始磁碟的一個原因是做映象拷貝。比如,如果磁碟包含部分損壞的文件系統,那麼在修復前做一個完全拷貝是個好主意,因為如果你修錯了,可以重來。做映象拷貝的一個方法是用 dd :

$ dd if=/dev/fd0H1440 of=floppy-image
2880+0 records in
2880+0 records out
$ dd if=floppy-image of=/dev/fd0H1440
2880+0 records in
2880+0 records out
$

  第一個dd 給軟盤做了一個完全映象到文件 floppy-image , 第二個把映象寫到軟盤。 (假設用戶在第二個命令前換了軟盤。否則這個命令對可能沒用。)

  分配磁碟空間

  分區概要


  用最好的方式給磁碟分區不容易,而且,沒有一個通用的正確方法,這包括很多因素。

  傳統的方法是有個(相對)小的根文件系統,包括 /bin , /etc , /dev , /lib , /tmp , 和其他系統啟動和運行需要的東西。這種方法,根文件系統(在它自己的分區或硬碟上)是所有系統啟動需要的東西。理由是如果根文件系統小而不常用,系統崩潰時它就不太容易損壞,而且崩潰時也易於修復。然後給/usr 目錄樹、用戶主目錄(經常在/home )、對換空間產生單獨的分區或使用單獨的硬碟。分離的用戶主目錄(存用戶文件)在其自己的分區中易於備份,因為一般無須備份程序(/usr 中)。網路環境中,這樣可以使多台計算機共享/usr (例如使用NFS) 這樣每台機器可以節約數十、數百兆的磁碟空間。

  多分區的問題是將整個磁碟的空閑空間分割成若干小片。現在,由於磁碟和操作系統已經很可靠,許多人更傾向與一個分區存所有文件。當然,這樣可能比備份、回存小分區痛苦些。

  對於小硬碟(假設你不做核心開發),最好的方法可能是只要一個分區。對於大硬碟,分幾個大分區可能更好。尤其在某種情況下出現錯誤時。 (注意這裡說的小和大是相對的,根據你對磁碟空間的需求而言。)

  如果你有多個硬碟,你可能想讓根文件系統(包括/usr ) 在一個上,而用戶主目錄在另一個上。

  最好準備嘗試幾個不同的分區方案(over time, not just while first installing the system)。這有些工作量,因為這其實是從頭安裝系統若干遍,但這是確認正確的唯一方法。

  空間要求

  你安裝的Linux給出一些對不同配置所需磁碟空間的指示。單獨安裝的程序可能也是。這能幫助你計劃你的磁碟使用,但你應該為以後可能的需求保留一些額外空間。

  擁護文件總量基於你的用戶希望。許多人好象想要他們所有可能的文件量,但多多益善。有些人只有很少的文字處理,也許幾兆就夠,而有些人可能需要上GB的空間做圖象處理。

  順便說一句,用KB或MB比較文件大小和用MB給出的磁碟空間時,應當注意這2者的可能的不同。一些硬碟製造商喜歡稱1000位元組為1KB,1000KB為1MB,而計算機世界的其他地方都以1024為因數。因此我的MB硬碟實際只是330MB硬碟。

  對換空間在5.5章討論。

  硬碟分配舉例

  我原來有個109MB的硬碟,現在我用一個330MB硬碟。我解釋一下我如何分區這些硬碟並說明為什麼。

  當我的需要和操作系統變化時,我用不同的方法分區109MB硬碟。我說明2種方案。首先,我曾和Linux一起運行MSDOS,為此,我需要大約20MB給MSDOS、C編譯器、編輯器、一些其他工具、我工作的程序、和足夠的空閑空間。給Linux開了10MB對換分區,其他79MB作為一個分區給Linux。我曾試驗給出單獨的根,/usr , 和/home ,但這樣就沒有什麼空閑空間幹什麼有趣的事了。

  當我不再需要MSDOS,我重新分區,12MB對換分區,其他是一個單獨的文件系統。

  從頭分區是為了玩玩要求自己分區的一些東西,例如試試不同的Linux,或比較文件系統的速度。當沒有這些需要后,就把它作為對換區(我喜歡打開好多窗口)。

  給Linux增加更多的磁碟空間

  給Linux增加更多的磁碟空間很容易,至少在硬體都安裝好后(硬體安裝不在本書所述的範圍)。如果需要,先格式化,然後產生分區和上面說過的文件系統,在/etc/fstab 中加入正確的行使之能自動mount。

  節約磁碟空間的提示

  節約磁碟空間的最好提示是不要安裝不必要的程序。許多Linux distributions給出安裝其所帶軟體包某些部分的選擇,分析你的需求你可能發現好多你並不需要。這會節約很多磁碟空間,因為許多程序需要很大空間。即使你需要某部分包或程序,也不一定需要其全部。例如有些在線文檔可能不必要,有些GNU Emacs的Elisp文件, 有些X11的字體,或者有些編程庫。

  如果你不能卸裝包,你可以壓縮。如gzip 或zip 的壓縮程序可以壓縮/解壓文件或文件群。gzexe 系統可以對用戶透明地壓縮/解壓程序 (沒用的程序被壓縮,當被使用時解壓)。實驗中的DouBle 系統對程序透明地壓縮文件系統中的所有文件。(如果你熟悉例如Stacker for MS-DOS等產品,原理是一樣的。

[火星人 ] 讓你快速成LINUX系統管理員已經有920次圍觀

http://coctec.com/docs/linux/show-post-134475.html