<p><b>裝置檔案</b>在類Unix系統中是一個裝置驅動程式的介面，並如常規檔案一樣出現在檔案系統中。
</p><p>在微軟的MS-DOS、OS-2和Windows等作業系統中也有專門的裝置檔案。它們允許應用程式使用裝置驅動程式，通過標準輸入輸出系統呼叫與驅動程式互動，從而簡化了許多工，也帶來了與裝置特性、功能無關的使用者級I/O。
</p><p>裝置檔案通常為周邊裝置提供簡單的介面，如印表機。它也可存取這些裝置的特定資源，如硬碟分割區。它還可以存取沒有連接到任何真實裝置的系統資源，如資料接受器和亂數生成器。
</p><p>在類Unix作業系統中包含兩類裝置節點，分別為字元檔案與塊檔案。它們的區別是作業系統和硬體如何向它們讀寫資料。它們合稱為<b>裝置特定檔案</b>，與之對應的是命名管道，它既不連接到任何裝置，也不是一個檔案。
</p><p>MS-DOS的裝置檔案借鑑了Unix的特殊檔案的概念。MS-DOS的早期版本並不支援檔案目錄層次，裝置檔案的檔名被設定為保留字以區分普通檔案，新檔案或新目錄不能夠使用這些裝置檔案的檔名。
</p><p>在支援chroot行程獨立的Unix系統（例如Solaris Containers）中，每個chroot環境中常規情況下都需要一個獨立的<tt>/dev</tt>,它們的掛載點在主機的檔案系統中各種地方顯示。通過限制裝置節點只能放入<tt>/dev</tt>內的chroot實例中，chroot環境可以強制實行硬體隔離（比Unix的檔案系統權限還要嚴格的一種存取控制，可以禁止特定應用程式存取或命名硬體）。
</p><p>MS-DOS通過開放裝置檔案的形式保證了裝置包含性，應用程式嘗試存取正在被使用的裝置時會無法存取裝置節點。Unix與Linux在並行控制上採取了多種裝置驅動程式的原理。</p>


<h2><span id=".E5.AE.9E.E7.8E.B0"></span><span id="实现">實現</span></h2>
<p>本質上講，裝置節點對應於作業系統分配的資源。Unix通過存放於節點結構中的<i>主裝置號</i>和<i>從裝置號</i>來辨識這些資源。在各種作業系統和系統平台上，這些數都是被唯一分配的。通常，主數用於指定驅動程式，而次數用於指定驅動程式控制的某一特定裝置（驅動程式可能控制多個裝置），在這種情況下，系統可能把次數作為參數傳給驅動程式。
</p><p>電腦就像對待普通檔案那樣，用標準系統呼叫存取裝置節點。根據硬體的介面類型和作業系統處理輸入輸出的方式，裝置檔案可以分成兩類。
</p>
<h2><span id=".E8.AE.BE.E5.A4.87"></span><span id="设备">裝置</span></h2>
<h3><span id=".E5.AD.97.E7.AC.A6.E8.AE.BE.E5.A4.87"></span><span id="字符设备">字元裝置</span></h3>

<p><i>字元裝置</i>是指每次與系統傳輸1個字元的裝置。這些裝置節點通常為傳真、虛擬終端和序列埠數據機之類裝置提供流通信服務，它通常不支援隨機存取資料。
</p><p>字元裝置在實現時，大多不使用快取記憶體。系統直接從裝置讀取／寫入每一個字元。
</p>
<h3><span id=".E5.9D.97.E8.AE.BE.E5.A4.87"></span><span id="块设备">塊裝置</span></h3>

<p><i>塊裝置</i>是指與系統間用塊的方式行動資料的裝置。這些裝置節點通常代表可定址裝置，如硬碟、CD-ROM和記憶體區域。
</p><p>塊裝置通常支援隨機存取和定址，並使用快取記憶體。作業系統為輸入輸出分配了快取以儲存一塊資料。當程式向裝置傳送了讀取或者寫入資料的請求時，系統把資料中的每一個字元儲存在適當的快取中。當快取被填滿時，會採取適當的操作（把資料傳走），而後系統清空快取。
</p>
<h3><span id=".E4.BC.AA.E8.AE.BE.E5.A4.87"></span><span id="伪设备">偽裝置</span></h3>
<p>在類Unix作業系統中，裝置節點並不一定要對應物理裝置。沒有這種對應關係的裝置是<i>偽裝置</i>。作業系統運用了它們提供的多種功能。部份經常使用到的偽裝置包括：
</p>
<dl><dt><code>/dev/null</code></dt>
<dd>接受並丟棄所有輸入；即不產生任何輸出。</dd>
<dt><code>/dev/full</code></dt>
<dd>永遠在被填滿狀態的裝置。</dd>
<dt><code>/dev/loop</code></dt>
<dd>Loop裝置</dd>
<dt><code>/dev/zero</code></dt>
<dd>產生連續的NUL字元的串流(數值為0)。</dd>
<dt><code>/dev/random</code></dt>
<dd>產生一個虛假隨機的任意長度字元串流。(Blocking)</dd>
<dt><code>/dev/urandom</code></dt>
<dd>產生一個虛假隨機的任意長度字元串流。(Non-Blocking)</dd></dl><h2><span id=".E5.88.9B.E5.BB.BA.E8.8A.82.E7.82.B9"></span><span id="创建节点">建立節點</span></h2>
<p>節點是由<i>mknod</i>系統呼叫建立的。在命令列中，有同名的程式來建立節點。rename和unlink系統呼叫可以用於移動和刪除節點，相應的命令是mv和rm。在使用cp命令時加上<code>-R</code>或<code>-a</code>參數，可以建立一個與原裝置節點具有同樣屬性的節點。
</p>
<h2><span id=".E5.91.BD.E5.90.8D.E7.BA.A6.E5.AE.9A"></span><span id="命名约定">命名約定</span></h2>
<p>在基於Linux的系統中，裝置節點一般在<code>/dev</code>下，通常使用如下的字首：
</p>
<ul><li>fb：frame緩衝</li>
<li>fd：軟碟</li>
<li>hd：IDE硬碟或光碟機</li>
<li>lp：印表機</li>
<li>par：並列埠</li>
<li>pt：偽終端</li>
<li>s：SCSI裝置
<ul><li>scd：SCSI音訊光碟機</li>
<li>sd：SCSI硬碟</li>
<li>sg：SCSI通用裝置</li>
<li>sr：SCSI資料光碟機</li>
<li>st：SCSI磁帶</li></ul></li>
<li>tty：終端
<ul><li>ttyS：序列埠</li></ul></li></ul><p>大部分裝置的字首名後面跟隨一個數字，它唯一指定某一裝置。硬碟機的字首名後面跟隨一個字母和一個數字，字母用於指明裝置，而數字用於指明分割區。因此，<code>/dev/sda3</code>指定了硬碟上的一個分割區，<code>/dev/pts/14</code>指定了一個網路終端對談。
</p><p>一些Linux發行版用SCSI層來定義非IDE硬碟的硬碟裝置，例如SATA硬碟、USB磁碟等，因此雖然一塊硬碟可能並不是SCSI硬碟，但仍可以通過<code>sd</code>裝置存取它。
</p>
<h2><span id=".E5.8F.82.E8.80.83.E8.B5.84.E6.96.99"></span><span id="参考资料">參考資料</span></h2>

<p class="mw-empty-elt">



</p>
<!-- 
NewPP limit report
Parsed by mw2262
Cached time: 20230505035113
Cache expiry: 1814400
Reduced expiry: false
Complications: [show‐toc]
CPU time usage: 0.769 seconds
Real time usage: 0.980 seconds
Preprocessor visited node count: 6569/1000000
Post‐expand include size: 657304/2097152 bytes
Template argument size: 38674/2097152 bytes
Highest expansion depth: 14/100
Expensive parser function count: 113/500
Unstrip recursion depth: 0/20
Unstrip post‐expand size: 1628/5000000 bytes
Lua time usage: 0.280/10.000 seconds
Lua memory usage: 7679596/52428800 bytes
Number of Wikibase entities loaded: 0/400
--><!--
Transclusion expansion time report (%,ms,calls,template)
100.00%  589.657      1 -total
 98.30%  579.634     10 Template:Navbox
 58.22%  343.304    120 Template:Tsl
 55.84%  329.256      1 Template:Filesystem
 44.27%  261.022      3 Template:Navbox_subgroup
 19.38%  114.278      1 Template:Linux内核
 11.27%   66.464      1 Template:NoteTA
  9.58%   56.485      1 Template:Reflist
  7.80%   45.980      1 Template:Cite_book
  2.21%   13.054      1 Template:Unixtree
-->
**裝置檔案**在類 Unix 系統中是一個裝置驅動程式的介面，並如常規檔案一樣出現在檔案系統中。

在微軟的 MS-DOS、OS-2 和 Windows 等作業系統中也有專門的裝置檔案。它們允許應用程式使用裝置驅動程式，通過標準輸入輸出系統呼叫與驅動程式互動，從而簡化了許多工，也帶來了與裝置特性、功能無關的使用者級 I/O。

裝置檔案通常為周邊裝置提供簡單的介面，如印表機。它也可存取這些裝置的特定資源，如硬碟分割區。它還可以存取沒有連接到任何真實裝置的系統資源，如資料接受器和亂數生成器。

在類 Unix 作業系統中包含兩類裝置節點，分別為字元檔案與塊檔案。它們的區別是作業系統和硬體如何向它們讀寫資料。它們合稱為**裝置特定檔案**，與之對應的是命名管道，它既不連接到任何裝置，也不是一個檔案。

MS-DOS 的裝置檔案借鑑了 Unix 的特殊檔案的概念。MS-DOS 的早期版本並不支援檔案目錄層次，裝置檔案的檔名被設定為保留字以區分普通檔案，新檔案或新目錄不能夠使用這些裝置檔案的檔名。

在支援 chroot 行程獨立的 Unix 系統（例如 Solaris Containers）中，每個 chroot 環境中常規情況下都需要一個獨立的 /dev, 它們的掛載點在主機的檔案系統中各種地方顯示。通過限制裝置節點只能放入 /dev 內的 chroot 實例中，chroot 環境可以強制實行硬體隔離（比 Unix 的檔案系統權限還要嚴格的一種存取控制，可以禁止特定應用程式存取或命名硬體）。

MS-DOS 通過開放裝置檔案的形式保證了裝置包含性，應用程式嘗試存取正在被使用的裝置時會無法存取裝置節點。Unix 與 Linux 在並行控制上採取了多種裝置驅動程式的原理。

## 實現

本質上講，裝置節點對應於作業系統分配的資源。Unix 通過存放於節點結構中的_主裝置號_和_從裝置號_來辨識這些資源。在各種作業系統和系統平台上，這些數都是被唯一分配的。通常，主數用於指定驅動程式，而次數用於指定驅動程式控制的某一特定裝置（驅動程式可能控制多個裝置），在這種情況下，系統可能把次數作為參數傳給驅動程式。

電腦就像對待普通檔案那樣，用標準系統呼叫存取裝置節點。根據硬體的介面類型和作業系統處理輸入輸出的方式，裝置檔案可以分成兩類。

## 裝置

### 字元裝置

_字元裝置_是指每次與系統傳輸 1 個字元的裝置。這些裝置節點通常為傳真、虛擬終端和序列埠數據機之類裝置提供流通信服務，它通常不支援隨機存取資料。

字元裝置在實現時，大多不使用快取記憶體。系統直接從裝置讀取／寫入每一個字元。

### 塊裝置

_塊裝置_是指與系統間用塊的方式行動資料的裝置。這些裝置節點通常代表可定址裝置，如硬碟、CD-ROM 和記憶體區域。

塊裝置通常支援隨機存取和定址，並使用快取記憶體。作業系統為輸入輸出分配了快取以儲存一塊資料。當程式向裝置傳送了讀取或者寫入資料的請求時，系統把資料中的每一個字元儲存在適當的快取中。當快取被填滿時，會採取適當的操作（把資料傳走），而後系統清空快取。

### 偽裝置

在類 Unix 作業系統中，裝置節點並不一定要對應物理裝置。沒有這種對應關係的裝置是_偽裝置_。作業系統運用了它們提供的多種功能。部份經常使用到的偽裝置包括：

**`/dev/null`**
: 接受並丟棄所有輸入；即不產生任何輸出。

**`/dev/full`**
: 永遠在被填滿狀態的裝置。

**`/dev/loop`**
: Loop 裝置

**`/dev/zero`**
: 產生連續的 NUL 字元的串流 (數值為 0)。

**`/dev/random`**
: 產生一個虛假隨機的任意長度字元串流。(Blocking)

**`/dev/urandom`**
: 產生一個虛假隨機的任意長度字元串流。(Non-Blocking)

## 建立節點

節點是由 _mknod_ 系統呼叫建立的。在命令列中，有同名的程式來建立節點。rename 和 unlink 系統呼叫可以用於移動和刪除節點，相應的命令是 mv 和 rm。在使用 cp 命令時加上 `-R` 或 `-a` 參數，可以建立一個與原裝置節點具有同樣屬性的節點。

## 命名約定

在基於 Linux 的系統中，裝置節點一般在 `/dev` 下，通常使用如下的字首：

* fb：frame 緩衝
* fd：軟碟
* hd：IDE 硬碟或光碟機
* lp：印表機
* par：並列埠
* pt：偽終端
* s：SCSI 裝置
  * scd：SCSI 音訊光碟機
  * sd：SCSI 硬碟
  * sg：SCSI 通用裝置
  * sr：SCSI 資料光碟機
  * st：SCSI 磁帶
* tty：終端
  * ttyS：序列埠

大部分裝置的字首名後面跟隨一個數字，它唯一指定某一裝置。硬碟機的字首名後面跟隨一個字母和一個數字，字母用於指明裝置，而數字用於指明分割區。因此，`/dev/sda3` 指定了硬碟上的一個分割區，`/dev/pts/14` 指定了一個網路終端對談。

一些 Linux 發行版用 SCSI 層來定義非 IDE 硬碟的硬碟裝置，例如 SATA 硬碟、USB 磁碟等，因此雖然一塊硬碟可能並不是 SCSI 硬碟，但仍可以通過 `sd` 裝置存取它。

## 參考資料
/dev