首页 > 代码库 > Linux的磁盘管理与文件系统

Linux的磁盘管理与文件系统

    本篇内容如下:

            1、硬盘结构

            2、磁盘分区类型

            3、管理分区

            4、文件系统

            5、挂载


一、硬盘结构

    以下只针对机械硬盘。

技术分享

     通过电机转动,主轴开始旋转,主轴上的磁盘也跟着转动,每个磁盘有两个盘面,磁臂上磁头通过盘面来读取或者存储计算机上的数据。

    1、硬盘存储术语

        盘面:每个磁盘有两个盘面      

        磁头:有几个磁头就有几个盘面

        磁道:磁头不动时随着主轴转动画出的圆形轨迹

        扇区:每个扇区一般为512字节

        柱面:每个盘面划分出相等的磁道,由编号相同的磁道生成的圆柱体

    2、设备文件

        磁盘设备的设备文件命名:/dev/DEV_NAME

            IDE:/dev/hd

            SISC,SAST,SAS,USB:/dev/sd

                不同设备a-z

                    /dev/sda,/dev/sdb

                同一设备的不同分区:1,2,3,4...

                    /dev/sda1,/dev/sda2,/dev/sda3


二、磁盘分区

    1)为什么要给磁盘分区,因为给磁盘分区后,可以方便我们的管理,总结一下有以下优点:

        1、优化I/O性能

        2、实现空间配额限制

        3、提高修复速度

        4、隔离系统和程序

        5、安装多个OS

    2)两种分区方式:MBR与GPT

        在说MBR结构之前先说一下CHS的寻址方式,C:Cylinder柱面,H:heads磁头,S:Sector扇区。这三种的取值范围分别为0到Cylinder-1,0到Heads-1,1-Sector(注意:扇区是从1开始)

        


    MBR硬盘分区结构图如下

技术分享

        在 磁盘起始处,也就是0磁头的0柱面第一个扇区为MBR,大小为512个字节,单独剖开MRB来看,其中分为3部分:前446字节为主引导程序,中间64个 字节为主分区表,后面两个字节为标识位,为55 AA,如果其内容被修改,则分区表的显示可能就会出现问题。

        1、前446字节为主引导程序,系统启动时用来引导系统找到活动分区,启动系统

        2、中间64个字节可细分为四个16字节。即每16字节表示一个分区

            16字节中:

                第1个字节表示此分区是否为活动分区,80表示为活动,00为非活动。

                第2-4字节表示CHS寻址的起始位置

                第5个字节表示该分区的类型,如83为inux Swap 分区,8e为LVM类型。如果为0表示未使用

                第6-8字节表示CHS寻址的结束位置

                第9-12字节表示LBA寻址的起始位置

                第12-16字节表示LBA寻址的结束位置

           LBA寻址方式:即Logical BlockAddressing,逻辑块寻址模式。在CHS寻址方式中,因为角速度相同,所以盘片内部的磁道的性能远不如磁盘外部的性能,为了改善这种情 况,人们改用等密度结构生产硬盘,也就是说外圈磁道的扇区比内圈的多,而采用这个结构后便不再能够像以前那样使用CHS的寻址方式,只能改为LBA方式, 所以上述的 LBA就是此意。

        3、后面2个字节为表示位,通常为55 AA,如果这两个字节被破坏,则分区表显示会有问题

    上面所说的中间64字节为主分区表,但如果有扩展分区,扩展分区大家都知道,可以继续的分为许多个逻辑分区,不过这些逻辑分区都只能在扩展分区的地界进行划分。而在上面所说的16字节中,并不能显示每个逻辑分区的地址界限,只能把整个的扩展分区的界限给显示出来。

技术分享

技术分享

技术分享

技术分享

技术分享



        扩展分区

            如上面MBR分区方式图所示,扩展分区的第一个扇区也有类似于MBR的一种结构,其名为EBR,也占有512个字节。

            1、前446字节为空,只是为了与MBR结构一致

            2、中间64字节也分为四个16字节

                第一个16字节结构类似于MBR,并指向第一个逻辑分区

                第二个16字节指向的是第二个EBR,以此循环

                后面32个字节暂时未被使用。



    GPT分区

        GPT:GUID patition table 支持128个分区,使用64位,支持8Z(512Byte/block )64Z (4096Byte/block),使用128位UUID 表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC校验位,UEFI (统一扩展固件接口)硬件支持GPT,结构如下图所示

        基本上可以分为六个部分:

            1、Protect MBR,用来保护分区,因为传统的分区方式不识别GPT分区,需要填充上传统MBR的标识位即55 AA。

            2、GPT信息头部

            3、GPT分区表

            4、GPT分区

            5、GPT的备份区域

            6、GPT的备份区头部

技术分享



三 管理分区

    1)创建分区

        创建分区使用:
            fdisk创建MBR分区,也支持GPT,对于一块硬盘,最多只能管理15分区
            gdisk创建GPT分区
            GNU parted高级分区操作(创建、复制、调整大小等等)



    分区工具fdisk和gdisk使用操作相似,下面举例fdisk

        # fdisk -l [-u] [device...]
        子命令:
        p 分区列表
        t 更改分区类型
        n 创建新分区
        d 删除分区
        w 保存并退出
        q 不保存并退出

技术分享

技术分享

技术分享

技术分享

技术分享

   2)同步分区表

        有些时候虽然已经对磁盘作出了操作,但是内存和磁盘并不同步,所以需要通知内存重读磁盘信息,保持信息的同步性。

技术分享


技术分享技术分享  

技术分享

技术分享


        注意:在CentOS 5,7上使用partprobe,CentOS 6上使用partprobe却是不管用,所以CentOS6上使用partx -a DISK_NAME

    3)parted命令

        parted的操作都是实时生效的,小心使用,下面演示的利用parted命令创建gpt类型并分区

技术分享

技术分享

技术分享

技术分享

技术分享


四 文件系统

    何为文件系统?文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。

    Block:Linux文件系统存储数据的最小单位,分为1K,2K和4K。

    超级块:超级块作用是存储文件系统的大小,空闲block以及inode数量等等诸如此类的信息,要使用一个分区来进行数据访问,那么第一个要访问的就是超 级块,所以,如果超级块坏了,那磁盘也就无法访问了。所以为了防止超级块数据被破坏,则需要对超级块仅进行数据备份,以便于损坏时修复

    1)文件系统类型

        Linux文件系统: ext2, ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap
        光盘:iso9660
        Windows:fat32, ntfs
        Unix: FFS(fast), UFS(unix), JFS2
        网络文件系统:NFS, CIFS
        集群文件系统:GFS2, OCFS2(oracle)
        分布式文件系统:ceph, moosefs, mogilefs, glusterfs, Lustre
        RAW:未经处理或者未经格式化产生的文件系统

        

        文件系统分类:

            根据其是否支持"journal"功能:
                日志型文件系统: ext3, ext4, xfs, ...
                非日志型文件系统: ext2, vfat
        文件系统的组成部分:
            内核中的模块:ext4, xfs, vfat
            用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
        Linux的虚拟文件系统:VFS

            Linux通过VFS来支持多样化的文件系统          

    2)创建文件系统

        mkfs命令:
        (1) # mkfs.FS_TYPE   /dev/DEVICE
        FS_TYPE:btrfs   cramfs  ext2   ext3   ext4  fat   minix  msdos  vfat   xfs

    

[root@localhost ~]# mkfs.ext2 /dev/sdb1   //创建ext2类型的文件系统
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)            //块大小为1024
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
124928 inodes, 499712 blocks
24985 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
61 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:     //超级块存储在
    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

            mke2fs:ext系列文件系统专用管理工具
            -t {ext2|ext3|ext4}
            -b {1024|2048|4096}
            -L ‘LABEL‘
            -j: 相当于-t ext3
            mkfs.ext3 = mkfs-t ext3 = mke2fs -j = mke2fs -t ext3
            -i#: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小
            -N #:为数据空间创建个多少个inode
            -m #: 默认5%,为管理人员预留空间占总空间的百分比
            -O FEATURE[,...]:启用指定特性
            -O ^FEATURE:关闭指定特性

[root@localhost ~]# mke2fs -t ext4 /dev/sdb5 //创建ext4文件系统
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)            //块大小为1K
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
4016 inodes, 16032 blocks
801 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=16515072
2 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks: 
    8193

Writing inode tables: done                            
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost ~]# mke2fs -t ext4 -b 4096 /dev/sdb5 //指定块大小为4K
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)                //块大小为4K
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4032 inodes, 4008 blocks
200 blocks (4.99%) reserved for the super user
First data block=0
1 block group
32768 blocks per group, 32768 fragments per group
4032 inodes per group

Writing inode tables: done                            
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override

        

    3)文件系统标签

        指向设备的另一种方法

        blkid:块设备属性信息查看
            blkid[OPTION]... [DEVICE]
            -U UUID: 根据指定的UUID来查找对应的设备
            -L LABEL:根据指定的LABEL来查找对应的设备

技术分享

            e2label:管理ext系列文件系统的LABEL
            # e2label DEVICE [LABEL]

技术分享

            tune2fs:重新设定ext系列文件系统可调整参数的值

                -l:查看指定文件系统超级块信息;super block

                -L ‘LABEL‘:修改卷标

                -m #:修预留给管理员的空间百分比

                -j: 将ext2升级为ext3

                -O: 文件系统属性启用或禁用,–O ^has_journal

                -o: 调整文件系统的默认挂载选项,–o ^acl

                -U UUID: 修改UUID号;

[root@localhost ~]# tune2fs -l /dev/sdb1  //查看/dev/sdb1的超级块
tune2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   xiaoshui        //卷标
Last mounted on:          <not available>
Filesystem UUID:          4fb146b1-4147-4a43-b023-2d9deb17cc97
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              124928    //Inode数量
Block count:              499712    //Block数量
Reserved block count:     24985     //block保留数,供管理员使用
Free blocks:              481628    //空闲block块
Free inodes:              124917    //空闲inode数量
First block:              1        //第一个block块
Block size:               1024      //block大小
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192        //每一个组的block数量
Fragments per group:      8192
Inodes per group:         2048        //每一个组的inode
Inode blocks per group:   256
Filesystem created:       Fri Aug 26 20:45:25 2016
Last mount time:          n/a
Last write time:          Sat Aug 27 12:09:21 2016
Mount count:              0
Maximum mount count:      -1
Last checked:             Fri Aug 26 20:45:25 2016
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              128
Default directory hash:   half_md4
Directory Hash Seed:      b6445eaa-a42d-45a0-8411-d4176ac8cb29


[root@localhost ~]# tune2fs -L dashui /dev/sdb1 //修改/dev/sdb1的卷标为dashui
tune2fs 1.42.9 (28-Dec-2013)
[root@localhost ~]# e2label /dev/sdb1             //查看/dev/sdb1的卷标
dashui                            //修改成功

        dumpe2fs:
            -h:查看超级块信息(分组信息),分区用分组管理

[root@localhost ~]# dumpe2fs -h /dev/sdb1 //使用dumpe2fs查看/dev/sdb1的超级块信息
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   dashui
Last mounted on:          <not available>
Filesystem UUID:          4fb146b1-4147-4a43-b023-2d9deb17cc97
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              124928
Block count:              499712
Reserved block count:     24985
Free blocks:              481628
Free inodes:              124917
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         2048
Inode blocks per group:   256
Filesystem created:       Fri Aug 26 20:45:25 2016
Last mount time:          n/a
Last write time:          Sat Aug 27 12:41:34 2016
Mount count:              0
Maximum mount count:      -1
Last checked:             Fri Aug 26 20:45:25 2016
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              128
Default directory hash:   half_md4
Directory Hash Seed:      b6445eaa-a42d-45a0-8411-d4176ac8cb29

[root@localhost ~]#

    4)文件系统检测和修复

        fsck: File System Check
            fsck.FS_TYPE
            fsck-t FS_TYPE
            -a: 自动修复错误
            -r: 交互式修复错误

            注意: FS_TYPE一定要与分区上已经文件类型相同;

        e2fsck:ext系列文件专用的检测修复工具
            -y:自动回答为yes
            -f:强制修复

            常发生于死机或者非正常关机之后,挂载为文件系统标记为“dirty”


五  挂载文件系统

    挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为

    卸载:解除目录与设备的联系

    挂载方法:mount DEVICE MOUNT_POINT

    mount [-fnrsvw] [-t vfstype] [-o options] device dir
        device:指明要挂载的设备;
        (1) 设备文件:例如/dev/sda5
        (2) 卷标:-L ‘LABEL‘, 例如-L ‘MYDATA‘
        (3) UUID, -U ‘UUID‘:例如-U ‘0c50523c-43f1-45e7-85c0-a126711d406e‘
        (4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs

[root@localhost ~]# blkid    //通过blkid查找到/dev/sdb5的UUID
/dev/sda1: UUID="7bbc50de-dfee-4e22-8cb6-04d8520b6422" TYPE="ext4" 
/dev/sda2: UUID="f8yBR5-kH5W-QQB7-3kx4-9Sl1-daC1-k4xGHV" TYPE="LVM2_member" 
/dev/sdb5: UUID="a7dc763f-64ee-4d4d-902b-7f6017469ddc" TYPE="ext4" 
/dev/mapper/vg0-root: UUID="42a67ff2-4ca0-4610-8e13-57311331ad02" TYPE="ext4" 
/dev/mapper/vg0-swap: UUID="e4b0968e-544e-4112-b3ec-3c4cc5fdb9dd" TYPE="swap" 
/dev/mapper/vg0-usr: UUID="087ba9d3-997f-4465-a215-a090ab248e14" TYPE="ext4" 
/dev/mapper/vg0-var: UUID="2c0ff242-1422-429a-8671-a644f85a6f8e" TYPE="ext4" 
/dev/sdb1: UUID="0e5b443a-00e6-4726-b2b5-de3d48192e89" TYPE="ext4" 
[root@localhost ~]# mount  exta9e16e39-4904-4e7f-9552-aba4bc39bc3b /testdir/
mount: you must specify the filesystem type
[root@localhost ~]# mount  -U exta9e16e39-4904-4e7f-9552-aba4bc39bc3b /testdir/
mount: no such partition found
[root@localhost ~]# mount -U a7dc763f-64ee-4d4d-902b-7f6017469ddc /testdir/ //通过UUID挂载
[root@localhost ~]# df
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/mapper/vg0-root  20511356  421188  19041592   3% /
tmpfs                   502068       0    502068   0% /dev/shm
/dev/sda1               194241   34122    149879  19% /boot
/dev/mapper/vg0-usr   10190136 2257696   7408152  24% /usr
/dev/mapper/vg0-var   20511356  156172  19306608   1% /var
/dev/sdb5                14497     138     13558   2% /testdir

     dir:挂载点
     事先存在;建议使用空目录
     进程正在使用中的设备无法被卸载

[root@localhost ~]# mount   //查看当前已挂载的所有设备
/dev/mapper/vg0-root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
/dev/mapper/vg0-usr on /usr type ext4 (rw)
/dev/mapper/vg0-var on /var type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

    Mount常用选项:

        -t vsftype:指定要挂载的设备上的文件系统类型        
        -r: readonly,只读挂载
        -w: read and write, 读写挂载
        -n: 不更新/etc/mtab,相当于#mount
        -a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
        -L ‘LABEL‘: 以卷标指定挂载设备
        -U ‘UUID‘: 以UUID指定要挂载的设备
        -B, --bind: 绑定目录到另一个目录上
        查看内核追踪到的已挂载的所有设备:
            cat /proc/mounts

        -o options:(挂载文件系统的选项),多个选项使用逗号分隔
            async:异步模式
            sync:同步模式,内存更改时,同时写磁盘
            atime/noatime:包含目录和文件
            diratime/nodiratime:目录的访问时间戳
            auto/noauto:是否支持自动挂载,是否支持-a选项
            exec/noexec:是否支持将文件系统上运行应用程序
            dev/nodev:是否支持在此文件系统上使用设备文件
            suid/nosuid:不否支持suid和sgid权限
            remount:重新挂载
            ro:只读
            rw:读写
            user/nouser:是否允许普通用户挂载此设备,默认管理员才能挂载
            acl:启用此文件系统上的acl功能
            Defaults:相当于rw, nosuid, dev, exec, auto, nouser, async

[root@localhost ~]# mkdir /testdir
mkdir: cannot create directory `/testdir‘: File exists
[root@localhost ~]# cd testdir/
[root@localhost testdir]# ls
[root@localhost testdir]# cd /
[root@localhost /]# mount -r /dev/sdb1 /testdir/ //挂在只读文件系统
[root@localhost /]# cd /testdir/
[root@localhost testdir]# touch fi
touch: cannot touch `fi‘: Read-only file system //系统提示不能创建fi,因为是只读文件系统
[root@localhost testdir]# 

[root@localhost testdir]# umount /dev/sdb1 //卸载/dev/sdb1,因为当前在它的挂在目录下,所以提示报错
umount: /testdir: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[root@localhost testdir]# cd
[root@localhost ~]# umount /dev/sdb1    //更改目录后再次卸载,卸载成功
[root@localhost ~]# mount -w /dev/sdb1 /testdir/ //读写挂载
[root@localhost ~]# cd /testdir/
[root@localhost testdir]# touch f1    //创建文件f1
[root@localhost testdir]# ls            //创建成功
f1  lost+found
[root@localhost ~]# mount -o remount,ro /dev/sdb1 //remount重新挂载只读文件系统
[root@localhost ~]# cd /testdir/
[root@localhost testdir]# ls
f1  lost+found
[root@localhost testdir]# touch f2
touch: cannot touch `f2‘: Read-only file system //重新挂载成功,显示不能Read-only


    卸载命令:

        查看挂载情况:

            #findmntMOUNT_POINT

[root@localhost ~]# findmnt
TARGET                       SOURCE               FSTYPE      OPTIONS
/                            /dev/mapper/vg0-root ext4        rw,relatime,barrier=1,data=http://www.mamicode.com/ordered>

        查看正在访问指定文件系统的进程:

            #lsofMOUNT_POINT

            #fuser -v MOUNT_POINT

        终止所有在正访问指定的文件系统的进程:

            # fuser -km MOUNT_POINT

        卸载:

            # umountDEVICE

            # umountMOUNT_POINT

技术分享


                                                                                        谢谢浏览.....


本文出自 “学無止境” 博客,请务必保留此出处http://dashui.blog.51cto.com/11254923/1843494

Linux的磁盘管理与文件系统