美文网首页
9、磁盘及文件系统

9、磁盘及文件系统

作者: 崔千易 | 来源:发表于2018-04-09 09:56 被阅读0次

    磁盘及文件系统

    硬盘的物理构成:

        扇区(sector)、磁道(track)、磁头、柱面(cylinder)

    分区:就是记录每一个分区的起始柱面和结束柱面。分区信息存放在0柱面0磁头1扇区上:MBR 主引导记录(446字节)+DPT磁盘分区表(64字节)+结束标志(2个字节)

          硬盘的主引导记录(MBR)是不属于任何一个操作系统的,它先于所有的操作系统而被调入内存,并发挥作用,然后才将控制权交给主分区(活动分区)内的

      操作系统,并用主分区信息表来管理硬盘。

    文件系统是操作系统用于明确存储设备(常见的是磁盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。

        block :数据存储的最小单元

        inode:索引节点,全局唯一编号,除了记录文件的属性外,同时还具有指针功能,指向文件内容放置的快

            (里面保存的是文件的权限,所有者,所属主等基本信息)

    1、文件的拥有者与用户组(owner/group)

    2、文件的访问模式(read/write/excute)

    3、文件的类型(type)

    4、文件建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改时间(mtime)

    5、文件的大小

    6、定义文件属性的标志(flag),如setUID...

    7、文件真正内容的指针(pointer)

    创建目录:分配一个inode和至少一个block

              inode记录该目录的相关属性,并指向分配到的那个快;

      block记录在这个目录下的相关文件(或目录)的关联性

    创建文件:分配至少一个inode与相对于该文件大小的快数量

              inode不记录文件名,而是记录文件的相关属性,文件名记录在目录所属的block区域

    例如:读取/etc/crontab的流程如下:

        1、操作系统根据根目录(/)的相关数据可获取/etc目录所在的inode,并读取/etc这个目录所有相关属性

    2、根据/etc的inode的数据,可以获取/etc目录下所有文件的关联数据是放置在哪一个block中,并前往该block读取文件的关联性内容

    3、由上步骤的block中,可以知道crontab文件的inode所在地,并前往该inode

    4、由上步骤的inode中,可以获取crontab文件的所有属性,并前往由inode所指向的block区域,获取crontab文件内容

    块组:block group 对用户是不可见的,子逻辑区域,有个超级标示区

    文件系统构成:(dumpe2fs 可以查看)

        superblock(超级块):记录整个文件系统相关信息

        1、block与inode的总量

    2、未使用和已使用的inode/block数量

    3、文件系统的载入时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息

    4、有效位的值,已载入为0,未载入为1

    group description(组描述):记录此block由何处开始记录

        block bitmap(快位图):此处记录block是否使用

    inode bitmap(inode位图):此处记录inode是否使用

    inode table(inode表):为每个inode的数据存放区

    data block(数据块):为每个block的数据存放区

    metadata  bitmap (块位图)dentry 目录项

    创建文件:先在目录下创建一个条目,把名字和iNode对应上,回到源数据,指定块位置

    删除文件:删除条目里面的名字和iNode对应关系,将对应的iNode标记为0

              通过inode号码来删除文件:find ./ -inum 400935 -exec rm -rf {} \;  

              extundelete: linux下高效数据恢复工具 http://extundelete.sourceforge.net/  安装时需要的依赖包 e2fsprogs-lib e2fsprogs-devel

    复制文件:不同的inode和block

    剪切文件:同一个分区,inode号和磁盘块位置都没有变,只是把条目里面的名字改变了一下

    链接:硬链接和软链接(符号链接),多个文件指向同一个iNode,硬链接;符号连接,指向的是源文件的路径,而不是文件块

    ln (link) [-s -v]  源文件  链接

    硬链接:在某个目录下的block中增加一个文件关联数据,不会用到inode与磁盘空间

            只能对文件进行创建,为了避免循环引用

            不能跨文件系统,可以在不同目录下

    创建硬链接可以增加文件被连接的次数

    符号链接:建立一个独立的文件,这个文件会让数据的读取指向它连接的文件内容

            可以对目录创建

    可以跨文件系统

    不会增加被链接文件的链接次数

    其大小为指定路径所包含的字符个数

    -b 删除,覆盖以前建立的链接

    -d 允许超级用户制作目录的硬链接

    -f 强制执行

    -i 交互模式,文件存在则提示用户是否覆盖

    -n 把符号链接视为一般目录

    -s 软链接(符号链接)

    -v 显示详细的处理过程

    du    查看文件大小  [-s -h ] 

    -s 只分别计算命令列中每个参数所占的总用量

    -h 做单位转换

    df  查看硬盘使用情况

    -i  查看inode的使用情况

    -P 不换行显示

    -h  做单位转换

    设备文件:

    b:块设备文件,以块为单位,随机访问

    c: 以字符为单位,是线性设备,访问时有先后顺序

    例:ls -l /dev

    主设备号(标示设备类型,major number)   

    次设备号(标示同一类型的不同设备,minor number)

    创建设备文件:mknod  -m name type major ninor

    硬盘的设备文件名:

    IDE ATA  :hd

    SATA  SCSI USB :sd

    a b c ....来区别同一种类型下的不同设备

    IDE:    第一个IDE口,控制器,主 从hda  hdb

    第二个IDE口,主从  hdc hdd

    fdisk 查看当前系统识别的硬盘和分区的情况

    fdisk -l [/dev/to/smoe_device_file]

    还可用来管理分区

    fdisk /dev/sda

    p:显示当前硬件的分区,包括没有保存的改动

    n:创建一个新的分区

    d:删除一个分区

    w:保存并退出

    q:不保存退出

    t:修改分区类型(文件系统类型)

    l:显示所支持的所有类型

    cat /proc/partitions  查看分区

    partprobe  [/dev/sda]  通知操作系统分区表的变化

    partx -a [/dev/sda]    告诉内核磁盘分区是否存在及其编号

    cat /proc/filesystem  查看文件系统类型

    高级格式化:mkfs -t ext4

    mkfs -t msdos /dev/hdb3

    mkfs.ext2 、mkfs.ext3 、mke2fs

    -b:分区时设定每个数据区块占用空间大小,目前支持1024, 2048 以及4096 bytes每个块。

    -i:设定inode大小

    -N:设定inode数量,有时使用默认的inode数不够用,所以要自定设定inode数量。

    -c:在格式化前先检测一下磁盘是否有问题,加上这个选项后会非常慢

    -L:预设该分区的标签label

    -j:建立ext3格式的分区,如果使用mkfs.ext3 就不用加这个选项了

    查看磁盘超级块的信息:

        tune2fs -l /dev/sda[n]  调整ext2/ext3/ext4文件系统参数

        dumpe2fs -h /dev/sda[n]  显示ext2/ext3/ext4文件系统信息

    二.swap

    swap分区:主要是用来内存过载使用,可以和内存上暂停进程的页面保存在swap分区中,再次启用时再分配页面,pageoutswap分区:主要是用来内存过载使用,可以和内存上暂停进程的页面保存在swap分区中,再次启用时再分配页面,pageout pagein ,swap out swap in ,发现有频繁的换进和换出的时候就需要加内存。

    1.虚拟内存:

    虚拟地址:线性地址;

    页面的换进和换出,允许了内存的过载使用

    计存器1纳秒,缓存10纳秒,内存10毫秒,磁盘秒

    free 查看物理内存和交换空间使用情况

    -m

    buffers 缓冲  cached 缓存

    fdisk命令中,调整分区类型为82;

    创建交换分区:

    格式化:# mkswap /dev/sda8,先调整分区类型为82,fdisk,

    -L LABEL

    swapon /dev/sda8,启用该交换空间

    -a:启用所有的定义在/etc/fstab文件中的交换设备

    swapoff /dev/sda8

    回环设备

    loopback, 使用软件来模拟实现硬件

    创建一个镜像文件,120G,当作一个硬件设备来使用

    dd命令:

    if=数据来源

    of=数据存储目标

    bs=1

    count=2

    seek=#: 创建数据文件时,跳过的空间大小;

    dd if=/dev/sda of=/mnt/usb/mbr.backup bs=512 count=1

    dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1

    可用来备份和恢复mbr

    dd if=/dev/zero of=/var/swapfile  bs=1M count=1024

    seek 跳过多大的空间

    mkswap 格式化为swap分区

        1、通过fdisk创建swap分区或者使用dd命令创建一个虚拟内存的文件

      dd if=/dev/zero of=/tmp/swap bs=1M count=1024

    2、mkswap进行swap分区格式化

    3、swapon 激活swap分区

      swapoff 关闭swap分区

    mount:挂载命令

        命令格式:mount [-t vfstype] [-o options] device dir

    -a 挂载fstab中提到的所有文件系统

    -o remount 重新挂载已挂载的文件系统

    -o loop:用来把一个文件当成硬盘分区挂接上系统

        -o ro:采用只读方式挂接设备

        -o rw:采用读写方式挂接设备

    挂接光盘镜像文件

    1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。

            #cp /dev/cdrom /home/sunky/mydisk.iso 或

            #dd if=/dev/cdrom of=/home/sunky/mydisk.iso

    2、挂载光盘镜像文件

        #mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom

    三.自动挂载

    文件系统的配置文件/etc/fstab

    OS在初始时,会自动挂载此文件中定义的每个文件系统

    要挂载的设备 挂载点 文件系统类型 挂载选项 转储频率(每多少天做一次完全备份) 文件系统检测次序(只有根可以为1)

    /dev/sda5 /mnt/test ext4 defaults 0 0

    mount -a:挂载/etc/fstab文件中定义的所有文件系统

    /etc/fstab文件  实现开机自动挂载

        设备  挂载点  文件系统类型  挂载参数  是否执行备份命令dump  是否启动使用fsck扫描磁盘

    fuser: 验正进程正在使用的文件或套接字文件

    -v: 查看某文件上正在运行的进程

    -k:

    -m:针对目录,也就是挂载点,一般和-k 一起使用

    fuser -km MOUNT_POINT:终止正在访问此挂载点的所有进程

    wodim --devices 查看设备名(没有挂载的光盘)

    练习:

    1、创建一个5G的分区,文件系统为ext4,卷标为MYDATA,块大小为1024,预留管理空间为磁盘分区的3%,要求开机后可以自动挂载至/data目录,并且自动挂载的设备要使用卷标进行引用;

    2、创建一个本地回环文件/var/swaptemp/swapfile来用于swap,要求大小为512MB,卷标为SWAP-FILE,且开机自动启用此交换设备;

    # mkdir /var/swaptemp

    # dd if=/dev/zero of=/var/swaptemp/swapfile bs=1M count=512

    # mkswap LABLE=SWAP-FILE /var/swaptemp/swapfile

    /etc/fstab

    /var/swaptemp/swapfile  swap swap defaults 0 0

    3、上述第一问,如何让其自动挂载的同时启用ACL功能;

    /etc/fstab

    LABEL='MYDATA' /data ext4 defaults,acl 0 0

    Linux: 查看VFS结构图

    VFS:virtual filesystem  ,interface:system call

    当前,除了Linux标准的文件系统Ext2/Ext3/Ext4外,还有很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,

    网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。

    linux通过叫做VFS的中间层对这些文件系统提供了完美的支持。

    VFS存在的意义

            1. 向上,对应用层提供一个标准的文件操作接口;

            2. 对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;

            3. VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,

        使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;

            4. 此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单

            VFS 是一种软件机制,也许称它为 Linux 的文件系统管理者更确切点,与它相关的数据结构只存在于物理内存当中。

    所以在每次系统初始化期间,Linux 都首先要在内存当中构造一棵 VFS 的目录树(在 Linux 的源代码里称之为 namespace),

    实际上便是在内存中建立相应的数据结构。

    VFS: virtual filesystem  中间层

    每个分区都是一个单独的文件系统

    物理和逻辑之间的关系

    相关文章

      网友评论

          本文标题:9、磁盘及文件系统

          本文链接:https://www.haomeiwen.com/subject/kgpbhftx.html