Linux中的文件系统与挂载
- 1. 前言
- 2. 挂载
- 2.1. 简介
- 2.2. 挂载一个磁盘到某个目录下
- 2.3. 挂载一个已有目录到某个目录下
- 2.4. mount支持的文件系统格式
- 3. Linux的文件系统
1. 前言
本文将介绍一下挂载是什么,怎么用,以及在文件系统中的作用,最后介绍了Linux的文件系统如何组织及查看方法。
2. 挂载
2.1. 简介
在讲文件系统前,我们先了解一下挂载(mount)是什么。通俗的来说,挂载就是将一个已有的磁盘或者说设备映射到一个文件夹下,以实现通过该文件夹来访问被映射设备的空间。例如,我们有一个U盘插到了一台运行Linux的系统中,这时,系统可以建立一个文件夹(例如/media/cxy/fastflash/),然后将该U盘中的文件系统(可能是exFAT)挂载到该目录下,这时我们便可以访问该目录以查阅其中的文件。这个例子只是挂载应用的冰山一角,它的用处在Linux系统从启动开始到处都可以发现。下面介绍几种常见的挂载用法。
2.2. 挂载一个磁盘到某个目录下
首先,我们先自己制作一块磁盘,运行如下命令,你可以在当前目录下得到一块大小为128M的虚拟磁盘rootfs.ext4,磁盘中数据全为0。
dd if=/dev/zero of=rootfs.ext4 bs=1M count=128
但这时这块磁盘并没有文件系统的概念,可以说就是废块,因为没有系统可以识别它。因此,我们需要格式化这块磁盘为某个格式,例如ext4,使用下面的命令格式化rootfs.ext4文件为ext4格式。
mkfs.ext4 rootfs.ext4
这时你就得到一个ext4格式的磁盘文件了,但是你仔细想想就会发现我们现在得到的这个东西其本质还是一个文件,如何能将他变为一块真正的磁盘呢?这时候就要用到/dev/loop设备了,loop设备是LInux系统用于将一个文件模拟为一个块设备所使用的接口。通俗来说就是将文件套了个壳变成了真正的虚拟磁盘,/dev/loop就是它的接口。使用下面的命令来完成上述功能。
sudo losetup /dev/loop0 rootfs.ext4
这时你可以留意一下你的桌面,不出意外会发现多出一个像磁盘的图标,没错,它就是你创建的虚拟磁盘,双击它,系统会自动将其挂载到/media目录下供你访问,或者你也可以将其挂载到你想放的目录下,例如~/rootfs/,你可以使用这个命令完成这项功能。
mkdir -p ~/rootfs
sudo mount /dev/loop0 ~/rootfs/
这时,你便可以进入到~/rootfs/目录中像使用U盘一样添加删除文件了,不过你要记得完成后解除挂载,并断开与loop设备的绑定。
sudo umount /dev/loop0
sudo losetup -d /dev/loop0
另外提醒一下,记得退出挂载目录,并在解除所有/dev/loop0的挂载目录后(因为如果你双击了那个磁盘图标系统会自动为你将其挂载到/media的一个目录下,你可以输入mount回车查看关于该loop设备的所有挂载目录),解除与它的绑定。
这种方式经常会用到系统的根文件系统制作中。
2.3. 挂载一个已有目录到某个目录下
这个就比较好理解了,其实就是使用一个目录来访问另一个目录。例如,我们有两个目录如下:
cxy@ubuntu:~$ ls ~/test1/
a.c b.c
cxy@ubuntu:~$ ls ~/test2/
cxy@ubuntu:~$
现在我想用test2作为一个接口访问test1目录,可以使用如下命令:
sudo mount -R test1 test2
这样,目的便达成了:
cxy@ubuntu:~$ ls test1
a.c b.c
cxy@ubuntu:~$ ls test2
a.c b.c
最后记得解挂载:
sudo umount test2
2.4. mount支持的文件系统格式
Linux系统的mount指令默认支持一些文件系统格式,如果你的磁盘不是这些格式,那你就需要另外装一些驱动了,你可以查看/proc/filsystems查看你的系统所支持的文件系统格式:
cxy@ubuntu:~$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cpuset
nodev cgroup
nodev cgroup2
nodev tmpfs
nodev devtmpfs
nodev configfs
nodev debugfs
nodev tracefs
nodev securityfs
nodev sockfs
nodev dax
nodev bpf
nodev pipefs
nodev hugetlbfs
nodev devpts
ext3
ext2
ext4
squashfs
vfat
nodev ecryptfs
fuseblk
nodev fuse
nodev fusectl
nodev pstore
nodev mqueue
nodev autofs
nodev binfmt_misc
3. Linux的文件系统
Linux的文件系统有许多,有sysfs,proc,udev等等,它们其实都负责某一项具体的功能,例如proc专门负责为用户提供查看内部数据结构的功能。这些文件系统最终都会挂载到根文件系统下(根文件系统格式一般为ext4),例如你可以使用mount命令查看所有的文件系统挂载情况:
cxy@ubuntu:~$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1981784k,nr_inodes=495446,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=401644k,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=32,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=20101)
mqueue on /dev/mqueue type mqueue (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)
vmhgfs-fuse on /mnt/hgfs type fuse.vmhgfs-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
vmware-vmblock on /run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=401644k,mode=700,uid=1000,gid=1000)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
上面打印了我系统中所有的挂载目录,或者使用df命令也可以:
cxy@ubuntu:~$ df -ah
Filesystem Size Used Avail Use% Mounted on
sysfs 0 0 0 - /sys
proc 0 0 0 - /proc
udev 1.9G 0 1.9G 0% /dev
devpts 0 0 0 - /dev/pts
tmpfs 393M 11M 382M 3% /run
/dev/sda1 26G 11G 14G 45% /
securityfs 0 0 0 - /sys/kernel/security
tmpfs 2.0G 212K 2.0G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
cgroup 0 0 0 - /sys/fs/cgroup/systemd
pstore 0 0 0 - /sys/fs/pstore
cgroup 0 0 0 - /sys/fs/cgroup/perf_event
cgroup 0 0 0 - /sys/fs/cgroup/rdma
cgroup 0 0 0 - /sys/fs/cgroup/blkio
cgroup 0 0 0 - /sys/fs/cgroup/memory
cgroup 0 0 0 - /sys/fs/cgroup/cpu,cpuacct
cgroup 0 0 0 - /sys/fs/cgroup/net_cls,net_prio
cgroup 0 0 0 - /sys/fs/cgroup/freezer
cgroup 0 0 0 - /sys/fs/cgroup/pids
cgroup 0 0 0 - /sys/fs/cgroup/devices
cgroup 0 0 0 - /sys/fs/cgroup/hugetlb
cgroup 0 0 0 - /sys/fs/cgroup/cpuset
systemd-1 - - - - /proc/sys/fs/binfmt_misc
mqueue 0 0 0 - /dev/mqueue
debugfs 0 0 0 - /sys/kernel/debug
hugetlbfs 0 0 0 - /dev/hugepages
fusectl 0 0 0 - /sys/fs/fuse/connections
configfs 0 0 0 - /sys/kernel/config
vmhgfs-fuse 20G 11G 9.8G 52% /mnt/hgfs
vmware-vmblock 0 0 0 - /run/vmblock-fuse
tmpfs 393M 64K 393M 1% /run/user/1000
gvfsd-fuse 0 0 0 - /run/user/1000/gvfs
binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
当然了,这些文件系统都是要存放在磁盘的某个区域内,例如我的根文件系统存放在/dev/sda1分区中,所以其他根文件系统中的文件系统也都在该分区中,另外,你可以使用fdisk命令查看系统的分区情况:
cxy@ubuntu:~$ sudo fdisk -l
[sudo] password for cxy:
Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xfbe6b49d
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 54527999 54525952 26G 83 Linux
/dev/sda2 54530046 62912511 8382466 4G 5 Extended
/dev/sda5 54530048 62912511 8382464 4G 82 Linux swap / Solaris
可以看到,我的系统有三个分区,第一个是根文件系统的分区,后面两个应该是用于系统交换用的分区,因为我用的虚拟机。