Linux 所有的文件都建立在虚拟文件系统( Virtual File System ,VFS )之上
Linux 上不同的目录可能是不同的磁盘,不同的文件可能是不同的设备。
分区结构
1 | root@instance-1:~# df -hT |
在 Linux 中,数字 1~4 结尾的是主分区,通常一块磁盘最多只能有 4 个主分区用于系统启动。主分区之下,还可以再分成若干个逻辑分区,4 以上的数字都是逻辑分区。因此 /dev/sda1 和 /dev/sda15 是主分区包含逻辑分区的关系。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27root@instance-1:~# fdisk -l
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: PersistentDisk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 3948AFEB-2993-D54E-A66C-392005D28B38
Device Start End Sectors Size Type
/dev/sda1 262144 20971486 20709343 9.9G Linux filesystem
/dev/sda14 2048 8191 6144 3M BIOS boot
/dev/sda15 8192 262143 253952 124M EFI System
Partition table entries are not in disk order.
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: PersistentDisk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x19fbd859
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 41943039 41940992 20G 8e Linux LVM
lsblk 命令 用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出 RAM 盘的信息
1 | root@instance-1:~# lsblk |
挂载
不同的目录可以采用不同的文件系统mount -l 查看已经挂载的文件系统1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32root@k8s03:~# mount -l
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=233816k,nr_inodes=58454,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=49732k,mode=755)
/dev/vda5 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)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
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/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
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/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=33,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=9534)
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)
/dev/vda1 on /boot type ext2 (rw,relatime)
tracefs on /sys/kernel/debug/tracing type tracefs (rw,relatime)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=49728k,mode=700)
sysfs proc devtmpfs tmpfs ext4 都是不同的文件系统
docker 的文件系统 AUFS, overlay2, devicemapper
sysfs : 让用户通过文件访问和设置设备驱动信息。
proc : 是一个虚拟文件系统,让用户可以通过文件访问内核中的进程信息。
devtmpfs : 在内存中创造设备文件节点。
tmpfs : 用内存模拟磁盘文件。
ext4 : 是一个通常意义上我们认为的文件系统,也是管理磁盘上文件用的系统。
mkfs -t ext4 /dev/sdb 格式化磁盘
fdisk /dev/sdb 分区
mount /dev/sdb /mnt/etcd_data/ 挂载命令
umount /mnt/etcd_data/ 取消挂载
磁盘被手动挂载之后都必须把挂载信息写入 /etc/fstab 这个文件中,否则下次开机启动时仍然需要重新挂载。
文件系统区别
内存可以支持到字节级别的随机存取,而这种情况在硬盘中通常是不支持的
为了提高性能,通常会将物理存储(硬盘)划分成一个个小块,比如每个 4KB
FAT inode 日志文件系统(NTFS, EXT2、3、4)
硬链接与 软连接
硬链接 多个文件共享 inode1
2
3
4
5
6
7root@instance-1:~# echo hello > a.txt
root@instance-1:~# cat a.txt
hello
root@instance-1:~# ln a.txt b.txt
root@instance-1:~# rm -rf a.txt
root@instance-1:~# cat b.txt
hello
软链接拥有自己的 inode,但是文件内容就是一个快捷方式。源文件删除 其对应的 inode 也就被删除了,软链接指向了一个空地址
1 | root@instance-1:~# ln -s b.txt c.txt |
日志文件系统
NTFS 和 Ext3 等是日志文件系统,它们和 FAT 最大的区别在于写入到磁盘中的是日志,而不是数据。日志文件系统会先把日志写入到内存中一个高速缓冲区,定期写入到磁盘。日志写入是追加式的,不用考虑数据的覆盖。一段时间内的日志内容,会形成还原点。这种设计大大提高了性能,当然也会有一定的数据冗余。
分布式文件系统
分布式文件系统 : 通过计算机网络连接大量物理节点,将不同机器、不同磁盘、不同逻辑分区的数据组织在一起,提供海量的数据存储(一般是 Petabytes 级别,1PB = 1024TB)。
分布式数据库 : 在分布式文件系统基础上,提供应对具体场景的海量数据解决方案
一个读取的示例1
2
3
4
5
6
7
8
9客户端想要读取/foo/bar中某个 Chunk 中某段内容(Byterange)的数据,会分成 4 个步骤:
客户端向 Master 发送请求,将想访问的文B件名、Chunk 的序号(可以通过 Chunk 大小和内容位置计算);
Master 响应请求,返回 Chunk 的地址和 Chunk 的句柄(ID);
客户端向 Chunk 所在的地址(一台 ChunkServer)发送请求,并将句柄(ID)和内容范围(Byterange)作为参数;
ChunkServer 将数据返回给客户端。