Linux文件系统理论和操作
2019-05-11
Linux文件系统
文件系统理论
- windows:FAT16, NTFS…
- Linux最广泛:ext2,三部分:
- inode:记录文件的属性、权限、在分区中放置的数据区块、atime(最近读取时间)、mtime(最近修改时间);每个inode大小有限128B,所以支持的最多数据区块有限,比如1K大小的数据区块因Inode限制,仅能最大支持16GB的文件
- 数据区块:存放文件内容,一个文件可以占用很多个数据区块。数据区块可以支持1K, 2K, 4K三种,越大的数据区块支持越大的总容量,比如4K支持16TB大小的分区
- 超级区块:记录此文件系统(格式化为ext2的分区)的整体信息,比如inode的数量,数据区块使用量、数据区块大小(1K, 2K, 4K),文件系统挂载时间等
- 由于ext2是这样索引式的文件系统,不需要碎片整理
- 当文件系统很大时,ext2会自动分为区块群组,每个群组都会由inode,数据区块,超级区块。这时候会多一个文件系统描述(File System Description)来描述区块群 组。
- 通常还有区块对照表和inode对照表记录使用和未使用的区块/inode
- 元数据指超级区块、区块对照表和inode对照表,因为每次增删改都需要修改这三个部分
- Linux目前趋势:xfs
- 日志式文件系统
- 格式化更快(不用预先规划出inode,区块),对高性能大磁盘和大文件支持好,对快速恢复支持好(有日志)。
- 三个部分:
- data section,类似ext2的inode,数据区块,超级区块
- log section,日志区,记录文件系统的变化
- realtime section,建立文件时,先在这里建立,再移入data section
- Linux文件系统与Linux目录系统的联系:
- 一个目录至少分配一个inode和一个数据区块,inode记录目录权限,数据区块记录在本目录下文件的inode。
- 一个文件就是一个inode和对应的数据区块。
- 使用
ls -i
查看文件对应的inode
- Linux文件系统的运行
- 用户访问文件
- 从硬盘中读出文件到内存中,内存数据为【Clean】
- 用户在内存中查看和修改文件,若有修改,内存数据为【Dirty】
- 不定时写回硬盘,或手动调用
sync
命令写回硬盘,或关机命令隐含了写回硬盘的指令 - 若中途断电,导致Dirty数据没有写回,会导致发生磁盘校验甚至文件系统损坏
文件系统操作
管理分区
分区操作都可以由GNU parted工具完成,包括创建分区,删除分区。分区创建后应该进行格式化才能使用。
$ parted /dev/sda1 #对sda1这块磁盘运行parted工具
格式化
格式化意思是将某种文件系统应用于存储设备中。
$ mkfs /dev/sda1 #make filesystem按照默认格式化(不同发行版有区别
内存交换(swap)分区
内存交换分区是用作Swap操作的硬盘分区,Swap分区是一片用来创建虚拟内存分区的磁盘分区,当内存不足时,将会使用硬盘中的虚拟内存,以防止内存溢出。
一般来说,在安装Linux时,一定要建立的内存分区,一个是根目录,一个就是内存交换分区。
操作:
-
先用
parted
工具创建一个分区,和其他分区一样。例如我们创建了/dev/sda2这个分区$ sudo mkswap /dev/sda2 # 以Swap格式将分区格式化 $ sudo swapon /dev/sda2 # 启动swap分区 $ sudo swapoff /dev/sda2 # 关闭Swap分区
软硬链接
- 软链接-类似Windows的快捷方式,链接文件仅仅是访问方式,当真实文件被删除了,链接就失效了。
- 硬链接-一个文件,其inode指向原文件,当所有的硬链接被删除了,真实的数据文件才会被删除,更加安全。但不能对跨文件系统的文件建立硬链接,因为要用inode关联;也不能对目录建立硬链接。
$ ln -s data data2 #link 链接,-s表示软连接
挂载
挂载,指将一块存储设备(硬盘、U盘等)映射到Linux的指定目录,对该目录的操作即是对磁盘的读写。被挂在的设备应该已经被格式化为Linux支持的文件系统
$ sudo mount /dev/sda1 /media/disk1 #将磁盘sda1挂载到/media/disk1目录
$ sudo unmount /dev/sda1 #卸载磁盘
可以修改文件设置开机自动挂载:/etc/fstab
文件系统的其他操作
$ df -ih #d file system查看磁盘容量 -i 以inode表示 -h 以G, M, K单位自动匹配大小,容易阅读
$ du data #d usage 查看单个文件大小
$ lsblk #ls block 显示硬盘容量