# 文件系统，第 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 
```

例如，如果我想要一个无延迟的连续流，我可以使用命令`cat /dev/zero`。

## 如何找出当前可用（已安装）的文件系统？

使用单独`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)