zoukankan      html  css  js  c++  java
  • linux备忘录-文件系统管理

    Extx 文件系统原理

    block group

    每个分区(partition)的组成为 boot sector -> block group -> block group -> block group -> ...

    而每个block group的组成为 super block -> 文件系统描述 -> 区块对应表(block bitmap) -> inode对应表(inode bitmap) -> inode Table -> Data Block

    文件系统描述

    描述每个block group开始和结束的block号码。以及每一个区段(superblock、bitmap、inodemap、datablock)分别介于哪一个block号码之间。

    block bitmap

    用于描述block的使用情况,哪些block为空,哪些block已经在使用。

    inode bitmap

    用于描述inode的使用情况,哪些inode没在用,哪些inode已经在使用。

    通过dumpe2fs观察文件系统

    dumpe2fs [-bh] 装置文件名
    dumpe2fs -h 仅列出superblock的数据

    superblock inode block

    1. superblock 记录文件系统的整体信息,如inode/block的总量、使用量、剩余量、以及文件系统的格式和相关信息。

    superblock记录着

    1. block和inode的总量。
    2. 未使用和已经使用的block和inode数量。
    3. block和inode的大小
    4. 文件系统的挂载时间,最近一个写入数据的时间,最近一个检查硬盘的时间。
    5. 文件系统是否被挂载的标志 valid bit。未挂载为0、挂载为1。
      一般,superblock的大小为1024bytes。
      除了第一个block goup具有superblock,其他不一定具有superblock。若其他blockgroup有,则只是**对superblock的备份。
    • block
    1. inode 记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的block号

    inode 记录着

    1. 档案的权限 rwx
    2. 档案的拥有者和群组
    3. 档案的容量
    4. 档案的三个时间ctime,atime,mtime
    5. 档案的特殊权限 SUID、SGID、SBIT
    6. 档案真正的内容指向,指向block区
      inode的大小和数量在格式化后就不能变。
      每个inode的大小为128bytes。
      每个档案占用一个inode。
      文件系统能够建立的档案数量与inode的数量有关。
      inode记录block号码的区域定义为12个直接、一个间接、一个双间接和一个三间接记录区。
      block直接为 -> 数据block
      block间接为 -> 间接block -> 数据block
      block双间接为 -> 间接block -> 间接block -> 数据block
      block三间接为 -> 间接block -> 间接block -> 间接block -> 数据block
    1. block 实际记录档案的内容,若档案太大,会占用多个block

    每个block的大小可以为1kB2KB4kB
    原则上,block的大小和数量格式化后就不能改变。
    每个block只能放置一个档案的内容。
    档案大会占用多个block,档案小会占用一个block,并浪费block其余空间。

    文件与目录

    目录

    每个目录的block记录着目录下的文件名和对应的inode号

    日志文件系统

    例如,文档创建开始记录日志,文档创建结束记录日志,这种方式有利于数据一致性检查

    挂载相关

    硬盘的文件系统目录树 结合的方式称为 挂载。文件系统必须挂载到目录树的某个目录后,才能被使用。

    文件系统最顶层目录的inode号 一般为 2

    通过ls -l /lib/modules/$(uname -r)/kernel/fs 可以查看linux支持的文件系统

    通过cat /proc/filesystems 可以查看linux目前加载的文件系统。

    VFS(virtual filesystem switch) 会帮助我们管理文件系统。

    iso的挂载和制作

    iso的挂载

    通过命令 mount -o loop /tmp/xx.iso /mnt 进行挂载。

    制作大档案进行挂载(制作iso映像)

    dd if=/dev/zero of=/home/loopdev bs=1M connt=512 制作/home/loopdev大小为512M的档案,内容为空。
    if 指定 input file
    of 指定 output file
    bs 指定每个block的大小
    count 指定有多少个block

    然后进行格式化
    mkfs -t ext3 /home/loopdev

    然后进行挂载
    mount -o loop /home/loop/dev /media/cdrom

    查看过载情况
    df 或 mount

    建立 swap partition

    1. 通过fdisk分割磁盘块,并需要修改system id

    通过 fdisk的 t 修改系统ID

    1. 通过mkswap进行格式化

    mkswap /dev/hdc7
    free

    1. 通过swapon将swap启动

    swapon /dev/hdc7
    free

    1. 通过free观察内存的用量
    2. 通过swapoff关掉swap file

    知识点

    数据更改后只会从clean变成dirty,数据从内存到硬盘是异步的。可通过sync命令同步写入到硬盘。

    linux会将常用的档案或数据放在主存储器的缓冲区,以加快文件系统的读写,因此linux的物理内存最后都会别用光。

    挂载注意:

    单一文件系统不应该重复挂载到不同挂载点。
    单一目录不应该重复挂载多个文件系统。
    挂载点目录理论上应该为空目录。

    挂载的一些限制:

    根目录/必须挂载,而且必须先于其他挂载点挂载。
    挂载点必须为已经建立的目录
    挂载点同一时间只能挂载一次
    partition同一时间只能挂载一次
    不能再挂载点目录进行取消挂载

    目录 /etc/fstab/etc/mtab 是开机挂载相关的目录

    /etc/fstab 后面的两个数字的意义
    第一个数字 是否进行dump备份

    0 不做dump备份
    1 每天进行dump备份
    2 不定日期进行dump备份
    第二个数字 是否以fsck检查扇区
    0 不检查
    1 最早被检验
    2 检验,不是最早,一般根目录设定为1最早进行检验。

    通过 mount -a/etc/fstab 进行测试,否则影响开机
    通过 df 查看 挂载信息。

    单人模式下根目录 是只读的。可通过 mount -n -o remount,rw / 重新挂载改成读写。

    linux支持的文件系统在 /lib/modules/$(uname -r)/kernel/fs
    /etc/filesystems 系统指定的测试挂载文件系统类型
    /proc/filesystems 系统已经加载的文件系统类型 d

    当通过ls /dev下面的装置时,group后面的是 major号minor号。可以称为主装置号和次装置号。例如

    /dev/hda major为 3 minor为 0~63
    /dev/hdb major为 3 minor为 64~127
    /dev/sda major为 8 minor为 0~15
    /dev/sdb major为 8 minor为 16~31

    基本上,linux2.6之后,硬件文件名都能被系统实时产生。要手动处理装置档案,可通过 mknod命令

    文件系统命令

    1. dumpe2fs (观察文件系统的各部分,superblock inode block等)
    2. df (查看目前挂载的装置,查看整体磁盘使用量)

    df -h 以GB、MB等方式显示
    df -h /etc 查看/etc的可用磁盘容量。
    df -ih 显示可用的inode数量。

    1. e2fsck (进行数据一致性检查,inode bitmap、block bitmap、superblock等元数据的一致性)
    2. sync (在内存中dirty的数据同步写入硬盘)
    3. du (查看文件系统磁盘使用量,默认以kB为单位)

    du -a 档案的容量也列举出来
    du -s /* 目录的容量

    1. ln (制作链接档)

    ln srcfile dst_linkfile 创建硬链接
    ln -s srcfile dst_linkfile 创建软链接
    硬链接不占用inode和block,软链接占用inode和block
    du -sd;df -i 查看当前目录的总大小和inode使用情况

    1. fdisk (进行磁盘分区,仅对装置起作用,只有root才能执行)

    df / 找出根目录所在磁盘
    fdisk /dev/sda 对/dev/sda进行操作
    fdisk -l 列出所有装置的分区情况

    1. partprobe (强制让核心重新捕捉partition table)

    在fdisk进行分区后使用

    1. mkfs (格式化分区 make file system)

    mkfs [-t 文件系统格式] 装置文件名

    1. mke2fs (自定义格式户分区)

    mke2fs -b [1024|2048|4096] 指定block大小
    mke2fs -j 创建ext3文件系统,默认为ext2
    mke2fs -L LABEL 设定文件系统的label
    mke2fs -i size 设定每多少字节分配一个inode

    1. fsck (进行文件系统检测修复)

    fsck -t type 指定文件系统类型
    fsck -A 依据/etc/fstab的内容,对需要的装置扫描一遍。
    fsck -a 自动修复,不需要老按y
    fsck -C 扫描过程中使用直方图显示进度
    fsck -f 强制检查clean的地方
    最好在卸载情况下扫描

    1. mount (挂载命令)

    mount -a 根据/etc/fstab对未挂载的文件系统进行挂载
    mount -l 显示目前的挂载信息,及label
    mount -t type 指定文件系统类型
    mount -n 默认会将挂载信息写入/etc/mtab,-n则不写入
    mount -L 通过label进行挂载
    mount -o 后接挂载参数
    mount 装置文件名 挂载点
    mount /dev/sda5 /mnt
    mount -t iso9660 /dev/cdrom /media 挂载光盘
    mount -t vfat /dev/fd0 /media 挂载软盘
    mount -p loop /root/xxx.iso /mnt 挂载iso映像文件。
    fdisk -l 找出U盘的装置文件名
    mount -t vfat -o iocharset=cp950 /dev/sda1 /mnt/flash 挂载U盘,不能是NTFS格式
    mount -o remount,rw,auto / 重新挂载根目录,并加入参数rw,auto
    mount --bind /home /mnt/home 将某个目录挂载到其他目录
    mount -L "LABEL" /mnt 通过Label进行挂载
    挂载参数 -o
    async/sync 设定磁盘是否以异步方式运作,默认为async异步
    auto/noauto 是否注定测试挂载
    rw/ro 设定读写还是只读
    exec/noexec 设定是否可执行
    user/nouser 是否允许用户通过mount挂载
    suid/nosuid 是否允许suid的存在
    usrquota 启动文件系统支持磁盘配额
    grpquota 启动文件系统支持群组磁盘配额
    defaults 默认参数

    1. umount (取消挂载)

    umount [-fn] 装置文件名或挂载点
    umount -f 强制取消挂载
    umount -n 不更新 /etc/mtab

    1. mknod (手动设置装置档案)

    mknod 装置文件名 [bcp] [major] [minor]
    参数 b 为设定装置名称成为一个周边存储设备档案,例如硬盘。
    参数 c 为设定装置名称成为一个周边输入设备档案,例如鼠标、键盘。
    参数 p 为设定装置名称成为一个FIFO档案。
    mknod /dev/hdc10 b 22 10
    mknod /tmp/testpipe p

    1. e2label (格式化之后修改文件系统的label)

    e2label 装置文件名 newLabelName
    e2label /dev/hdc10 "my_label" 修改/dev/hdc10的LABEL为my_label
    dumpe2fs -h /dev/hdc10 可以查看文献系统的label

    1. tune2fs ()

    tune2fs [-jlL] 装置号
    tune2fs -l 类似于 dumpe2fs -h
    tune2fs -j 将ext2升级为ext3
    tune2fs -L 修改文件系统的LABEL

    1. hdparm (侦测和修改IDE接口的硬盘参数)

    hdparm -Tt /dev/sda 可以测试SATA硬盘的读取效能

    1. mkswap (格式化swap分区)
    2. swapon (加载swap分区)
    3. swapoff (卸载swap分区)
    4. parted

    parted 装置 [指定[参数]]
    parted /dev/sda print 列出分割表信息
    parted /dev/sda mkpart logical ext3 19.2GB 19.7GB //创建逻辑分区
    parted /dev/sda rm 8 删除8号分区

    其他知识点

    硬链接

    硬链接不能跨文件系统
    硬链接不能对目录进行

    参考

    鸟哥的Linux私房菜 第三版

  • 相关阅读:
    touchWX 自定义组件以及传值
    VUE 中 使用 iview Form组件 enter键防止页面刷新
    记一次vue 普通异步请求微信二进制二维码 乱码 问题解决然后渲染
    数组黑科技(偏性能方面)未完待更新...
    判断字符串是否为JSON
    C#中的static、readonly与const的比较
    C#中的分部类和分部方法:partial
    C#中使用Log4Net记录日志
    C# 利用log4net 把日志写入到数据库表中
    RabbitMQ---5、qos内存溢出+prefetch消息堵塞问题
  • 原文地址:https://www.cnblogs.com/smallpi/p/7294588.html
Copyright © 2011-2022 走看看