I built my current desktop about three years ago and installed a solid-state drive (SSD). Later, I needed more storage space, so I installed a second drive—an older spindle and platter hard disk drive (HDD) that happened to be lying around. Recently, I decided to replace this HDD with an SSD.
This article walks through the steps for replacing the drive, including some commands used for identifying and configuring a drive and editing the configuration file Linux uses.
Identify drives and partitions
To begin, use the parted command with the argument -l to list the physical drives in your system.
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
You can see that my system has two drives: sda, which is an SSD, and sdb, which is an HDD. The Number column lists the partitions that exist on each drive. Each partition is referred to by number; for example, the full name of the first partition on sda is /dev/sda1, the second is /dev/sda2.
Map partitions to mount points
Now that you know the drives and their partitions, use the findmnt command to view details about each partition and where they are mounted in the filesystem.
findmnt --fstab --evaluate
The fstab option instructs findmnt to search according to the /etc/fstab file, and the evaluate option converts lengthy universally unique identifiers (UUIDs) to real device names.
# 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
In the output of findmnt, SOURCE is the partition that you can reference back to the output of the parted command from before. TARGET is the path within the filesystem where each is mounted; this is also known as the mount point.
In the output above, the swap partition shows none for its target. Verify details about your swap space using the cat command.
root@workstation:~# cat /proc/swaps Filename Type Size Used Priority /dev/sdb1 partition 4194300 0 -2
The /etc/fstab file
The /etc/fstab file is where Linux stores information about your drives, partitions, and filesystem, so it needs to be edited anytime you make changes to any of them. Now that you have identified the current drives, partitions, and mount points in your system, find these items in your fstab file.
# /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
The fstab file name is short for "filesystems table." The columns are numbered from left to right:
- file system represents the disk partition. In the olden days of yore, the actual low-level hardware path (like what is output from the parted command, i.e., /dev/sda1) would have been placed here. Today, all partitions are given a UUID, which is now the preferred way to refer to them. This is highlighted by the note at the top of the file. As the note says, you can view your system UUIDs with the blkid command. Use the -s argument to display only the UUID of each device.
# blkid -s UUID /dev/sdb1: UUID="bad318c8-e095-4870-a8bb-c54f5488f569" /dev/sda1: UUID="87B5-E1AE" /dev/sda2: UUID="818aad1c-fcfc-4be8-9de8-ff6963383fe1"
- mount point represents the location within the Linux filesystem where the partition is mounted.
- type describes the partition's filesystem format. Linux supports many types; some common ones are ext3, ext4, and XFS, and there are many more. I used JFS for a long time.
- options govern how a partition is mounted. For example, the options ro and rw determine whether it is mounted as read-only or read-write. Another common option is noatime, which is used to disable updating of file access times, usually to improve disk I/O performance.
- dump is used by the dump utility to determine if the filesystem needs to be dumped. A setting of zero means no. This feature is not used much these days.
- pass is used by fsck to determine the order that filesystems will be checked for errors at boot time. A setting of 0 disables the check and skips the filesystem. Generally, the root (/) filesystem should be set to 1 so that it will be checked first.
Now that you have an understanding of the drives in your system and how they are mounted, you can begin the process of replacing the HDD.
Replacing the HDD
A good plan is to install the new SSD, copy the files on the HDD to the SSD, and then remove the HDD. You want ultimately to mount the SSD at the same point as the HDD, so any applications that rely on this path won't be broken.
Install the new drive
First, shut down the computer and unplug the power supply cable to avoid the risk of shock damage to either the computer or yourself. Next, temporarily install the SSD and connect it to a power cable.
Then, connect the data cable between the new drive and an open SATA connector on the motherboard. After everything is connected securely, plug the system power in and turn on the computer.
Next, verify that the system recognizes the new drive in your computer's BIOS or Unified Extensible Firmware Interface (UEFI). The key or keystroke combination to enter the system BIOS or UEFI varies by computer manufacturer. Usually, modern computers will automatically detect drives and other devices that are attached to the system, so there is probably nothing that needs to be changed. That was my case; my system sees the new drive as SATA SSD.
After verifying that all drives are detected and displayed by the system, reboot and let Linux load. Then, make sure that Linux recognizes the drive by repeating the parted command. The command parted -l shows that I have three drives installed: sda, sdb, and sdc. Here's the output for my new sdc drive:
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
This output lists the partition table as msdos and indicates there are two existing partitions; this is because I am using an SSD that was previously used in another system. This will all change once the drive is reformatted for its new life.
Prepare the new SSD
After confirming that Linux identifies the new SSD, use the parted command again—but this time to reconfigure the drive. In my case, I changed the partition table to GPT, which is newer. I also created a new partition for general storage using the XFS filesystem. You won't need to delete the existing partitions first because they will automatically be deleted when the new partition table, also called label, is changed and saved.
Set the partition table
Enter the command: 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.
Use the mklabel command to change the partition table or label to gpt. You will be warned that this action will destroy all existing data on the disk. Answer yes.
(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
You can verify changes to the drive configuration using the print command. You'll also notice that all partitions are gone.
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
Create a partition
You can create new partitions using the mkpart command. I created just one partition since I plan to use the entire drive for extra storage space.
The print free command is also useful for displaying the free space on a drive. Because I don't have any partitions defined, the entire 240GB is available.
(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
I'll name the partition storage and set the filesystem type to xfs. Since I have just one partition, I specify the start and end of the partition to use the entire available free space using percentages. This can be done with a one-line command.
mkpart storage xfs 0% 100%
Then, confirm with the print command.
(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
When you quit parted, you will be informed that the /etc/fstab file may need to be updated.
(parted) quit Information: You may need to update /etc/fstab.
Format the partition
Next, format the new Linux partition with the xfs filesystem using mkfs.xfs.
The new drive is formatted completely. As I mentioned earlier, it's currently standard to refer to a partition with its UUID rather than the physical device path. Therefore, determine the UUID of the new partition with blkid.
# blkid -s UUID /dev/sdc1: UUID="d98abe0a-f641-4331-a3dc-b89ebc60bfb5"
Copy the files
The new drive is formatted and ready to be mounted into the system. But the process of replacing another drive with this one isn't quite that simple. First, both drives must be mounted simultaneously to copy files from the old drive to the new one.
To do this, mount the new drive on a temporary mount point, copy the files, and then unmount both drives. Why? So you can mount the new drive at the same mount point where the old drive was mounted in order to preserve the path. In case there are applications with that path configured, it's just simpler this way.
# mkdir /mnt/newssd # mount UUID="d98abe0a-f641-4331-a3dc-b89ebc60bfb5" /mnt/newssd # cp -avT /raptor/ /mnt/newssd/
Use diff to verify the copy's success.
diff -rqy /raptor/ /mnt/newssd/
Remove the old HDD
Unmount both drives
Now that the new drive contains all of the old files, remount it in place of the old drive. First, unmount both drives.
# umount /dev/sdc1 # umount /dev/sdb2
Turn off swap
Since the old drive will no longer be used as a swap device, disable it with the swapoff command.
# swapoff /dev/sdb1
If you repeat the cat /proc/swaps command, it will no longer list this partition.
Update the fstab file
Go back to the /etc/fstab file; there are a few changes that you need to make. I advise making a backup of the file before editing it.
cp -a /etc/fstab /etc/fstab.backup
In the line for the /raptor mount point, replace the UUID with that of the new drive; replace the filesystem, ext4, with xfs; and add discard to the options. It should appear like this:
UUID=d98abe0a-f641-4331-a3dc-b89ebc60bfb5 /raptor xfs defaults,noatime,discard 0 2
Disable swap permanently by editing the /etc/fstab file and commenting or deleting the swap line.
# UUID=dc8b85ac-0439-4b60-9867-58eb69b7f88d none swap sw 0 0
Swap space can be mounted on another drive or partition if it is still needed. In this case, rather than removing this line, just replace the UUID the same way you did when setting up the new drive.
After saving the fstab file, run mount to re-mount based on the changes.
root@workstation:~# mount -av / : ignored /boot/efi : already mounted /raptor : successfully mounted
Finally, shut down the computer and remove the HDD that will no longer be used. Then power up and check that the system has booted correctly and that all drives are mounted as expected. In addition to the additional storage space, I also notice a performance gain and noise reduction.
Comments are closed.