文件、目录与文件系统
目录、权限与文件类型
目录与路径
- cd pwd mkdir rmdir
- mkdir -m 711 test , mkdir -p -m mkdir -m 711 test/test/test/test1 (仅test1 为711)
- rmdir -p test/test/test/test1 (递归删除空目录)
根目录下的标准目录
1 | # 一般情况下 |
划分这些目录的两条依据:
可变动的,不可变动的
可分享的,不可分享的
文件类型与查询
上面 ls -l 每行开头的那个字符就是文件类型,d 是目录,l 是连接文件,- 是普通文件。想看得更准就用 file:
- file /user/bin/passwd # 查询某文本数据类型
- which python # 查询某命令位置
- whereis passwd # 查询某目录,文件位置
- locate passwd # -i 忽略大小写 -r 接正则表达式
- find # 能执行额外的动作
权限:用户与用户组
ls -l 开头那串 rwxr-xr-x 就是权限,按 拥有者/用户组/其他人 三组各三位来读。
- u g o a (user group other all)
- r:4 w:2 x:1
- chgrp chown chmod
内存交换空间(swap)
CPU读取的数据都来自于内存,内存不足时,内存中暂不使用的程序和数据会被移动到swap中
Linux 所有的文件都建立在虚拟文件系统( Virtual File System ,VFS )之上
Linux 上不同的目录可能是不同的磁盘,不同的文件可能是不同的设备。
分区结构
1 | root@instance-1:~# df -hT |
这块盘用的是 GPT 分区表(下面 fdisk -l 的 Disklabel type: gpt),/dev/sda1、/dev/sda14、/dev/sda15 是三个平级的分区,分别对应 BIOS boot、EFI System 和根文件系统,GPT 下没有主分区/扩展分区/逻辑分区之分,分区表一般预留 128 个表项,也就是最多 128 个平级分区,编号只是表项序号,跟分区类型无关。看起始扇区也能确认:sda1 从 262144 开始,而 sda15 是 8192~262143,整个排在 sda1 前面,谈不上被谁包含,lsblk 里三者也是并列的。「1~4 是主分区、4 以上是逻辑分区」这套编号规则只适用于 MBR/DOS 分区表,而且逻辑分区是寄居在扩展分区里的,不是挂在主分区下面。
1 | root@instance-1:~# fdisk -l |
lsblk 命令 用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出 RAM 盘的信息
1 | root@instance-1:~# lsblk |
挂载
不同的目录可以采用不同的文件系统mount -l 查看已经挂载的文件系统
1 | root@k8s03:~# mount -l |
sysfs proc devtmpfs tmpfs ext4 都是不同的文件系统
docker 的文件系统 AUFS, overlay2, devicemapper
sysfs : 让用户通过文件访问和设置设备驱动信息。
proc : 是一个虚拟文件系统,让用户可以通过文件访问内核中的进程信息。
devtmpfs : 在内存中创造设备文件节点。
tmpfs : 用内存模拟磁盘文件。
ext4 : 是一个通常意义上我们认为的文件系统,也是管理磁盘上文件用的系统。
fdisk /dev/sdb 分区
mkfs -t ext4 /dev/sdb1 格式化(顺序是先分区再格式化,而且格式化的是分区,不是整盘)
mount /dev/sdb1 /mnt/etcd_data/ 挂载命令
umount /mnt/etcd_data/ 取消挂载
如果不打算分区,也可以整盘直接用:mkfs -t ext4 /dev/sdb 之后 mount /dev/sdb /mnt/etcd_data/。两种做法二选一,不要混着来 —— 本文开头 df -hT 里挂的是整盘 /dev/sdb、类型 ext4,而 fdisk -l 又还留着一条 8e Linux LVM 的 /dev/sdb1、lsblk 里 sdb1 也没有挂载点,这就是混用留下的痕迹:ext4 的超级块在 1024 字节偏移处,并没有覆盖掉开头的分区表,于是那张过期的分区表就一直压在整盘文件系统上面。
磁盘被手动挂载之后都必须把挂载信息写入 /etc/fstab 这个文件中,否则下次开机启动时仍然需要重新挂载。
文件系统区别
内存可以支持到字节级别的随机存取,而这种情况在硬盘中通常是不支持的
为了提高性能,通常会将物理存储(硬盘)划分成一个个小块,比如每个 4KB
FAT inode 日志文件系统(NTFS, EXT3、4)
硬链接与 软连接
硬链接 多个文件共享 inode
1 | root@instance-1:~# echo hello > a.txt |
软链接拥有自己的 inode,但是文件内容就是一个快捷方式。源文件删除 其对应的 inode 也就被删除了,软链接指向了一个空地址
1 | root@instance-1:~# ln -s b.txt c.txt |
日志文件系统
NTFS 和 Ext3 等是日志文件系统,它们和 FAT 最大的区别在于:数据照样要写到磁盘上,只是在改动落到最终位置之前,先把这次变更以预写日志(journal)的形式记一笔。日志写入是追加式的,不用考虑数据的覆盖,但关键点不是「定期写入磁盘」,而是提交前必须先落盘并保证顺序(write barrier),否则日志本身就不可信。崩溃之后重放日志,就能把文件系统恢复到一致状态,不必再全盘 fsck。日志空间是循环复用的,回放完就丢弃,留不下「一段时间内的还原点」,那是快照要解决的问题。所以日志换来的是崩溃一致性和快速恢复,代价是相对无日志的文件系统多了一份写放大,并不是「大大提高性能」。顺带一提,ext2 恰恰是没有日志的,日志要到 ext3 才引入。
分布式文件系统
分布式文件系统 : 通过计算机网络连接大量物理节点,将不同机器、不同磁盘、不同逻辑分区的数据组织在一起,提供海量的数据存储(一般是 Petabytes 级别,1PB = 1024TB)。
分布式数据库 : 在分布式文件系统基础上,提供应对具体场景的海量数据解决方案
一个读取的示例
1 | 客户端想要读取/foo/bar中某个 Chunk 中某段内容(Byterange)的数据,会分成 4 个步骤: |
文件误删后的恢复
文件当前正在被进程使用
使用 lsof
1 | [root@instance-2 ~]# rm -rf test.txt |
文件未被进程使用
extundelete