8.1.1、Linux文件系统存储空间分为(数据区和元数据区),一般硬盘扇区是512字节,一个block(块)可以包含(2、4、8不同扇区),一个块只能属于一个文件但一个文件可以包含多个块,stat可以查看元数据(文件名,大小,时间戳,权限,属主、属组,对应数据存储在哪些磁盘块上),ls -i可以查看文件的inode编号,每个编号又对应着磁盘上的存储区域,但是文件名并不存放在inode上而是存放在上级目录中所以目录数据区中存放的是文件名和inode对应关系
8.1.2、因为inode编号太多查找该inode是否使用比较消耗资源,为了更快的查找到未使用的inode会对inode做索引这叫bitmap(位图索引)inode位图,相对应的块也会做block bitmap(块位图),所以元数据区中存放了(inode、ionde bitmap、block bitmap),数据存储方式:每次会拿8个未使用的磁盘块用来存储,如果只用了一个会把未使用的块还回去不够时在取8个未使用磁盘块,评估磁盘性能时会有2种评估模型(随机io和连续io:磁盘读写数据是靠机械手臂完成,如果数据是连续存储将会提高读写速度,乱序将影响读写性能)
8.1.3、为了方便管理把块分为块组,每个块组都有独立的数据区和元数据区,块组的元数据信息和块组之间运行都由超级块进行协调,并且在多个块组中会有超级块备份,tune2fs可以查看分区的超级块信息举例:tune2fs -l /dev/sda1,还可以通过dumpe2fs查看分区中块组信息举例:dumpe2fs /dev/sda1 加上-h也可以查看超级块信息
8.1.4、链接文件:2个文件指向同一个inode,此时一个文件就称为另一个文件的硬链接,当一个文件指向另一个文件的路径时此文件称为软连接也称为字符链接,ln -sv创建软链接,一个inode可以被引用多次其有计数器计算:在引用次为降为0之前是不会被标记为未用的。
8.1.5、硬链接(不能对目录创建硬链接、也不能跨分区、会增加inode引用计数,软连接可以对目录创建、不受分区限制、不增加引用计数)。文件被删除:仅删除路径,inode指向的磁盘块被标记为空闲,文件复制:创建一个新文件并把原文件再次写入磁盘块,文件移动:在同一个分区移动:文件仅是改变了文件访问路径、跨分区移到:在新分区创建文件,把数据复制过去,删除原分区数据。
8.2.1、设备文件:特殊文件只有ionde 而没有数据,关联至一个驱动程序进而跟对应硬件打交道、一般在/dev目录下,在设备元数据中每个设备都有设备号(主设备号:用于标记驱动程序(设备类型),次设备号:标记同一类设备中的不同设备,例如多块硬盘),mknod可以创建设备文件,设备文件命名由ICANN制定。
8.2.2、mknod (-m设置权限、创建文件名称、b块设备 主设备号 次设备号,举例:mknod -m 660 /dev/test1 b 120 0),磁盘设备文件(/dev/sd[a-z],USB: 串行、SATA: 串行、SCSI: 并行、SAS:串行,用数字标识分区号如:/dev/sda1,第一分区),磁盘中盘片分为磁道(track)每个磁道由多个扇区(sector)组成每个扇区512个字节,0磁道0扇区被称为主引导记录(MBR:Master Boot Record)用于引导启动操作系统(os),MBR512字节分为(446bytes: bootloader、64bytes: 分区表,每16bytes标记一个分区,一共只能有4主分区、2bytes: MBR有效性标记)。
8.2.3、分区(主分区、扩展分区(扩展分区不能直接使用必须分割为1个或多个逻辑分区)、逻辑分区),分区编号:主+扩展1-4,逻辑分区为5..n,fdisk可以查看磁盘信息举例:fdisk -l | grep -A 10 "^Disk /dev/[sh].*",柱面(cylinder)分区更加柱面划分,通过cat /proc/partitions也可以查看磁盘分区信息
8.2.4、查看分区:fdisk -l,创建分区:fdisk + 未使用柱面硬盘如:fdisk /dev/sdb(m查看帮助、p显示磁盘分区表、n新建分区、d删除分区、t修改分区系统id、w保存分区、q不保存分区、l列出所有已知的系统编号),新建分区需要内核重读分区表后才可使用(Centos5:partprobe,Centos6:partx -a或kpartx -af,Centos6读取2个命令需要轮流执行最后通过/proc/partitions查看内核是否识别),分区创建工具:sfdisk和parted
8.2.5、练习写一个脚本,1、提示输入一个对其执行分区的新硬件设备文件;2、提醒用户接下来的操作销毁所有的数据,你继续吗?(y或yes: 继续、n或no:退出、其它字符:提醒输错了,再来一次;)3、对磁盘新建分区:(主分区1:大小512M,主分区2:大小2G)4、创建完成后显示创建的结果;没有完善后期再修改
8.3.1、创建文件系统:mkfs : make file system,Linux内核是模块化的,这些模块支持动态装载和卸载,文件系统可能会被直接打包进内核,也可以被编译成内核模块,lsmod可以查看内核已经装载了那些模块,如果需要格式化特定文件系统,通常需要安装对应的命令工具来实现。例如用rpm或者yum来安装即可。
8.3.2、mkfs -t FSTYPE = mkfs.FSTYPE举例:mkfs -t ext3 = mkfs.ext3(mkfs.ext3 /dev/sdb1),还有个命令可以创建文件系统mke2fs它包含很多选项(-b指定块大小{1024|2048|4096}、-t指定文件系统{ext2|ext3|ext4}、-L指定卷标、-j相当于指定文件系统ext3、-i指定多少字节创建一个inode、-N 直接指定创建inode数、-m预留空间占整个分区空间的百分比(-m 2))
8.3.3、blkid查看分区文件系统信息,e2label查看设定卷标举例:e2label /dev/sdb1 hello,设定卷标为hello、tune2fs修改分区属性,块大小不能调整(-j:可以将ext2升级文件系统ext3、-L修改卷标、-m修改预留的空间百分比、-O ^FEATURE:启用指定特性,特性前加^,表示关闭此种特性)
8.3.4、因进程意外中止或系统崩溃等情况导入写入操作非正常中止时,可能会导致文件损坏,fsck修复文件系统一个文件系统修复时必须先卸载(-t指定修复文件系统(可省略自动检测以什么文件系统修复)、-a自动修复、-r交互式修复,举例:fsck -t ext3 -a /dev/sdb1),e2fsck用来修复ext文件系统(-y: 对问题自动回答为yes、-f: 强制进行检测,举例:e2fsck -y -f /dev/sdb1)、 mkfs -t vfat可以创建fat32文件系统、交换分区:swap缓解物理内存资源不够用的情况;mkswap [-L LABEL] DEVICE:举例:mkswap -L swap1 /dev/sdb2(注意在创建前需要先把分区类型修改为swap类型,用fdisk)
8.3.5、mount把需要挂载的设备或文件系统挂到某个目录中,该目录成为另一个设备或文件系统的访问入口,举例:(mount /dev/sdb1 /mnt 挂载分区),mount常用的挂载选项(-r: 只读挂载、-w: 读写挂载、-t :指定文件系统类型),查看所有挂载信息mount、cat/proc/mounts、cat/dev/mtab
8.4.1、mount -o option(async:磁盘异步I/O,sync: 磁盘同步I/O,atime/noatime: 文件和目录被访问时是更新最近一次的访问时间戳,auto/noauto:设备是否支持mount的-a选项自动挂载,diratime/nodiratime: 目录被访问时是更新最近一次的访问时间戳,dev/nodev: 是否支持在此设备上使用设备,exec/noexec: 是否允许执行此设备上的二进制程序文件,suid/nosuid: 是否支持在此设备的文件上使用suid,remount: 重新挂载举例:mount -o remount,acl /mnt,通常用于不卸载的情况下重新指定挂载选项,ro: 只读,rw: 读写,user/nouser: 是否允许普通挂载此文件设备,acl: 在此设备是支持使用facl,默认不支持,挂载方式:(mount -o acl /dev/sdb1 /mnt或开启该分区acl功能以后挂载时就不需要指定该选项:tune2fs -o acl /dev/sdb1))
8.4.2、umount卸载umount /mnt,fuser(-v 查看挂载设备上访问用户举例:fuser -v /dev/sdb1,-km直接提出挂载点上所有用户举例:fuser -km /dev/sdb1),df(-h单位换算后显示设备空间,-i显示设备inode使用情况),du(-s非精确计算当前文件夹下总体大小、-h单位换算),awk基本使用方法(awk -F: ‘{print $1}‘ /det/passwd)
8.4.3、swapon启用交互分区,举例:swapno /dev/sdb2、swapoff禁用交换分区:swapoff /dev/sdb2、/etc/fstab字段说明(设备名、挂载点、文件系统、挂载选项、备份频率(0不备份、1每天备份、2隔天备份)、自检(0不自检、1优先自检1只能用根分区、2....9))
8.4.4、作业1、列出当前系统上的所有磁盘设备;2、让用户选择一个磁盘设备,并在选择后显示指定设备上的所有分区信息;3、询问用户是否擦除此磁盘上的所有现存分区后重新添加三个分区(y或yes: 继续、n或no: 中止脚本、其它字符则提醒用户重新输入合法的字符);4、在用户选择是后执行相应的分区操作(主分区1:512M,ext4、主分区2: 512M,swap、主分区3:2G,ext4)5、将创建的分区按如上说明分别格式为相应的文件系统;6、将主分区1挂载至/mnt/boot目录,主分区3挂载至/mnt/sysroot目录;扩展:在上述第3个步骤开始之后,先查看此设备上是否有分区被挂载,如果有,则先卸载之;
#!/bin/bash #Date 2015-03-16 #Author xiangjin #Description Disk re partition echo "Current computer disk" ls -l /dev/sd[a-z] read -p "Select the required disk information view :" devname fdisk -l "$devname" |grep "^\/dev" for i in `fdisk -l $devname | grep "^\/dev" | awk ‘{print $1}‘ `;do if cat /proc/mounts | grep "$i";then echo " $i Uninstall is mounted" fuser -km $i umount $i else echo "$i no mount" fi done read -p "Delete all partitions on the disk and rebuild a new partition [y|yes]:Continue [n|no]:quit " boolid count=1 sumnumber=$(fdisk -l $devname |grep "^/dev" |wc -l) while [ $boolid != "" ];do if [ $boolid == "y" -o $boolid == "yes" ];then while [ $count -le $sumnumber ];do if [ $count -lt $sumnumber ];then echo "d $count w" | fdisk $devname else echo "d w" |fdisk $devname fi let count++ done echo "n p 1 +512M n p 2 +512M t 2 82 n p 3 +2G w " |fdisk $devname mke2fs -j -m 2 -b 1024 ${devname}1 mke2fs -j -m 2 -b 1024 ${devname}3 mkswap ${devname}2 if [ -d /mnt/boot ];then mount ${devname}1 /mnt/boot else mkdir /mnt/boot mount ${devname}1 /mnt/boot fi if [ -d /mnt/sysroot ];then mount ${devname}3 /mnt/sysroot else mkdir /mnt/sysroot mount ${devname}3 /mnt/sysroot fi swapon ${devname}2 exit 44 elif [ $boolid == "n" -o $boolid == "no" ];then echo "Program error" exit 55 else read -p "Invalid characters Please input again " boolid fi done