如何在 Linux 上更换硬盘

需要更多(或更快)的存储空间?无缝地将旧的硬盘驱动器更换为新的固态驱动器。
125 位读者喜欢这篇文章。
How Linux got to be Linux: Test driving 1993-2003 distros

互联网档案馆图书图片。由 Opensource.com 修改。CC BY-SA 4.0

大约三年前,我组装了现在的台式电脑,并安装了一个固态驱动器 (SSD)。后来,我需要更多的存储空间,所以我安装了第二个驱动器——一个碰巧闲置在那里的旧式主轴和盘片硬盘驱动器 (HDD)。最近,我决定用 SSD 更换这个 HDD。

本文介绍了更换驱动器的步骤,包括用于识别和配置驱动器以及编辑 Linux 使用的配置文件的命令。

识别驱动器和分区

首先,使用带有参数 -lparted 命令列出系统中的物理驱动器。

root@workstation:~# parted -l
Model: ATA Samsung SSD 850 (scsi)
Disk /dev/sda: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name                  Flags
 1      1049kB  538MB  537MB   fat32        EFI System Partition  boot, esp
 2      538MB   495GB  494GB   ext4


Model: ATA WDC WD1500HLFS-0 (scsi)
Disk /dev/sdb: 150GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name              Flags
 1      1049kB  4296MB  4295MB  linux-swap(v1)  Linux swap
 2      4296MB  150GB   146GB   ext4            Linux filesystem

您可以看到我的系统有两个驱动器:sda,这是一个 SSD,以及 sdb,这是一个 HDD。Number 列列出了每个驱动器上存在的分区。每个分区都用数字表示;例如,sda 上第一个分区的完整名称是 /dev/sda1,第二个是 /dev/sda2

将分区映射到挂载点

现在您已经知道驱动器及其分区,请使用 findmnt 命令查看有关每个分区的详细信息以及它们在文件系统中的挂载位置。

findmnt --fstab --evaluate

fstab 选项指示 findmnt 根据 /etc/fstab 文件进行搜索,而 evaluate 选项将冗长的通用唯一标识符 (UUID) 转换为实际的设备名称。

# findmnt --fstab --evaluate
TARGET        SOURCE    FSTYPE OPTIONS
/             /dev/sda2 ext4   errors=remount-ro,noatime,discard
/boot/efi     /dev/sda1 vfat   umask=0077,noatime,discard
none          /dev/sdb1 swap   sw
/raptor       /dev/sdb2 ext4   defaults,noatime

findmnt 的输出中,SOURCE 是您可以参考回之前 parted 命令输出的分区。TARGET 是每个分区在文件系统中的挂载路径;这也称为挂载点

交换空间

在上面的输出中,交换分区的目标显示为none。使用 cat 命令验证有关交换空间的详细信息。

root@workstation:~# cat /proc/swaps
Filename				Type		Size	Used	Priority
/dev/sdb1               partition	4194300	0	    -2

/etc/fstab 文件

/etc/fstab 文件是 Linux 存储有关您的驱动器、分区和文件系统信息的位置,因此每当您对它们进行任何更改时,都需要编辑它。现在您已经识别了系统中的当前驱动器、分区和挂载点,请在 fstab 文件中找到这些项。

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>   <dump>  <pass>
UUID=818aad1c-fcfc-4be8-9de8-ff6963383fe1 /         ext4    errors=remount-ro,noatime,discard   0 1
UUID=87B5-E1AE                            /boot/efi vfat    umask=0077,noatime,discard          0 1
UUID=dc8b85ac-0439-4b60-9267-58eb69b7f88d none      swap    sw                                  0 0
UUID=bad318c8-e095-4870-a8bb-c54f5488f569 /raptor   ext4    defaults,noatime                    0 2

fstab 文件名是“文件系统表”的缩写。列从左到右编号

  1. 文件系统 表示磁盘分区。在很久以前,实际的底层硬件路径(例如 parted 命令的输出,即 /dev/sda1)会放在这里。如今,所有分区都分配了一个 UUID,这现在是引用它们的首选方式。文件顶部的注释突出了这一点。正如注释所说,您可以使用 blkid 命令查看系统 UUID。使用 -s 参数仅显示每个设备的 UUID。
    # blkid -s UUID
    /dev/sdb1: UUID="bad318c8-e095-4870-a8bb-c54f5488f569"
    /dev/sda1: UUID="87B5-E1AE"
    /dev/sda2: UUID="818aad1c-fcfc-4be8-9de8-ff6963383fe1"
  2. 挂载点 表示分区在 Linux 文件系统中的挂载位置。
  3. 类型 描述了分区的文件系统格式。Linux 支持多种类型;一些常见的类型是 ext3、ext4 和 XFS,还有更多。我长期使用 JFS。
  4. 选项 控制分区的挂载方式。例如,选项 rorw 确定它是以只读还是读写方式挂载。另一个常见的选项是 noatime,它用于禁用文件访问时间的更新,通常是为了提高磁盘 I/O 性能。
  5. dump 由 dump 实用程序使用,以确定文件系统是否需要转储。设置为零表示否。此功能现在使用不多。
  6. passfsck 使用,以确定在启动时检查文件系统错误的顺序。设置为 0 将禁用检查并跳过文件系统。通常,根 (/) 文件系统应设置为 1,以便首先对其进行检查。

现在您已经了解了系统中的驱动器以及它们的挂载方式,您可以开始更换 HDD 的过程了。

更换 HDD

一个好的计划是安装新的 SSD,将 HDD 上的文件复制到 SSD,然后移除 HDD。您最终希望将 SSD 挂载到与 HDD 相同的挂载点,这样任何依赖此路径的应用程序都不会被破坏。

安装新驱动器

首先,关闭计算机并拔下电源线,以避免对计算机或您自己造成电击损坏的风险。接下来,临时安装 SSD 并将其连接到电源线。

New SSD cables and drive

然后,将数据线连接到新驱动器和主板上的开放 SATA 连接器之间。一切连接牢固后,插入系统电源并打开计算机。

接下来,验证系统是否在计算机的 BIOS 或统一可扩展固件接口 (UEFI) 中识别出新驱动器。进入系统 BIOS 或 UEFI 的按键或组合键因计算机制造商而异。通常,现代计算机将自动检测连接到系统的驱动器和其他设备,因此可能不需要进行任何更改。我的情况就是这样;我的系统将新驱动器识别为 SATA SSD

System BIOS detected drives

在验证系统检测并显示所有驱动器后,重新启动并让 Linux 加载。然后,通过重复 parted 命令确保 Linux 识别该驱动器。命令 parted -l 显示我安装了三个驱动器:sda、sdb 和 sdc。这是我的新 sdc 驱动器的输出

Model: ATA SATA SSD (scsi)
Disk /dev/sdc: 240GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1075MB  1074MB  primary  ext4         boot
 2      1075MB  240GB   239GB   primary               lvm

此输出将分区表列为 msdos,并指示存在两个现有分区;这是因为我使用的是以前在另一个系统中使用的 SSD。一旦驱动器为新的生命周期重新格式化,这一切都将改变。

准备新的 SSD

在确认 Linux 识别出新的 SSD 后,再次使用 parted 命令——但这次是重新配置驱动器。在我的情况下,我将分区表更改为 GPT,这是更新的。我还使用 XFS 文件系统创建了一个新的分区用于通用存储。您无需先删除现有分区,因为当新的分区表(也称为标签)被更改和保存时,它们将自动被删除。

设置分区表

输入命令:parted /dev/sdc

# parted /dev/sdc
GNU Parted 3.2
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.

使用 mklabel 命令将分区表或标签更改为 gpt。您将收到警告,此操作将销毁磁盘上的所有现有数据。回答是。

(parted) mklabel gpt
Warning: The existing disk label on /dev/sdc will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? y

您可以使用 print 命令验证对驱动器配置的更改。您还会注意到所有分区都已消失。

Model: ATA SATA SSD (scsi)
Disk /dev/sdc: 240GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags

创建分区

您可以使用 mkpart 命令创建新分区。我只创建了一个分区,因为我计划将整个驱动器用于额外的存储空间。

print free 命令也很有用,用于显示驱动器上的可用空间。因为我没有定义任何分区,所以整个 240GB 都是可用的。

(parted) print free
Model: ATA SATA SSD (scsi)
Disk /dev/sdc: 240GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name  Flags
        17.4kB  240GB  240GB  Free Space

我将分区命名为 storage,并将文件系统类型设置为 xfs。由于我只有一个分区,因此我指定分区的开始和结束位置以使用整个可用空间,方法是使用百分比。这可以用一行命令完成。

mkpart storage xfs 0% 100%

然后,使用 print 命令确认。

(parted) print
Model: ATA SATA SSD (scsi)
Disk /dev/sdc: 240GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name     Flags
 1      1049kB  240GB  240GB  xfs          storage

当您退出 parted 时,您将收到通知,可能需要更新 /etc/fstab 文件。

(parted) quit
Information: You may need to update /etc/fstab.

格式化分区

接下来,使用 mkfs.xfsxfs 文件系统格式化新的 Linux 分区。

mkfs.xfs /dev/sdc1

新驱动器已完全格式化。正如我之前提到的,目前标准的做法是使用分区的 UUID 而不是物理设备路径来引用分区。因此,使用 blkid 确定新分区的 UUID。

# blkid -s UUID

/dev/sdc1: UUID="d98abe0a-f641-4331-a3dc-b89ebc60bfb5"

复制文件

新驱动器已格式化并准备好挂载到系统中。但是用这个驱动器更换另一个驱动器的过程并没有那么简单。首先,必须同时挂载两个驱动器,以便将文件从旧驱动器复制到新驱动器。

为此,将新驱动器挂载到临时挂载点,复制文件,然后卸载两个驱动器。为什么?这样您就可以将新驱动器挂载到旧驱动器挂载的同一挂载点,以便保留路径。如果某些应用程序配置了该路径,这样做会更简单。

# mkdir /mnt/newssd
# mount UUID="d98abe0a-f641-4331-a3dc-b89ebc60bfb5" /mnt/newssd
# cp -avT /raptor/ /mnt/newssd/

使用 diff 验证复制是否成功。

diff -rqy /raptor/ /mnt/newssd/

移除旧 HDD

卸载旧驱动器

现在新驱动器包含所有旧文件,请将其重新挂载以替换旧驱动器。首先,卸载两个驱动器。

# umount /dev/sdc1
# umount /dev/sdb2

关闭交换

由于旧驱动器将不再用作交换设备,请使用 swapoff 命令禁用它。

# swapoff /dev/sdb1

如果您重复 cat /proc/swaps 命令,它将不再列出此分区。

更新 fstab 文件

回到 /etc/fstab 文件;您需要进行一些更改。我建议在编辑文件之前对其进行备份。

cp -a /etc/fstab /etc/fstab.backup

/raptor 挂载点的行中,将 UUID 替换为新驱动器的 UUID;将文件系统 ext4 替换为 xfs;并在选项中添加 discard。它应该如下所示

UUID=d98abe0a-f641-4331-a3dc-b89ebc60bfb5 /raptor  xfs  defaults,noatime,discard  0 2

通过编辑 /etc/fstab 文件并注释掉或删除交换行来永久禁用交换。

# UUID=dc8b85ac-0439-4b60-9867-58eb69b7f88d none  swap  sw  0 0

如果仍然需要交换空间,则可以将其挂载在另一个驱动器或分区上。在这种情况下,与其删除此行,不如像设置新驱动器时一样替换 UUID。

保存 fstab 文件后,运行 mount 以根据更改重新挂载。

root@workstation:~# mount -av
/                        : ignored
/boot/efi                : already mounted
/raptor            : successfully mounted

最后,关闭计算机并移除将不再使用的 HDD。然后开机并检查系统是否已正确启动,以及所有驱动器是否已按预期挂载。除了额外的存储空间,我还注意到性能提升和噪音降低。

接下来阅读什么
标签
Alan Formy-Duval Opensource.com Correspondent
Alan 拥有 20 年的 IT 经验,主要在政府和金融部门。他最初是一名增值经销商,之后转行从事系统工程。Alan 的背景是高可用性集群应用程序。他撰写了 Oracle Press/McGraw Hill 出版的《Oracle Solaris 11 系统管理》一书中的“用户和组”以及“Apache 和 Web 堆栈”章节。

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.