一切皆文件

Everything is a file

原文地址: https://opensource.com/life/1...
原翻譯地址: http://www.tony-yin.top/2017/...

這裏先提一個技巧性的問題:如下哪個是文件?html

  • 目錄
  • Shell腳本
  • Office文檔
  • 串行端口(Serial ports
  • 內核數據結構
  • 內核調優參數
  • 硬盤驅動器
  • 分區
  • 邏輯卷(LVM
  • 打印機
  • 套接字(Sockets

也許你不會相信,可是對於UnixLinux,它們都是文件。這是最使人驚奇的概念之一——這樣作使得許多管理任務能夠被一些很是簡單但功能強大的方法執行,不然這些任務實現起來可能很是困難甚至不可能。linux

備份主引導記錄

舉個簡單任務的例子,考慮一下爲你的硬盤驅動器地主引導記錄(MBR)作一個備份工做。有時候我須要恢復或從新建立個人MBR,尤爲是分區表。從頭開始從新建立它是很是困難的。可是從保存好的文件中恢復出來這是很是容易的。Linux有一個很強大的GNU工具 --- dd,它能夠實現這個和其餘不少功能。shell

dd表示disk dump的縮寫,意爲「磁盤轉儲」,可是咱們不少資深管理員一直認爲它是disk destroyer的縮寫,由於若是你不是很當心的話,這個工具會準確無誤地執行你告訴它要作的事情,包括將硬盤上或者分區上全部的數據都破壞掉。數據結構

如下命令將會備份你的MBR,它必需要是root用戶執行,由於非root用戶沒有訪問/dev目錄下硬盤驅動器設備文件的權限。BSBlock Size縮寫,表示塊大小,count表示從源文件讀取的塊的個數。這個命令將在/tmp目錄建立一個myMBR.bak的文件。這個文件的大小將爲512字節,包含了MBR的內容,包括引導代碼和分區表等。工具

dd if=/dev/sda of=/tmp/myMBR.bak bs=512 count=1

若是MBR被損壞了,就須要引導到一個修復盤並執行下面的命令,這個命令本質上就是上面的反向操做。值得注意的是這條命令沒有必要指定塊大小和塊個數這兩個參數,由於dd命令將會把備份文件簡單地拷貝到硬盤的第一個扇區,而且當它執行到源文件末尾後中止。spa

dd if=/tmp/myMBR.bak of=/dev/sda

都是文件系統的一部分

Linux計算機上的全部內容均可以做爲文件系統空間的文件被訪問。這是很是重要的,這使得咱們 能夠使用通用的工具訪問不一樣的東西.net

dd命令可用於將硬盤的整個分區拷貝到一個文件或者以下所示的其餘硬盤。在這裏dd命令再次將數據拷貝到輸入設備的末尾並中止。請確保輸出設備的容量要大於輸入設備。翻譯

dd if=/dev/sdf2 of=/dev/sdg3

dd if=/dev/sda of=/dev/sdg

此外文件系統還有其餘工具能夠達到此做用。好比,cat命令能夠用來將任意文件的內容發送到標準輸出,這包括分區和整個硬盤。而後,輸出還能夠被重定向到一個文件。code

cat /dev/sda1 > partition1.backup

可是,cat命令沒有dd命令的控制功能。例如,不能指定從源設備或者源文件讀取的數據量。htm

下面是一個有趣的實驗,它將正面一切皆文件的事實。大多數Linux發行版都有多個虛擬控制檯,其中17能夠用來登陸到一個帶有shell接口的本地控制檯會話。能夠經過一些組合鍵訪問它們,好比Ctrl-Alt-F1是控制檯1Ctrl-Alt-F2是控制檯2,以此類推。

Ctrl-Alt-F2切換到控制檯2。在一些發行版中,登陸信息包括與此控制檯相關的ttyTeletype)設備,可是也有不少發行版不包括。頁面應該顯示tty2的信息,由於你當前在控制檯2

用一個非root登陸,你能夠經過who am i這個命令來肯定哪個tty設備鏈接到當前控制檯。

在咱們實際執行這個實驗以前,請看一下/dev目錄下的tty2tty3設備的列表清單。

ls -l /dev tty[23]

有大量的定義過的tty設備,可是它們其中的大多數咱們並不關心,咱們只關係tty2tty3設備。做爲設備文件,它們沒有什麼特殊之處;它們只是簡單的字符類型的設備。咱們將用這些設備作這個實驗。tty2設備鏈接到虛擬控制檯2tty3設備鏈接到虛擬控制檯3

Ctrl-Alt-F3組合鍵切換到控制檯3,再次以一樣的非root用戶登陸。

如今在控制檯3輸入如下命令:

echo "Hello world" > /dev/tty2

Ctrl-Alt-F2組合鍵返回控制檯2。字符串「Hello world」(沒有引號)將顯示在控制檯2上。

這個實驗也能夠在GUI桌面的終端模擬器上進行。桌面上的終端會話在/dev樹中使用僞終端設備,好比/dev/pts/1。經過Konsole或者Xterm開啓兩個終端會話,肯定它們鏈接到哪一個僞終端後,使用其中一個發送消息給另外一個。

如今繼續試驗,使用cat命令在不一樣的終端顯示/etc/fstab文件。

另外一個有趣的實驗是使用cat命令直接將文件打印到打印機上。假設你的打印機設備是/dev/usb/lp0,而且你的打印機能夠直接打印PDF文件,下面的命令將會在你的打印機上打印一個PDF文件。

cat test.pdf > /dev/usb/lp0

dd命令也能夠用來打印一個準備打印的文件。不過,我認爲cat命令實際上更適合這個任務。

「一切皆文件」的含義

「一切都是文件」的含義是深遠的,遠遠超過了像這篇文章所列舉的那樣。大家已經在前面的實驗中看到過一些例子,但這裏有一個包含這些和更多的簡短列表。

  1. 克隆硬盤。
  2. 備份分區。
  3. 備份主引導記錄(MBR)。
  4. u盤上安裝ISO鏡像。
  5. 與其餘終端用戶溝通。
  6. 將文件打印到打印機。
  7. 更改/proc pseudo文件系統中的某些文件的內容,以修改運行內核的配置參數。
  8. 用隨機數據或零覆蓋文件、分區或整個硬盤驅動器。
  9. 將不須要的輸出重定向到/dev/null設備,它將永遠不會顯示。
  10. 等等,等等,等等。。。

這裏有太多的例子,任何一個列表都只是表面的一部分。我相信,你確定會想出或指出許多比我這裏提到更有創造性的方式,來使用Linux的這個特性。我很樂意看到你對如何使用「一切都是文件」的評論。

附加信息

有關/dev/目錄和你可能在那裏找到的設備的更多信息,請參閱Linux Journal上的這篇文章。有關單個設備的更詳細信息,Linux文檔項目中的這篇文章這篇文章會有所幫助。

相關文章
相關標籤/搜索