原文: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)
/ 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