探究操作系統
既然我們已經知道了如何在文件系統中跳轉,是時候開始 Linux 操作系統之旅了。然而在開始之前,我們先學習一些對研究 Linux 系統有幫助的命令。
- ls -列出目錄內容
- file - 確定文件類型
- less -遊覽文件內容
甚至可以列出多個指定目錄的內容。在這個例子中,將會列出用戶家目錄(用字符“~”代表)和/usr 目錄的內容.
ls命令有大量的選項, 下面列出最常使用的選項
- -a 列出所有文件,甚至包括文件名以圓點開頭的默認會被隱藏的隱藏文件。
- -d 通常,如果指定了目錄名,ls 命令會列出這個目錄中的內容,而不是目錄本身。 把這個選項與 -l 選項結合使用,可以看到所指定目錄的詳細信息,而不是目錄中的內容。
- -F 這個選項會在每個所列出的名字後面加上一個指示符。例如,如果名字是 目錄名,則會加上一個’/'字符。
- -h 當以長格式列出時,以人們可讀的格式,而不是以字節數來顯示文件的大小。
- -l 以長格式顯示結果。
- -r 以相反的順序來顯示結果。通常,ls 命令的輸出結果按照字母升序排列。
- -S 命令輸出結果按照文件大小來排序。
- -t 按照修改時間來排序。
深入研究長格式輸出
正如我們先前知道的,“-l”選項導致 ls 的輸出結果以長格式輸出。這種格式包含大量的有用信息。下面的例子目錄來自 於 Ubuntu 系統:
root@iZbp1964mdfcasypu6zftxZ:~# ls -l
total 4648
drwxr-xr-x 3 root root 4096 Aug 6 12:52 deploy
drwxr-xr-x 4 root root 4096 Jul 18 20:44 django_web
drwxr-xr-x 4 root root 4096 Sep 11 10:43 flask_web
drwxr-xr-x 2 root root 4096 Aug 15 18:03 heikeji
-rw-r--r-- 1 root root 88042 Aug 20 09:16 index.html
-rw------- 1 root root 73 May 29 09:19 nohup.out
drwxrwxr-x 6 1000 1000 4096 May 28 16:22 openresty-1.13.6.2
-rw-r--r-- 1 root root 4635916 May 15 04:26 openresty-1.13.6.2.tar.gz
drwxr-xr-x 3 root root 4096 May 17 14:20 python3.5_env
drwxr-xr-x 3 root root 4096 Aug 9 18:24 test
- drwxr-xr-x 對於文件的訪問權限。第一個字符指明文件類型。在不同類型之間, 開頭的“-”說明是一個普通文件,“d”表明是一個目錄。其後三個字符是文件所有者的 訪問權限,再其後的三個字符是文件所屬組中成員的訪問權限,最後三個字符是其他所 有人的訪問權限。
- 3 文件的硬鏈接數目
- root 文件所有者的用戶名。
- root 文件所屬用戶組的名字。
- 4096 以字節數表示的文件大小
- Aug 6 12:52 上次修改文件的時間和日期。
- deploy 文件名。
確定文件類型
隨着探究操作系統的進行,知道文件包含的內容是很有用的。我們將用 file 命令來確定文件的類型。我們之前討論過, 在 Linux 系統中,並不要求文件名來反映文件的內容。然而,一個類似 “picture.jpg” 的文件名,我們會期望它包含 JPEG 壓縮圖像,但 Linux 卻不這樣要求它。可以這樣調用 file 命令:
file filename
當調用file命令後,file命令會打印出文件內容簡單描述.例如:
root@iZbp1964mdfcasypu6zftxZ:~# file openresty-1.13.6.2.tar.gz
openresty-1.13.6.2.tar.gz: gzip compressed data, was "openresty-1.13.6.2.tar", last modified: Mon May 14 20:25:03 2018, max compression, from Unix
有許多種類型的文件。事實上,在類 Unix 操作系統中比如說 Linux 中,有個普遍的觀念就是“一切皆文件”。 隨着課程的進行,我們將會明白這句話是多麼的正確。
雖然系統中許多文件格式是熟悉的,例如 MP3和 JPEG 文件,但也有一些文件格式不太常見,極少數文件相當陌生
用less遊覽文件內容
less 命令是一個用來瀏覽文本文件的程序。縱觀 Linux 系統,有許多人類可讀的文本文件。less 程序爲我們檢查文本文件 提供了方便。
less命令是這樣使用的
less filename
一旦運行起來,less 程序允許你前後滾動文件。例如,要查看一個定義了系統中全部用戶身份的文件,輸入以下命令:
root@iZbp1964mdfcasypu6zftxZ:~# less /etc/passwd
一旦 less 程序運行起來,我們就能瀏覽文件內容了。如果文件內容多於一頁,那麼我們可以上下滾動文件。按下“q”鍵, 退出 less 程序。
下面列出less程序最常使用的鍵盤命令
命令 | 行爲 |
---|---|
Page UP or b | 向上翻滾一頁 |
Page Down or space | 向下翻滾一頁 |
UP Arrow | 向上翻滾一行 |
Down Arrow | 向下翻滾一行 |
G | 移動到最後一行 |
1G or g | 移動到開頭一行 |
/charaters | 向前查找指定的字符串 |
n | 向前查找下一個出現的字符串,這個字符串是之前所指定查找的 |
h | 顯示幫助屏幕 |
q | 退出less程序 |
less 就是 more
less 屬於”頁面調度器”類程序,這些程序允許以逐頁方式輕鬆瀏覽長文本文檔。 more 程序只能向前翻頁,而 less 程序允許前後翻頁,此外還有很多其它的特性。
旅行指南
Linux 系統中,文件系統佈局與類 Unix 系統的文件佈局很相似。實際上,一個已經發布的標準, 叫做 Linux 文件系統層次標準,詳細說明了這種設計模式。不是所有Linux發行版都根據這個標準,但 大多數都是。
下一步,我們將在文件系統中漫遊,來了解 Linux 系統的工作原理。這會給你一個溫習跳轉命令的機會。 我們會發現很多有趣的文件都是純人類可讀文本。下面旅行開始,做做以下練習:
- cd 到給定目錄
- 列出目錄內容 ls -l
- 如果看到一個有趣的文件,用 file 命令確定文件內容
- 如果文件看起來像文本,試着用 less 命令瀏覽它
linux系統中的目錄
目錄 | 內容 |
---|---|
/ | 根目錄, 萬物起源 |
/bin | 包含系統啓動和運行所必需的二進制文件 |
/boot | 包含 Linux 內核、初始 RAM 磁盤映像(用於啓動時所需的驅動)和 啓動加載程序。 |
/dev | 這是一個包含設備結點的特殊目錄。“一切都是文件”,也適用於設備。 在這個目錄裏,內核維護着所有設備的列表。 |
/etc | 這個目錄包含所有系統層面的配置文件。它也包含一系列的 shell 腳本, 在系統啓動時,這些腳本會開啓每個系統服務。這個目錄中的任何文件應該是可讀的文本文件。 |
/home | 在通常的配置環境下,系統會在/home 下,給每個用戶分配一個目錄。普通用戶只能 在自己的目錄下寫文件。這個限制保護系統免受錯誤的用戶活動破壞。 |
/lib | 包含核心系統程序所使用的共享庫文件。這些文件與 Windows 中的動態鏈接庫相似。 |
/lost+found | 每個使用 Linux 文件系統的格式化分區或設備,例如 ext3文件系統, 都會有這個目錄。當部分恢復一個損壞的文件系統時,會用到這個目錄。這個目錄應該是空的,除非文件系統 真正的損壞了。 |
/media | 在現在的 Linux 系統中,/media 目錄會包含可移動介質的掛載點, 例如 USB 驅動器,CD-ROMs 等等。這些介質連接到計算機之後,會自動地掛載到這個目錄結點下。 |
/mnt | 在早些的 Linux 系統中,/mnt 目錄包含可移動介質的掛載點。 |
/opt | 這個/opt 目錄被用來安裝“可選的”軟件。這個主要用來存儲可能 安裝在系統中的商業軟件產品。 |
/proc | 這個/proc 目錄很特殊。從存儲在硬盤上的文件的意義上說,它不是真正的文件系統。 相反,它是一個由 Linux 內核維護的虛擬文件系統。它所包含的文件是內核的窺視孔。這些文件是可讀的, 它們會告訴你內核是怎樣監管計算機的。 |
/root | root帳號的家目錄 |
/sbin | 這個目錄包含“系統”二進制文件。它們是完成重大系統任務的程序,通常爲超級用戶保留。 |
/tmp | 這個/tmp 目錄,是用來存儲由各種程序創建的臨時文件的地方。一些配置導致系統每次 重新啓動時,都會清空這個目錄。 |
/usr | 在 Linux 系統中,/usr 目錄可能是最大的一個。它包含普通用戶所需要的所有程序和文件 |
/usr/bin | /usr/bin 目錄包含系統安裝的可執行程序。通常,這個目錄會包含許多程序。 |
/usr/lib | 包含由/usr/bin 目錄中的程序所用的共享庫。 |
/usr/local | 這個/usr/local 目錄,是非系統發行版自帶程序的安裝目錄。 通常,由源碼編譯的程序會安裝在/usr/local/bin 目錄下。新安裝的 Linux 系統中會存在這個目錄, 並且在管理員安裝程序之前,這個目錄是空的。 |
/usr/sbin | 包含許多系統管理程序。 |
/usr/share | /usr/share 目錄包含許多由/usr/bin 目錄中的程序使用的共享數據。 其中包括像默認的配置文件、圖標、桌面背景、音頻文件等等。 |
/usr/share/doc | 大多數安裝在系統中的軟件包會包含一些文檔。在/usr/share/doc 目錄下, 我們可以找到按照軟件包分類的文檔。 |
/var | 除了/tmp 和/home 目錄之外,相對來說,目前我們看到的目錄是靜態的,這是說, 它們的內容不會改變。/var 目錄存放的是動態文件。各種數據庫,假脫機文件, 用戶郵件等等,都位於在這裏。 |
/var/log | 這個/var/log 目錄包含日誌文件、各種系統活動的記錄。這些文件非常重要,並且 應該時時監測它們。其中最重要的一個文件是/var/log/messages。注意,爲了系統安全,在一些系統中, 你必須是超級用戶才能查看這些日誌文件。 |
符號鏈接
在我們到處查看時,我們可能會看到一個目錄,列出像這樣的一條信息:
lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so
注意看,爲何這條信息第一個字符是“l”,並且有兩個文件名呢? 這是一個特殊文件,叫做符號鏈接(也稱爲軟鏈接或者 symlink )。 在大多數“類 Unix” 系統中, 有可能一個文件被多個文件名所指向。雖然這種特性的意義並不明顯,但它真的很有用
描繪一下這樣的情景:一個程序要求使用某個包含在名爲“foo”文件中的共享資源,但是“foo”經常改變版本號。 這樣,在文件名中包含版本號,會是一個好主意,因此管理員或者其它相關方,會知道安裝了哪個“foo”版本。 這會導致另一個問題。如果我們更改了共享資源的名字,那麼我們必須跟蹤每個可能使用了 這個共享資源的程序,當每次這個資源的新版本被安裝後,都要讓使用了它的程序去尋找新的資源名。 這聽起來很沒趣。
這就是符號鏈接存在至今的原因。比方說,我們安裝了文件 “foo” 的 2.6 版本,它的 文件名是 “foo-2.6”,然後創建了叫做 “foo” 的符號鏈接,這個符號鏈接指向 “foo-2.6”。 這意味着,當一個程序打開文件 “foo” 時,它實際上是打開文件 “foo-2.6”。 現在,每個人都很高興。依賴於 “foo” 文件的程序能找到這個文件,並且我們能知道安裝了哪個文件版本。 當升級到 “foo-2.7” 版本的時候,僅添加這個文件到文件系統中,刪除符號鏈接 “foo”, 創建一個指向新版本的符號鏈接。這不僅解決了版本升級問題,而且還允許在系統中保存兩個不同的文件版本。 假想 “foo-2.7” 有個錯誤(該死的開發者!),那我們得回到原來的版本。 一樣的操作,我們只需要刪除指向新版本的符號鏈接,然後創建指向舊版本的符號鏈接就可以了。
在上面列出的目錄(來自於 Fedora 的 /lib 目錄)展示了一個叫做 “libc.so.6” 的符號鏈接,這個符號鏈接指向一個 叫做 “libc-2.6.so” 的共享庫文件。這意味着,尋找文件 “libc.so.6” 的程序,實際上得到是文件 “libc-2.6.so”。 在下一章節,我們將學習如何建立符號鏈接。
硬鏈接
討論到鏈接問題,我們需要提一下,還有一種鏈接類型,叫做硬鏈接。硬鏈接同樣允許文件有多個名字, 但是硬鏈接以不同的方法來創建多個文件名。在下一章中,我們會談到更多符號鏈接與硬鏈接之間的差異問題。