马哥博客作业第五周

# 本章内容
#  磁盘存储和文件系统
##设备文件
    一切皆文件:open(), read(), write(), close()
    设备文件:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信
    设备号码:
    主设备号:major number, 标识设备类型
    次设备号:minor number, 标识同一类型下的不同设备
    设备类型:
    块设备:block,存取单位“块”,磁盘
    字符设备:char,存取单位“字符”,键盘
##硬盘接口类型
    IDE:133MB/s,并行接口,早期家用电脑
    SCSI:640MB/s,并行接口,早期服务器
    SATA:6Gbps,SATA数据端口与电源端口是分开的,即需要两条线,一条数据线,一条电源线
    SAS:6Gbps,SAS是一整条线,数据端口与电源端口是一体化的,SAS中是包含供电线的,而
    SATA中不包含供电线。SATA标准其实是SAS标准的一个子集,二者可兼容,SATA硬盘可以插入
    SAS主板上,反之不成
    USB:480MB/s
    M.2:
    注意:速度不是由单纯的接口类型决定,支持Nvme协议硬盘速度是最快的
    硬盘存储术语 CHS
    head:磁头 磁头数=盘面数
    track:磁道 磁道=柱面数
    sector:扇区,512bytes
    cylinder:柱面 1柱面=512 * sector数/track*head数=512*63*255=7.84M
    CentOS 5 之前版本 Linux 以柱面的整数倍划分分区,CentOS 6之后可以支持以扇区划分分区
##磁盘分区
    为什么分区:

    优化I/O性能
    实现磁盘空间配额限制
    提高修复速度
    隔离系统和程序
    安装多个OS
    采用不同文件系统

    分区方式

    MBR:Master Boot Record,1982年,使用32位表示扇区数,分区不超过2T
    划分分区的单位:
    CentOS 5 之前按整柱面划分
    CentOS 6 版本后可以按Sector划分
    0磁道0扇区:512bytes
     446bytes: boot loader
     64bytes:分区表,其中每16bytes标识一个分区
         2bytes: 55AA
    MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
    MBR分区:主和扩展分区对应的1--4,/dev/sda3,逻辑分区从5开始,/dev/sda5

    GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区,使用64位,支持8Z(
    512Byte/block )64Z ( 4096Byte/block)
    使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表自动备份在头和尾两份,
    并有CRC校验位
    UEFI (Unified Extensible Firmware Interface 统一可扩展固件接口)硬件支持GPT,使得操作系统可以
    启动

##管理分区
    设备识别
    echo '- - -' > /sys/class/scsi_host/host{0,1,2}/scan
    设备分区
    创建文件系统
    标记文件系统
    在/etc/fstab文件中创建条目
    挂载新的文件系统
    列出块设备    lsblk
    创建MBR分区    fdisk
    创建GPT分区    gdisk
    高级分区操作    parted
    重新设置内存中的内核分区表版本    partprobe
##parted命令
    parted的操作都是实时生效的,小心使用
    parted[选项]... [设备 [命令 [参数]...]...]
    #创建磁盘标签
    parted /dev/sdb mklabel gpt|msdos

    #显示/dev/sdb的分区表
    parted /dev/sdb print

    #创建主分区,从1M~200M,共199M
    parted /dev/sdb mkpart primary 1 200 (默认M)

    #删除第1个分区
    parted /dev/sdb rm 1

    #列出分区信息
    parted –l 

##fdisk(gdisk) -l [-u] [device…] 分区工具
    fdisk /dev/sdb 管理分区

    子命令:
    p 分区列表
    t 更改分区类型
    n 创建新分区
    d 删除分区
    v 校验分区
    u 转换单位
    w 保存并退出
    q 不保存并退出

    同步分区表

    centos7查看内核是否已经识别新的分区
    cat /proc/partitions
    centos6通知内核重新读取硬盘分区表
    新增分区用
    partx -a /dev/DEVICE
    kpartx -a /dev/DEVICE -f: force
    删除分区用
    partx -d --nr M-N /dev/DEVICE
    CentOS 5,7: 使用partprobe
    partprobe [/dev/DEVICE]
##文件系统

    文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的
    方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统
    从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进
    行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的
    存取,安全控制,日志,压缩,加密等
    支持的文件系统:
    各种文件系统:https://en.wikipedia.org/wiki/Comparison_of_file_systems

    主要介绍ext4和xfs
    创建文件管理工具
    mkfs命令:
    (1) mkfs.FS_TYPE /dev/DEVICE
     ext4
     xfs
     btrfs
     vfat
    (2) mkfs -t FS_TYPE /dev/DEVICE
     -L 'LABEL' 设定卷标
    mke2fs:ext系列文件系统专用管理工具
    -t {ext2|ext3|ext4|xfs} 指定文件系统类型
    -b {1024|2048|4096} 指定块 block 大小
    -L ‘LABEL’ 设置卷标
    -j 相当于 -t ext3, mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
    -i   # 为数据空间中每多少个字节创建一个inode;不应该小于block大小
    -N # 指定分区中创建多少个inode
    -I 一个inode记录占用的磁盘空间大小,128---4096
    -m # 默认5%,为管理人员预留空间占总空间的百分比
    -O FEATURE[,...] 启用指定特性
    -O ^FEATURE 关闭指定特性

    blkid 可以查看块设备属性信息
    格式:
    blkid [OPTION]... [DEVICE]
    常用选项:
    -U UUID 根据指定的UUID来查找对应的设备
    -L LABEL 根据指定的LABEL来查找对应的设备
    e2label:管理ext系列文件系统的LABEL

    findfs :查找分区
    findfs [options] LABEL=<label>
    findfs [options] UUID=<uuid>
    
    tune2fs:重新设定ext系列文件系统可调整参数的值
    -l 查看指定文件系统超级块信息;super block
    -L 'LABEL’ 修改卷标
    -m # 修预留给管理员的空间百分比
    -j 将ext2升级为ext3
    -O 文件系统属性启用或禁用, –O ^has_journal
    -o 调整文件系统的默认挂载选项,–o ^acl
    -U UUID 修改UUID号

    dumpe2fs:显示ext文件系统信息,将磁盘块分组管理
    -h:查看超级块信息,不显示分组信息

    块组描述符表(GDT)
    ext文件系统每一个块组信息使用32字节描述,这32个字节称为块组描述符,所有块组的块组描述符组
    成块组描述符表GDT(group descriptor table)。虽然每个块组都需要块组描述符来记录块组的信息和属
    性元数据,但是不是每个块组中都存放了块组描述符。将所有块组的块组信息组成一个GDT保存,并将该
    GDT存放于某些块组中,类似存放superblock和备份superblock的块
## 文件系统检测和修复
    注意:一定不要在挂载状态下执行下面命令修复
    fsck: File System Check
    fsck.FS_TYPE
    fsck -t FS_TYPE 
    注意:FS_TYPE 一定要与分区上已经文件类型相同
    -a 自动修复
    -r 交互式修复错误
    e2fsck:ext系列文件专用的检测修复工具
    -y 自动回答为yes
    -f 强制修复
    -p 自动进行安全的修复文件系统问题
    xfs_repair:xfs文件系统专用检测修复工具
    -f 修复文件,而设备
    -n 只检查
    -d 允许修复只读的挂载设备,在单用户下修复 / 时使用,然后立即reboot    
##挂载
    挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为。把设备关联挂载点:
    mount 设备名 挂载点
    卸载:为解除此关联关系的过程
    卸载时:可使用设备,也可以使用挂载点
    umount 设备名|挂载点
    挂载点下原有文件在挂载完成后会被临时隐藏
    挂载点目录一般为空
    挂载方法:mount 设备名 挂载点
    通过查看/etc/mtab文件显示当前已挂载的所有设备

    mount [-fnrsvw] [-t vfstype] [-o options] device dir
    device:指明要挂载的设备;dir:挂载点
    (1) 设备文件:例如/dev/sda5或/dev/sr0
    (2) 设置卷标:
    -L 'LABEL' : 例如 -L ‘MYDATA’
    (3) 设置UUID
    -U 'UUID' :例如 -U ‘0c50523c-43f1-45e7-85c0-a126711d406e’
    (4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
    事先存在,建议使用空目录

    mount命令
    -t vsftype    指定要挂载的设备上的文件系统类型
    -r    readonly只读挂载
    -w    read and write, 读写挂载
    -n    不更新/etc/mtab,mount不可见
    -a    自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
    -L 'LABEL'    以卷标指定挂载设备
    -U 'UUID'    以UUID指定要挂载的设备
    -B    –bind 绑定目录到另一个目录上
    -o options    (挂载文件系统的选项),多个选项使用逗号分隔
    async    异步模式 sync 同步模式,内存更改时,同时写磁盘
    atime/noatime    包含目录和文件
    diratime/nodiratime    目录的访问时间戳
    auto/noauto    是否支持自动挂载,是否支持-a选项
    exec/noexec    是否支持将文件系统上运行应用程序
    dev/nodev    是否支持在此文件系统上使用设备文件
    suid/nosuid    是否支持suid和sgid权限
    remount    重新挂载
    ro    只读
    rw    读写
    user/nouser    是否允许普通用户挂载此设备,/etc/fstab使用
    acl    启用此文件系统上的acl功能
    loop    使用loop设备
    defaults    相当于rw, suid, dev, exec, auto, nouser, async
    查看内核追踪到的已挂载的所有设备
    cat /proc/mounts

    查看挂载情况
    findmnt MOUNT_POINT|device

    查看正在访问指定文件系统的进程
    lsof MOUNT_POINT
    fuser -v MOUNT_POINT

    终止所有在正访问指定的文件系统的进程
    fuser -km MOUNT_POINT

    卸载
    umount DEVICE
    umount MOUNT_POINT

    使用mount -a 命令挂载/etc/fstab中的所有文件系统

##文件挂载配置文件
    /etc/fstab每行定义一个要挂载的文件系统
    设备文件
    LABEL:LABEL=""
    UUID:UUID=""
    伪文件系统名称:proc, sysfs

    文件系统类型:ext4,xfs,iso9660,nfs,none
        挂载选项:defaults ,acl,bind
    转储频率:0:不做备份 1:每天转储 2:每隔一天转储
    fsck检查的文件系统的顺序:允许的数字是0 1 2
    0:不自检
    1:首先自检;一般只有rootfs才用
    2:非rootfs使用
    处理交换文件和分区
    swap交换分区是系统RAM的补充,Swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据时会将数据写入 swap 分区
    当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。配置过多 swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露
    推荐系统 swap 空间

##挂载swap分区
    基本设置包括:
    •创建交换分区或者文件
    •使用mkswap写入特殊签名
    •在/etc/fstab文件中添加适当的条目
    •使用swapon -a 激活交换空间
    启用swap分区
    swapon [OPTION]... [DEVICE]
    禁用swap分区
    swapoff [OPTION]... [DEVICE]
    [OPTION]    注释
    -a    激活所有的交换分区
    -p PRIORITY    指定优先级
    /etc/fstab 在第4列中:pri=value

    SWAP的优先级
    可以指定swap分区0到32767的优先级,值越大优先级越高
    如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一
    先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)
    优化性能:分布存放,高性能磁盘存放
##移动介质
    挂载意味着使外来的文件系统看起来如同是主目录树的一部分
    访问前,介质必须被挂载
    摘除时,介质必须被卸载
    按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软盘、USB等等)
    挂载点通常在/media 或/mnt下

    使用光盘
    在图形环境下自动启动挂载/run/media/<user>/<label>
    否则就必须被手工挂载
    mount /dev/cdrom /mnt/
    操作光盘:
    eject 弹出光盘
    eject -t 弹入光盘

    创建ISO文件
    cp /dev/cdrom /root/centos.iso
    mkisofs -r -o /root/etc.iso /etc

    刻录光盘
    wodim –v –eject centos.iso
    挂载USB介质
    查看USB设备是否识别
    lsusb
    被内核探测为SCSI设备
    •/dev/sdaX、/dev/sdbX或类似的设备文件
    在图形环境中自动挂载
    •图标在[计算机]窗口中创建
    •挂载在/run/media/<user>/<label>
    手动挂载
    mount /dev/sdb1 /mnt
    常见工具 df du dd
    文件系统空间占用等信息的查看工具
    df [OPTION]... [FILE]...

    [OPTION]    注释
    -H    以1000而非1024为单位(1M=1000K)
    -T    文件系统类型
    -h    显示单位
    -i    显示inode值
    -P    以Posix兼容的格式输出
    查看某目录总体空间占用状态
    du [OPTION]... DIR

    [OPTION]    注释
    -h    显示单位(K/M/G)
    -s    摘要
    --max-depth=#    指定最大目录层级
    dd 命令:转换和复制文件
    dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#

    解释    
    if=file    从所命名文件读取而不是从标准输入
    of=file    写到所命名的文件而不是到标准输出
    bs=size    block size, 指定块大小(既是是ibs也是obs)
    count=n    复制n个bs
    ibs=size    一次读size个byte
    obs=size    一次写size个byte
    cbs=size    一次转化size个byte
    skip=blocks    从开头忽略blocks个ibs大小的块
    seek=blocks    从开头忽略blocks个obs大小的块
    conv=conversion[,conversion...]    用指定的参数转换文件
    conversion    转换参数:
    ascii    转换 EBCDIC 为 ASCII
    ebcdic    转换 ASCII 为 EBCDIC
    lcase    把大写字符转换为小写字符
    ucase    把小写字符转换为大写字符
    nocreat    不创建输出文件
    noerror    出错时不停止
    notrunc    不截短输出文件
    sync    把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
    fdatasync    写完成前,物理写入输出文件
    示例:备份MBR
    dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
    破坏MBR中的bootloader
    dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
    有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,实现如下
    dd if=fileA of=fileB skip=64 bs=1Bytes count=128
    dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

    备份:

    #将本地的/dev/sda整盘备份到/dev/sdy
    `dd if=/dev/sda of=/dev/sdy`

    #将/dev/sdx全盘数据备份到指定路径的image文件
    dd if=/dev/sdx of=/path/to/image
    
    #备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
    dd if=/dev/sdx | gzip >/path/to/image.gz
    1
    2
    3
    4
    5
    6
    7
    8
    恢复:
    
    #将备份文件恢复到指定盘
    dd if=/path/to/image of=/dev/sdx
    
    #将压缩的备份文件恢复到指定盘
    gzip -dc /path/to/image.gz | dd of=/dev/sdx
    1
    2
    3
    4
    5
    拷贝内存资料到硬盘
    
    #将内存里的数据拷贝到root目录下的mem.bin文件
    `dd if=/dev/mem of=/root/mem.bin bs=1024`
    1
    2
    从光盘拷贝iso镜像
    
    #拷贝光盘数据到root文件夹下,并保存为cd.iso文件
    dd if=/dev/cdrom of=/root/cd.iso
    1
    2
    销毁磁盘数据
    
    #利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行
    dd if=/dev/urandom of=/dev/sda1
    1
    2
    得到最恰当的block size
    通过比较dd指令输出中命令的执行时间,即可确定系统最佳的block size大小
    
    dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
    dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000
    dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000
    1
    2
    3
    测试硬盘写速度
    
    dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
    1
    测试硬盘读速度
    
    dd if=/root/1Gb.file bs=64k | dd of=/dev/null

posted @ 2020-04-19 20:32  Lotus333  阅读(127)  评论(0)    收藏  举报