Skip to content

查看容量

df

  • df 查看磁盘容量【disk filesystem
    • -h 以易读方式查看
bash
df -h

du

  • du [目录] 查看指定目录及其子目录的容量,如果不指定则查看当前目录及其子目录的容量【disk usage
    • -h 以易读方式查看
    • -b 以文件中的字节大小来显示文件容量
    • -a 查看所有文件【包括隐藏文件】
    • -d * 指定查看目录的深度
    • -s 只查看当前目录【也就是深度为 0】
bash
du -sh

 只查看0级目录的信息【只查看目录本身】
du -hd 0 ~

磁盘管理

dd 复制

[!hint] cpdd 对比,不能复制哪些文件 ? cp 只复制文件内容,不能复制:

  • 元数据【创建时间,修改时间……】
  • 硬链接和软链接【快捷方式】【cp 只能复制快捷方式背后的文件
  • 设备文件【设备文件是对系统中物理设备(硬盘,键盘,鼠标……)的抽象】
  • 文件权限和所有权
  • 磁盘的引导扇区和分区表
  • 按照指定的块大小直接复制磁盘的原始内容

`dd` 的命令行选项格式为 `选项=值`,而不是 `-选项 值`

输入源,输出源

  • dd 从标准输入【键盘】中读取数据,并将数据写入到标准输出【屏幕】【默认】【data description
    • if=输入文件 从文件中读取数据
    • of=输出文件 写入数据到指定文件
bash
 从键盘读取的数据写入到 "test" 文件中,只读取和写入一次,一次是10字节
dd of=test bs=10 count=1

dd if=/dev/stdin of=/dev/stdout bs=10 count=1

复制时处理数据

  • dd
    • conv=值 转换字节序,在 ASCII 与 EBCDIC 编码间互换……
      • lcase 将英文字符转为小写
      • ucase 将英文字符转为大写
      • ascii 将 EBCDIC 编码转为 ASCII 编码
bash
 将英文字符转换为大写再写入test文件
dd of=test bs=10 count=1 conv=ucase

磁盘概念

[!quote] 外部设备

  • 字符设备:以字节流为单位进行数据传输【键盘,鼠标……】
  • 块设备:数据存储设备,以一定大小的数据块为单位进行数据的读写【硬盘,USB 驱动器,CD-ROM……】,可以随机访问存储介质上任意位置的数据,并且可以进行缓存操作

[!quote] loop 设备 loop 设备使得文件可以如同块设备一般被访问,而 /dev/loop 是用来管理 loop 设备的伪设备

在使用 loop 设备之前,需要将其与一个实际存在的文件进行关联【使用 mount

一个目录如果被用作挂载点,原来在这个目录下的文件就会被隐藏起来,无法直接访问,因为此时访问这个目录,就是在访问挂载的文件系统,而不是原来的目录内容

虚拟磁盘操作

创建虚拟磁盘镜像

  • 使用 dd 创建空的虚拟磁盘镜像
bash
 从 `/dev/zero` 设备创建一个容量为 256M 的内容全是零字节的文件
dd if=/dev/zero of=virtual.img bs=1M count=256

du -h virtual.img
256M    virtual.img

格式化虚拟磁盘镜像

[!quote] 格式化虚拟磁盘镜像 格式化虚拟磁盘镜像 就是将文件系统写入到虚拟磁盘镜像中

  • 使用 mkfsmake filesystem
bash
 "virtual.img" 文件格式化为 ext4 文件系统
mkfs -t ext4 virtual.img

挂载磁盘

[!hint] 挂载

  • 在 Linux 中,所有的文件和目录都是从根目录 / 开始的一颗大树【文件系统】,它们都必须挂载到这颗树上的某个节点【目录】才能被访问
  • 根目录 / 在系统启动时自动挂载
  • 当我们插入一个 USB,或其他可移动存储设备时,操作系统会自动执行 mount,把这个设备挂载到文件系统的某个目录下,让我们可以访问这个设备中的文件
  • 将磁盘挂载到目录树
    • mount 查看主机已经挂载的文件系统
    • mount 参数 文件系统源 挂载点
      • -o 设备类型 指定要挂载的设备类型【文件,物理设备……】
      • -t 文件系统类型 指定要挂载的文件系统的类型
      • --ro 以只读方式挂载
      • --rw 以读写模式挂载
bash
 查看主机已经挂载的文件系统
mount

---
 输出结果:最前面是设备名,on 后面是挂载点,type 后面是文件系统类型,最后面是挂载选项【在挂载时设定以只读方式挂载……】
tmpfs on /sys/firmware type tmpfs (ro,relatime)
……
bash
 挂载虚拟磁盘镜像到 `/mnt`,是一个loop文件设备,不是物理设备
mount -o loop -t ext4 virtual.img /mnt
 也可以省略挂载类型,很多时候 mount 会自动识别

 以只读方式挂载
mount -o loop --ro virtual.img /mnt

卸载磁盘

  • umount 已挂载的设备名/挂载点
bash
umount /mnt

磁盘分区

  • fdisk
bash
 查看硬盘分区表信息
fdisk -l

 进入磁盘分区模式
fdisk virtual.img

建立镜像与 loop 设备的关联

  • losetup
bash
 如果提示设备忙你也可以使用其它的回环设备
losetup /dev/loop0 virtual.img

 解除设备关联
losetup -d /dev/loop0

然后再使用 mkfs 格式化各分区,不过格式化之前,我们还要为各分区建立虚拟设备的映射,用到 kpartx 工具,需要先安装:

bash
sudo apt-get install kpartx
sudo kpartx -av /dev/loop0

 取消映射
sudo kpartx -dv /dev/loop0

接着再是格式化,我们将其全部格式化为 ext4:

bash
sudo mkfs.ext4 -q /dev/mapper/loop0p1
sudo mkfs.ext4 -q /dev/mapper/loop0p5
sudo mkfs.ext4 -q /dev/mapper/loop0p6

格式化完成后在 /media 目录下新建四个空目录用于挂载虚拟磁盘:

bash
mkdir -p /media/virtualdisk_{1..3}
bash
 挂载磁盘分区
sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3

 卸载磁盘分区
sudo umount /dev/mapper/loop0p1
sudo umount /dev/mapper/loop0p5
sudo umount /dev/mapper/loop0p6

然后:

bash
df -h