多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 文件系统,第 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)