Linux磁盘和文件系统管理

一、硬盘组成和分区

        硬盘由多个盘面组成。每个盘面有两个可以读写的面,通过磁头进行读写。每个面分成多个从内到外的同心圆,称为磁道。每个磁道按照一定角度分为扇区,扇区是最小的物理存储单位,扇区大小为512bytes.第一个扇区最重要,里面有MBR主引导记录和PT主分区表分别占446和64bytes. 每个面相同位置的上的同一组磁道组成柱面,柱面试分区的最小单位。

        主分区和扩展分区最多4个;扩展分区最多一个;逻辑分区在扩展分区中;出来扩展分区其余分区能被格式化;逻辑分区SATA最多11个,IDE则为59个.


二、文件系统特性

        文件系统中三个重要的特性super block, inode, block.

        super block: 记录此文件系统的整体信息

        inode:记录文件的属性和实际数据所在block的号码

        block:记录文件的内容

        访问方式: 首先找到文件对应的inode,然后将inode中的block号码同时取出读取其中内容.这种方式称为索引式文件系统。除此之外还有FAT读取方式,这种方式没有inode,因此是首先找到第一个block位置,然后在该block中读取到下一个block位置,依次类推. 该读取方式会来回依次读取,如果文件数据写入的block分散,此时读取速度较慢,需要进行 碎片整理,就是将同一个文件所属的block汇合在一起 (为什么会分散? 因为文件的删除、新增导致blockmap分配策略所致). 对于磁盘空间浪费,用du -sb .来查看当前目录的大小,用du -sm .用block数量为标准以MB来显示,则能看出浪费的空间.


三、Ext文件系统

        文件系统一开始会将inode和block规划好,之后一般不会变化。但是对于大的文件系统,里面的inode和block数量很多,不容易管理。因此文件系统会在格式化的时候将该文件系统区分为多个块组(block group),每个块组由自己的独立的inode/block/super block系统。同时在文件系统的最前面有一个启动扇区,用来安装引导装载程序,可以制作出多重引导环境.

对于block比较大的时候,可能启动扇区和super block处在同一个block里面,也就是0号block。如果block较小,则分别处于0和1号block中.总之文件系统的前1024bytes始终是启动扇区.

        对于上面分的block group内部含有data block,inode table,super block, file system description,block bitmap,inode bitmap.

        data block:数据块.在Ext文件系统中所支持的block大小为1KB,2KB和4KB.  特性: block大小和数量在格式化的时候已经确定; 每个block内最多放一个文件的数据; 每个文件会占用多个block;小文件也会占用一个block(导致浪费). 对于第二点,block太大导致浪费,如果太小则inode会记录太多的block号码,导致文件系统不良读写.

        inodetable: inode记录的文件属性由访问模式,所有者和组,文件大小,文件创建或状态改变时间,最近读取时间,文件特性,文件真正内容指向。特性: 每个inode大小固定128bytes; 每个文件仅占用一个inode; 文件系统所能创建的文件数量和inode数量相关;系统读取文件的时候必须首先找到inode,并分析权限然后再从inode中读取block号码.对于第一点,假设:inode有12个直接指向,一个间接指向,一个双间接指向,一个三间接指向,每个block 1KB,那么可以达到

        12+256+256*256+256*256*256(KB)=16GB

        superblock:超级块,记录着整个文件系统相关信息,没有superblock就没有这个文件系统。主要是block和inode总量,未使用和已经使用的inode/block数量, block和inode大小,文件系统的挂载时间,最近一次写入数据的时间和fsck时间等,一个validbit来表明0没有被挂载1已经被挂载.一般来说一个文件系统只有一个superblock,那么由于每个blcok group都有superblock?事实上,除了第一个外,之后的都是第一个superblock的备份.

        file system desrciption:文件系统描述说明, 描述每个blcok group的开始和结束的block号码,

        block bitmap 块对照表,对于添加或者删除文件的时候以此作为依据来将bitmap改为使用中或者未使用中

        inode bitmap和block bitmap类似,只是这是记录的inode号码是否使用

使用sudo dumpe2fs /dev/sda2 查看根目录文件系统信息(如果加上 -h 参数则不会显示block group信息):




从上可知:Group0所占用的block号码从0到32767,superblock在0号block, file system description在1和2号block中.

            block bitmap和inode bitmap分别在1025和1041的block上,inode table在1057-1568的block上

            由于每个inode大小为256bytes,总共有1568-1057+1=512个block花在inode table上,因此inode数量为512*4096/256=8192个inode,这个group0还剩余2258个inode,剩余的为2084...


四、目录树

        使用ls -li 查看目录内的文件所占用的inode号码

        

        可以看出每个文件所占用的inode号码都不一样,分别129300,129297,129442

       查看目录大小一般均为1024的倍数,因为block的大小所致

        

        注意/proc在内存中建立,不占用硬盘空间

        目录:当新建一个目录的时候,文件系统会至少分配一个inode和一个block。分别记录目录的权限属性和目录下文件和文件名对应的inode.

        文件:当新建一个文件的时候,文件系统至少分配一个inode,如果文件大小在12*4K,则分配文件大小/4K个block,否则还要考虑给inode分配一个或者多个block用于间接指向.

        目录读取:

        

        比如读取/etc/passwd文件,那么通过挂载点信息找到/dev/sda2的inode号码为2的根目录,且inode具有全新rx可以读取block的内容.取得blcok号码后,并找到/etc目录的Inode号码 917505,发现有权限rx可以读取/etc的block,取得block号码后并找到内容为passwd文件的inode号码919283,其inode含有权限r,因此可以读passwd文件的内容,取出passwd相关的block读取.

        磁盘读写: 对于文件数据离散问题,可以将文件复制出来,然后格式化文件系统再将数据复制回去解决。


五、Ext3日志文件系统

        对于block group中将inode table和data block称为数据存放区域,而其他的则成为中间数据,因为这些中间数据会随着每次添加、删除和编辑的时候受到影响。一般情况下是可以顺利完成的。但是如果在文件写入系统的时候断电或者内核错误,导致数据不一致,那么下次重启的时候需要对整个文件系统进行检查,从而造成修复时间过长,这造成日志文件的兴起。

        日志文件在系统要写入一个文件的时候,会先在日志记录块中记录某个文件准备要写入的信息。然后开始写入文件的权限和数据,开始更新中间数据。完成数据和中间数据的更新后,在日志记录块中完成该文件的记录。

        异步写入,如果内存中的数据被更改过,此时该数据被设置为Dirty.可以使用sync命令来手动强制写回磁盘。在正常关机的时候会调用sync.


六、挂载点和VFS

        文件系统要链接到目录树才能被使用,这种将文件系统和目录树相结合的操作称为挂载。挂载点一定是目录,该目录是该文件系统的入口。

        

    如上/ /boot /home均为挂载点,因为文件系统最顶层目录的inode一般为2号.

        

        因为/ /. /..都在同一个文件系统中,而inode号码一致,说明是同一个文件,也就是说根目录的上一级目录是自己


        VFS是Virtual Filesystem Switch虚拟文件系统, 用于屏蔽各种文件系统的差异.


七、df和du

        df 查看磁盘容量,使用: df [-ahijkHTm] [目录或者文件名]

        -a 列出所有文件系统,包括/proc

        

        其中/dev/shm是内存虚拟处理的文件系统

        -k 以KB显示容量; -m 以MB显示容量; -h 简便显示; -H 以M=1000K来代替1024K;

        

        -T 显示文件系统名称,比如ext3

        

        -i 以inode数量代替容量来显示

        

    

    du 查看目录容量,使用: du [-ahskm] 文件或者目录名称

    -a 列出所有目录和文件容量,默认是仅仅统计目录

    

-h 简便显示; -s 列出总量而不列出每个子目录容量; -S包括子目录下的容量;-k 以KB显示; -m以MB显示



八、链接文件

        硬链接,硬链接的inode号码和原文件一样,因此可以由一样的inode对文件内容进行访问修改。同时删除原文件后,硬链接还是能访问文件. 但是硬链接不能跨文件系统,同时不能链接到目录上(因为很复杂,目前还没实现).

        软链接,软链接的Inode号码和原文件是不一样的,只是软链接会指向原文件的Inode号码,从而继续依赖原文件来实现访问和修改。这个时候删除原文件,则软链接失效,类似快捷方式。一般软链接用的跟多,因为没有硬链接的限制.

        

        可以看出对于硬链接ln passwd passwd-hd,使用的inode数目并没有增加,而软链接ln -s passwd passwd-so则增加了1个,对于容量硬链接没有变化,而软链接增加了6,因为passwd为6byte。当删除原文件后,硬链接仍然有效,但是软链接异常。

        关于文件的连接数量,是指有多少个硬链接附属到该文件上+1.对于目录则上,目录下还有多少个和自身指向一样的目录(一般是.或者..起作用). 总之连接数量就是当前文件系统中存在多少个重复的inode数目.


九、磁盘分区

        fdisk /dev/sda 进入分区界面.

        

        第一行是磁盘的文件名和容量。接下来是有255个磁头,63个扇区和3916个柱面.然后是每个柱面大小为8MB左右.

        用fdisk -l 列出所有硬盘中的分区,不仅仅是/dev/sda,比如插入u盘后的/dev/sdb也会显示

       增加和删除操作:

        删除所有分区

        

        增加一个512M主分区4

        

        增加一个扩展分区1

        

        增加一个逻辑分区2048M

        

        新建分区sda6,选择扩展分区中还没有使用到的柱面开始,申请一定容量,之后重启。

         然后进行格式化。如果用mkfs -t ext3 /dev/sda6,这样就默认格式化. 也可以用mke2fs [-b block 大小] [-i inode容量] [-L 卷标名称] [-j] 设备.其中-j是加入日志功能.-i表示该文件系统有总容量/inode容量.

        磁盘检验:fsck [-t 文件系统] [-ACay] 设备. 其中-A是按照/etc/fstab内容将需要的设备检查一次,开机一般会执行. -a自动修复扇区, -y和-a类似, -C用直方图显示进度

                    badblocks [-svw] 设备名称.其中-s 在屏幕上列出进度, -v可以在屏幕上看到进度,检查哪些block是坏的

        磁盘挂载: mount [-t 文件系统] [-L 卷标名称] [-o 选项] [-n] 设备名称 挂载点

                -a 依据配置文件/etc/fstab将所有没有挂载的磁盘挂载进来

                -l 列出目前所挂载的信息

                -L 利用卷标名进行挂载

                -o 设置挂载的参数,一般默认即可.其中有个-o remount很有用

            比如 mount /dev/sda6 /mnt/sda6这样就将刚创建的文件系统挂载到/mnt/sda6目录下了。直到下次开机之前有效

            (系统支持的文件系统名称在/etc/filesystems, 系统已经加载的文件系统名称在/proc/filesystems,文件系统驱动程序在/lib/modules/$(uname -r)/kernel/fs目录下)

       目录挂载:

                mkdir /mnt/home

                mount --bind /home /mnt/home

                这样就将/home 挂载到/mnt/home目录下.

        磁盘卸载:可以用设备名 umount /dev/sda6 ;  也可以用挂载点卸载 umount /mnt/sda6; 

        目录卸载:只能用挂载点卸载 umount /mnt/home

       修改文件系统卷标名:e2label

                        e2label 设备名称 新的label名称.

                        比如e2label /dev/sda6 "mytest",用dumpe2fs -h /dev/sda6可以看出文件系统名称更改为my_test

       硬盘测试: hdparm [-Tt] 设备名称

                    

                分别测试cache访问性能和硬盘实际访问性能

        开机挂载:一般来说,对于手动挂载,到下次开机的时候会失效。因此需要开机自动挂载.

                      

                上面的/etc/fstab文件中第一列是文件系统的设备文件名,第二列是挂载点,第三列是文件系统,第四列树文件系统参数默认即可,第五列能否被dump备份命令使用0表示不备份1表示每条进行dupm备份操作2表示不定期进行dupm备份操作,第六列是否以fsck检验扇区0不要检验1最早检验2次之检验一般根目录为1其余为2,上面为/dev/sda6的挂载. /etc/fstab是开机的配置文件,实际文件系统的挂载是记录到/etc/mtab和/proc/mounts中.

        特殊挂载: 使用loop将大文件制作成设备挂载或者交换文件设备挂载

                        首先dd if=/dev/zero of=/home/loopdev bs=1M count=512,这是用/dev/zero设备一直输出0到/home/loopdev文件中使得内容容量达到512个bs(1M)的大小.这样/home目录生成大文件loopdev.

                                    然后 mkfs -t ext3 /home/loopdev将大文件进行格式化,如果是交换文件则用mkswap /home/loopdev

                                    最后 mount -o loop /home/loopdev /median/cdrom 将格式化后设备文件进行挂载,对于交换文件用swapon来启动即可

                        这样在原有的分区中虚拟化一个新的分区

        内存交换空间的构建:和上面类似,只是要修改文件系统id, 在分区界面中使用t将原先82改成82即可.然后重启,接着用mkswap /dev/sda7来进行交换文件的格式化.

        查看原先的内存交换空间

         

        将刚新建的交换分区加入swapon,撤销swapoff

          

        查看已经存在的交换文件系统

        

        一般最多能创建32个swap

猜你喜欢

转载自blog.csdn.net/whitenigt/article/details/80180586