# 文件系統,第 5 部分:虛擬文件系統
> 原文:<https://github.com/angrave/SystemProgramming/wiki/File-System%2C-Part-5%3A-Virtual-file-systems>
## 虛擬文件系統
POSIX 系統,例如 Linux 和 Mac OSX(基于 BSD)包括作為文件??系統的一部分安裝(可用)的若干虛擬文件系統。這些虛擬文件系統中的文件不存在于磁盤上;它們是在進程請求目錄列表時由內核動態生成的。 Linux 提供 3 個主要的虛擬文件系統
```
/dev - A list of physical and virtual devices (for example network card, cdrom, random number generator)
/proc - A list of resources used by each process and (by tradition) set of system information
/sys - An organized list of internal kernel entities
```
例如,如果我想要連續的 0 流,我可以`cat /dev/zero`。
## 如何找出當前可用(已安裝)的文件系統?
使用`mount`使用 mount 而不使用任何選項會生成已安裝文件系統的列表(每行一個文件系統),包括聯網,虛擬和本地(基于旋轉磁盤/ SSD 的)文件系統。這是 mount 的典型輸出
```
$ mount
/dev/mapper/cs241--server_sys-root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext3 (rw)
/dev/mapper/cs241--server_sys-srv on /srv type ext4 (rw)
/dev/mapper/cs241--server_sys-tmp on /tmp type ext4 (rw)
/dev/mapper/cs241--server_sys-var on /var type ext4 (rw)rw,bind)
/srv/software/Mathematica-8.0 on /software/Mathematica-8.0 type none (rw,bind)
engr-ews-homes.engr.illinois.edu:/fs1-homes/angrave/linux on /home/angrave type nfs (rw,soft,intr,tcp,noacl,acregmin=30,vers=3,sec=sys,sloppy,addr=128.174.252.102)
```
請注意,每行包括文件系統和掛載點的文件系統類型源。要減少此輸出,我們可以將其輸入`grep`并僅查看與正則表達式匹配的行。
```
>mount | grep proc # only see lines that contain 'proc'
proc on /proc type proc (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
```
## 隨機和 urandom 之間的差異?
/ dev / random 是一個包含數字生成器的文件,其中熵是根據環境噪聲確定的。隨機將阻止/等待,直到從環境中收集到足夠的熵。
/ dev / urandom 就像是隨機的,但它的不同之處在于它允許重復(較低的熵閾值),因此不會阻塞。
## 其他文件系統
```
$ cat /proc/sys/kernel/random/entropy_avail
$ hexdump /dev/random
$ hexdump /dev/urandom
$ cat /proc/meminfo
$ cat /proc/cpuinfo
$ cat /proc/cpuinfo | grep bogomips
$ cat /proc/meminfo | grep Swap
$ cd /proc/self
$ echo $$; cd /proc/12345; cat maps
```
## 掛載文件系統
假設我有一個掛在`/dev/cdrom`上的文件系統,我想從中讀取。在我可以進行任何操作之前,我必須將它復制到目錄中。
```
$ sudo mount /dev/cdrom /media/cdrom
$ mount
$ mount | grep proc
```
## 如何掛載磁盤映像?
假設你已經下載了可啟動的 linux 磁盤映像......
```
wget http://cosmos.cites.illinois.edu/pub/archlinux/iso/2015.04.01/archlinux-2015.04.01-dual.iso
```
在將文件系統放在 CD 上之前,我們可以將文件作為文件系統掛載并瀏覽其內容。注意,mount 需要 root 訪問權限,所以讓我們使用 sudo 運行它
```
$ mkdir arch
$ sudo mount -o loop archlinux-2015.04.01-dual.iso ./arch
$ cd arch
```
在 mount 命令之前,arch 目錄是新的,顯然是空的。安裝后,`arch/`的內容將從存儲在`archlinux-2014.11.01-dual.iso`文件中的文件系統中的文件和目錄中提取。 `loop`選項是必需的,因為我們要掛載常規文件而不是塊設備,例如物理磁盤。
循環選項將原始文件包裝為塊設備 - 在此示例中,我們將在下面找到文件系統在`/dev/loop0`下提供:我們可以通過運行不帶任何參數的 mount 命令來檢查文件系統類型和掛載選項。我們將輸出管道輸入`grep`,這樣我們只能看到包含'arch'的相關輸出線
```
$ mount | grep arch
/home/demo/archlinux-2014.11.01-dual.iso on /home/demo/arch type iso9660 (rw,loop=/dev/loop0)
```
iso9660 文件系統是一個只讀文件系統,最初設計用于光存儲介質(即 CDRoms)。嘗試更改文件系統的內容將失敗
```
$ touch arch/nocando
touch: cannot touch `/home/demo/arch/nocando': Read-only file system
```
[轉到文件系統:第 6 部分](https://github.com/angrave/SystemProgramming/wiki/File-System,-Part-6:-Memory-mapped-files-and-Shared-memory)
- UIUC CS241 系統編程中文講義
- 0. 簡介
- #Informal 詞匯表
- #Piazza:何時以及如何尋求幫助
- 編程技巧,第 1 部分
- 系統編程短篇小說和歌曲
- 1.學習 C
- C 編程,第 1 部分:簡介
- C 編程,第 2 部分:文本輸入和輸出
- C 編程,第 3 部分:常見問題
- C 編程,第 4 部分:字符串和結構
- C 編程,第 5 部分:調試
- C 編程,復習題
- 2.進程
- 進程,第 1 部分:簡介
- 分叉,第 1 部分:簡介
- 分叉,第 2 部分:Fork,Exec,等等
- 進程控制,第 1 部分:使用信號等待宏
- 進程復習題
- 3.內存和分配器
- 內存,第 1 部分:堆內存簡介
- 內存,第 2 部分:實現內存分配器
- 內存,第 3 部分:粉碎堆棧示例
- 內存復習題
- 4.介紹 Pthreads
- Pthreads,第 1 部分:簡介
- Pthreads,第 2 部分:實踐中的用法
- Pthreads,第 3 部分:并行問題(獎金)
- Pthread 復習題
- 5.同步
- 同步,第 1 部分:互斥鎖
- 同步,第 2 部分:計算信號量
- 同步,第 3 部分:使用互斥鎖和信號量
- 同步,第 4 部分:臨界區問題
- 同步,第 5 部分:條件變量
- 同步,第 6 部分:實現障礙
- 同步,第 7 部分:讀者編寫器問題
- 同步,第 8 部分:環形緩沖區示例
- 同步復習題
- 6.死鎖
- 死鎖,第 1 部分:資源分配圖
- 死鎖,第 2 部分:死鎖條件
- 死鎖,第 3 部分:餐飲哲學家
- 死鎖復習題
- 7.進程間通信&amp;調度
- 虛擬內存,第 1 部分:虛擬內存簡介
- 管道,第 1 部分:管道介紹
- 管道,第 2 部分:管道編程秘密
- 文件,第 1 部分:使用文件
- 調度,第 1 部分:調度過程
- 調度,第 2 部分:調度過程:算法
- IPC 復習題
- 8.網絡
- POSIX,第 1 部分:錯誤處理
- 網絡,第 1 部分:簡介
- 網絡,第 2 部分:使用 getaddrinfo
- 網絡,第 3 部分:構建一個簡單的 TCP 客戶端
- 網絡,第 4 部分:構建一個簡單的 TCP 服務器
- 網絡,第 5 部分:關閉端口,重用端口和其他技巧
- 網絡,第 6 部分:創建 UDP 服務器
- 網絡,第 7 部分:非阻塞 I O,select()和 epoll
- RPC,第 1 部分:遠程過程調用簡介
- 網絡復習題
- 9.文件系統
- 文件系統,第 1 部分:簡介
- 文件系統,第 2 部分:文件是 inode(其他一切只是數據...)
- 文件系統,第 3 部分:權限
- 文件系統,第 4 部分:使用目錄
- 文件系統,第 5 部分:虛擬文件系統
- 文件系統,第 6 部分:內存映射文件和共享內存
- 文件系統,第 7 部分:可擴展且可靠的文件系統
- 文件系統,第 8 部分:從 Android 設備中刪除預裝的惡意軟件
- 文件系統,第 9 部分:磁盤塊示例
- 文件系統復習題
- 10.信號
- 過程控制,第 1 部分:使用信號等待宏
- 信號,第 2 部分:待處理的信號和信號掩碼
- 信號,第 3 部分:提高信號
- 信號,第 4 部分:信號
- 信號復習題
- 考試練習題
- 考試主題
- C 編程:復習題
- 多線程編程:復習題
- 同步概念:復習題
- 記憶:復習題
- 管道:復習題
- 文件系統:復習題
- 網絡:復習題
- 信號:復習題
- 系統編程笑話