继续基础知识学习.
Linux号称一切皆文件。那它是如何把不同文件系统,设备驱动,网络连接这些信息统统用文件表示,好奇+1.
1.linux系统结构
(1)unix系统的核心组成
内核、shell、文件系统和应用程序
内核:负责管理系统的进程、内存、设备驱动程序、文件和网络系统(内核空间)
shell:系统的用户界面,提供了用户与内核进行交互操作的一种接口
文件系统: linux操作系统将独立的文件系统组合成了一个层次化的树形结构,通过"挂载"把新的文件系统给挂装到某个目录上,这棵树就叫虚拟文件系统(VFS)
应用程序:用户应用程序(用户空间)
2.一切皆文件
Linux 中一切都可以看作文件,包括普通文件、链接文件、Socket 以及设备驱动等,对其进行相关操作时,都可能会创建对应的文件描述符(FD)。
(1)文件类型
1)普通文件
#cd /root
#ls #r开头 ,普通文件
2)目录,字符设备文件
#cd /dev
#ls #c开头,字符设备
不同标识对应不同文件类型
3)连接文件(硬连接,软连接)
硬连接
#vim rongshu.txt (随便写一个文件)
#ln /root/rongshu.txt /root/rongshu2.txt
#ls
#stat rongshu.txt
#stat rongshu2.txt
rongshu.txt和rongshu2.txt的Inode号一样,表示硬连接,磁盘实际上就1个文件,有2个变量都是指向这个文件
修改和删除会发生什么?
#vim rongshu.txt
修改会同步修改
#rm -f rongshu.txt
删除实际上是删除引用,数量会有表示
软连接
#ln -s rongshu2.txt /root/rongshu3.txt
#stat rongshu2.txt
#stat rongshu3.txt
Inode号不同,实际上是两个文件(类似创建一个快捷方式)
修改和删除会发生什么?
vim rongshu2.txt
rm -f rongshu2.txt
修改任意一个,文件都会同步修改
删除rongshu2.txt ,rongshu3.txt的指向会丢失,会报错
这就是软硬连接区别
(2)模拟创建一个文件系统
1)创建一个磁盘文件
#mkdir rongshu
#dd if =/dev/zero of=mydisk.img bs=1048576 count=100 ,创建一个100M的空文件
#ll -h
#losetup /dev/loop0 mydisk.img ,把文件mydisk.img挂载到目录:dev/loop0
#mke2fs /dev/loop0 ,格式化文件
2)把/dev/loop0像 dev/ada1一样挂到一个虚拟目录
找一个挂载目录,如:/mnt/rongshufs
#cd /mnt
#mkdir rongshufs
#mount -t ext2 /dev/loop0 /mnt/rongshufs
#df -h
这里访问/mnt/rongshufs实际上是访问我的mydist.img
3)创建bash启动的库文件
#whereis bash
#pwd
#mkdir bin
#ll
#cp /bin/bash bin
#ll
#cd bin
#pwd
#ll
#ldd bash ,bash启动需要的库文件
4)模拟一个文件系统,拷贝bash需要的库文件
#cd ..
#mkdir lib64
#ll
#pwd
#cp /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} ./lib64/
#ll
5)切换系统,操作命令
#cd ..
#ll
#chroot ./ 切换系统
#echo $$ 查看当前系统
#vi
#cat
#exit
#ll
这里可以看到,我的rongshufs文件系统,实际上也是保存在文件mydisk.img中的
6)小结
7)延伸docker
docker第一步就是要创建镜像文件img。
img里面放的是程序。docker有一个容器概念(容器是虚幻的,它是一个命名空间,里面跑的是进程,它没有操作系统内核,都是复用物理机的那个统一内核)
先有镜像-产生容器概念-镜像在磁盘就是img文件-必须先挂载-再重img里面放的根目录读取执行文件-再准备命名空间-然后进程再跑到这个空间里面