10分钟了解Linux虚拟文件系统和文件描述符
2021-01-12 本文已影响0人
chozee
Linux虚拟文件系统和文件描述符.md
Linux设计哲学之一切皆文件.
Linux通过VFS, 虚拟文件系统管理文件系统,这个存储在内存中, 映射到物理位置.
为了解决用户(应用)存储到各种各样的设备上,虚拟的,物理的,网络的等等. 提供一个统一的访问方式. 这样可以跟硬件解耦.
IO设备指的是网卡,磁盘,键盘,鼠标,U盘等等外部设备.
虚拟文件系统的一些结构
* inode:
** 唯一的文件号
* pagecache:
** 内核读文件缓存到内存;如果不同进程读同一个文件,则不同进程共享此pagecache
* FD:
** 文件描述符
** 每个进程持有自己的.当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。
** 有自己的seek(指针)
** 任何程序都有0,1,2三个文件描述符(u,w,r分别表示读写,写,读)
exec 8< ooxx.txt
lsof -op $$
** 能看到一个为8的文件描述符,显示8r表示这个文件描述符为8只读,加上-o选项表示OFFSET
pagecache一致性
* 标志dirty,什么时候刷到磁盘,可以使用不同策略,有参数可以设置(安全性(掉电丢失)和性能)
* 一般4K大小,可以调整
文件系统的基本组成及管理
/: 跟目录(root的),一般都挂载在这个地方
swap: CentOS某些版本,显示的是/dev/shm 内存交换分区
/boot: 启动分区,内核存储的方,启动会加载到内存中,然后再映射回来
df命令
可以通过df命令看挂载情况
FIleSystem表示分区
Mounted On:表示分区挂载到哪个目录下了
mount/unmount
挂载/卸载
你可以对你的目录挂载一些物理设备,比如usr存储数据的,你可以单独挂载一块硬盘
你甚至可以把一个文件当做一个硬件设备挂载上去
比如losetup /dev/loop0 mydisk.img // loop0是一个设备, mydisk.img是我生成的一个文件,这样这个设备就不是指向物理的东西了而是指向一个文件系统的东西. mke2fs /dev/loop0 这个是格式化这个设备.然后你可以把这个设备再挂载到某个目录下,就可以看到这个了.
boot分区
引导分区会首先把内核代码拷贝内存中,然后启动起来
内核启动之后会接管磁盘系统生成自己VFS(包括接管boot,自己管理. 就是说其实有两个boot, 内核用自己的boot覆盖了原有的boot.当你umount boot时,这个操作是把原有分区的boot卸载了. 使用df是看不到boot分区的,但是你回到根目录还能看到一个boot目录,因为元分区被卸载所以没有内容了,重新挂载这个分区内容就回来了)
然后你通过df就可以看到VFS的情况了
文件类型
-: 普通文件,执行文本图片..
d: 目录
b: 块设备, 磁盘
c: 字符设备, 键盘,终端
s: Socket, Socket
p: Pipeline, 管道
[eventpoll]: epoll的内存区域
l: 链接
其他
硬/软链接
硬链接:inode号一样,path不同,但是只想同一个文件.理解成变量名. 删除某一个,不会影响另一个. 只不过引用数量减一.
软连接: 两个文件inode不一样. 删除某一个另一个会显示错误. 修改内容也会同步
/dev/zero
无限大的空,但是却不占用空间
一般用来填充空文件用
/dev
目录主要都是设备
命令
dd命令
拷贝生成文件
dd if=/dev/zero of=mydisk.img bs=1048576 count=100 // if=inputfile of=outfile bs=表示块1M bs*count=文件大小
通过dd命令可以备份磁盘
也可以两个分区内容对烤
lsof
进程打开了哪些文件
lsof -p
FD字段栏表示的各种文件类型
当前bash进程pid
$BASHPI
当前bash进程pid
$$优先级高于管道,所有当应用于管道时,可能取到的是父进程的PID
mount/unmount
df
mmap
read
read a 0<& 8 // 把文件描述符8读到a这个变量.
read读到换行符结束
</>
重定向符
如果接的的文件描述符则重定向字符必须加个&才能识别,否则就当成文件名了
pcstat
查看进程涉及的pagecache
page cache stat
查看脏页
cat /proc/vmstat |grep dirty
Docker的运行
先挂载img文件->切换根目录->读取进程里边的可执行文件->准备命名空间和进程空间->跑在命名空间中->跑起来