# 文件系统,第 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 编程:复习题
- 多线程编程:复习题
- 同步概念:复习题
- 记忆:复习题
- 管道:复习题
- 文件系统:复习题
- 网络:复习题
- 信号:复习题
- 系统编程笑话