一、硬盘挂载

1. 查看新添加的盘符

查看新添加的盘符, root 下使用 fdisk -l 命令

2. 格式化硬盘文件系统

格式化硬盘文件系统,可以采用 mkfs 命令。

1
2
# 格式化硬盘的文件系统,这里格式化为 ext4 系统
mkfs -t ext4 /dev/sdb

输入 y 确认后,等待系统完成格式化

3. 挂载硬盘

挂载硬盘,首先需要创建一个文件夹,随后用 mount 命令将硬盘挂载到文件夹上。

1
2
3
4
# 创建要挂载的文件夹
mkdir /data
# 挂载硬盘到该文件夹上
mount /dev/sdb /data

4. 开机自动挂载

前面仅仅实现了手动挂载,但重启后并不会自动挂载。这里需要设置自动挂载。

文件 fstab 包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件

1
2
3
4
# 进入 fstab 修改配置
vim /etc/fstab
# 在最后面加入指定信息
UUID=52ffcefa-721f-4884-85df-f38cb082d5e5 /data ext4 defaults 0 0

UUID要修改为自己的,查看硬盘分区的UUID命令

1
blkid

5. 查看挂载好的硬盘信息

1
df -hT

二、数据拷贝

1. 克隆一个完整的硬盘

从物理磁盘 /dev/sda 到物理磁盘 /dev/sdb

1
# dd if=/dev/sda of=/dev/sdb bs=512 conv=noerror,sync

这个命令会克隆整个磁盘,包括MBR(因此也包含bootloader),所有分区,UUID和数据。

  • noerror 指定dd命令继续操作,忽略所有的读错误。dd默认行为是会在任何错误时候停止
  • sync 如果有读错误,把输入的块填0,所以数据偏移在sync设置时保留
  • bs=512 设置块大小512bytes,对于硬盘来说是“经典”的块大小。只有在你的硬盘是4Kb块大小时,你才可以用4096而不是512。同时,请阅读下面的警告,因为这个不仅仅是“块大小”,它同时会影响到如何处理读错误。

要查看硬盘的物理块大小是否为 4K,可以执行以下步骤:

  1. 运行以下命令以获取硬盘设备的详细信息:

    1
    fdisk -l

    这将列出您系统上所有的硬盘设备。

  2. 找到您要检查的硬盘设备,并记录其设备名称,例如 /dev/sda

  3. 运行以下命令以获取硬盘的物理块大小:

    1
    sudo blockdev --getbsz /dev/sda

    如果您的硬盘物理块大小为 4K,则命令输出的值应该为 4096。如果输出值为其他值,则硬盘的物理块大小不是 4K。

2. 监视进程

根据磁盘大小,dd运行过程可能会耗时很长,如果想要在执行过程中查看进度,需要使用pv工具。

首先安装pv工具

1
sudo apt install pv

比如说执行命令

1
dd if=/dev/sda1 of=/home/efi.img

修改如下(加入了 | pv | dd

1
dd if=/dev/sda1  | pv | dd of=/home/efi.img

显示的效果:

1
2
root@debian:~# dd if=/dev/sda1  | pv | dd of=/home/efi.img
364MiB 0:00:13 [24.5MiB/s] [ <=> ]

3. 使用pkill打印进度

也可以使用 pkill 来显示当前进度

重新打开一个Shell,然后执行如下命令即可每秒输出一次进度信息

1
watch -n 1 pkill -USR1 -x dd

三、关于DD命令使用举例

使用dd命令时需要包含if=表示源磁盘,和of=表示目标磁盘。

1. 创建img镜像

将分区创建为镜像,并存储于/home目录下

1
# dd if=/dev/sda of=/home/sdadisk.img

2. 创建分区镜像

上述是复制整个磁盘( /dev/sda),如果只想复制某个分区,如:/dev/sda2,也是完全没问题。

同时可以使用bs参数,规定一次拷贝的字节数,如:bs=4096。合理使用bs参数可以优化dd执行速度,bs的合理范围要参考本机的性能进行具体设置。

1
# dd if=/dev/sda2 of=/home/partition2.img bs=4096

3. 还原镜像

还原镜像也很简单,原理与创建镜像相同,只需颠倒if=of=两个参数的内容即可,如:

1
dd if=sdadisk.img of=/dev/sda

4. 异地备份

可以通过与 SSH 命令组合,进行异地服务器磁盘的备份。如将远端服务器的磁盘/dev/sda备份至本地bakup.gz

1
ssh remote_user@remote_server "sudo dd if=/dev/sda | gzip -1 -" | dd of=backup.gz

其中,remote_user 是远程服务器的用户名,remote_server 是远程服务器的 IP 地址或域名。

该命令将在远程服务器上使用 sudo 权限来执行 dd 命令,并将其输出通过 SSH 传输到本地计算机。本地计算机将备份数据写入名为 backup.gz 的文件中。

  1. 等待备份完成,这可能需要一段时间,具体取决于磁盘的大小和速度。
  2. 在备份完成后,使用以下命令验证备份文件是否可用:
1
gzip -t backup.gz

如果没有任何错误消息,则备份文件已成功创建并可以使用。

gzip -1 - 命令的含义如下:

  • gzip:是一个用于压缩文件的工具。
  • -1:是压缩级别,表示压缩速度和压缩比之间的折中。值越大,压缩比就越高,但压缩时间也会越长。
  • -:表示输入文件使用标准输入,即通过管道从其他命令的输出中读取数据。

因此,将 gzip -1 - 与其他命令配合使用时,它将从其他命令的输出中读取数据,并使用压缩级别为 1 的 gzip 工具将数据压缩。压缩后的数据可以通过标准输出流发送到其他命令,也可以直接写入文件中。

5. 覆写磁盘

使用0填充整个硬盘:

1
# dd if=/dev/zero of=/dev/sda

或者,使用随机数填充整个硬盘,效果更佳:

1
# dd if=/dev/urandom of=/dev/sda