Part III: Repartitioning the SSD Drive?
OK, I probably didn’t need to do this, but I thought it may be nice to have separate partitions for logging files, OS, user area, and for “data”, which was going to be where shared disk space would come from. In any case, here are the gruesome details of what I did, for those interested…
Here is the layout that I was interested in doing:
Partition | Purpose |
/dev/sda1 | Unaltered original boot partition, about 256-512 MB. |
/dev/sda2 | Root partition setup for 100GB. |
/dev/sda3 | Will be /var and setup for 90GB. |
/dev/sda5 | For /tmp, limited to 2GB. |
/dev/sda6 | For /home dir, using 8GB. |
/dev/sda7 | Mounted as /var/lib/longhorn to be used for cluster shared storage. Rest of disk space. |
First, I used my SD card that had Ubuntu OS on it and inserted that into the powered off system. I disconnected the network interface, so the “host” on the SD card would not conflict with systems already deployed. I ensured that the keyboard and HDMI display were connected, because all the work would need to be done from the local console.
Next, I unplugged the USB jumper that connects the SSD drive to the Raspberry PI4. I booted the system, and it looked for USB drive and then eventually SD drive and booted. It took a while, because I had the network disconnected. If you have a unique hostname/IP setup on the SD card, you could likely leave the network connected (and could paste in commands from this blog using an SSH connection).
Once up and I logged in, I inserted the USB jumper, so that the SSD drive is seen as an external drive. The SD card appears as /dev/mmcblk0p1 and /dev/mmcblk0p2 for the “fd” command, but the SSD drive is not there. I did a “sudo su”, as there are several commands to run as root. When I do “fdisk -l”, I can see the SSD drive as /dev/sda.
The first thing to be done, is to check the file system(otherwise the mount will fail and fsck cannot be run to fix mismatched free blocks in partition table) and then resize /dev/sda2:
e2fsck -f /dev/sda2 resize2fs /dev/sda2 100G
Next, run “fdisk /dev/sda” and use the “p” command to see the current partitions. There should be /dev/sda1 as a 256-512MB partition and /dev/sda2 with the remainder of the space of the drive. Delete partition #2 using the “d” command and “2”.
Created a new primary partition with “n”, “p”, “2”(default). Accepted the default FIRST sector, and for the LAST sector, enter “+100G”. When asked if the ext4 signature should be removed, you can enter “N”.
Create another new primary partition, “n”, “p”, “3”, accepted the default FIRST sector, and used “+90GB” for the LAST sector. That’s it for primary partitions, so we’ll now create an extended partition #4 with “n”, “e”, and accept the defaults. That gives around a 741-743 GB partition.
Now, you can create logical partitions with “n”, accepting the FIRST sector, and specifying the size as the LAST sector. We’ll create partition #5 that is “+2G”, partition #6 that is “+8G”, and finally partition #7 that accepts the defaults for FIRST and LAST to use the rest of the disk (about 730GB).
If you make any mistakes, you can do a “p” command to see the partitions, use the “d” command to delete mistakes, and then recreate the partitions as needed. This is all in memory for now. I print out the partitions one more time to make sure they look OK:
Command (m for help): p Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors Disk model: 2115 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 33553920 bytes Disklabel type: dos Disk identifier: 0x5036de4e Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 526335 524288 256M c W95 FAT32 (LBA) /dev/sda2 526336 210241535 209715200 100G 83 Linux /dev/sda3 210241536 398985215 188743680 90G 83 Linux /dev/sda4 398985216 1953525167 1554539952 741.3G 5 Extended /dev/sda5 398987264 403181567 4194304 2G 83 Linux /dev/sda6 403183616 419960831 16777216 8G 83 Linux /dev/sda7 419962880 1953525167 1533562288 731.3G 83 Linux
When things look OK, use the “w” command to write the partition table. Finally, use the “partprobe /dev/sda” command. I did a “shutdown -h 0”, removed the SD card, and reconnected the ethernet cable, and powered the Pi back on. You can ssh in and will see /dev/sda1 and /dev/sda2 with the desired sizes. Do “sudo su” so that you can run several commands as root.
Now it is time to set the partition types for all the other partitions:
mkfs -t ext4 /dev/sda3 mkfs -t ext4 /dev/sda4 mkfs -t ext4 /dev/sda5 mkfs -t ext4 /dev/sda6 mkfs -t ext4 /dev/sda7
Now we want to move some filesystems over to the new partitions. Create mount points and mount most of the new partitions:
mkdir -p /mnt/home /mnt/tmp /mnt/root /mnt/var mount /dev/sda2 /mnt/root mount /dev/sda3 /mnt/var mount /dev/sda5 /mnt/tmp mount /dev/sda6 /mnt/home
Use rsync to move things over from the current file system:
rsync -aqxP /mnt/root/var/* /mnt/var rsync -aqxP /mnt/root/tmp/* /mnt/tmp rsync -aqxP /mnt/root/home/* /mnt/home
The originals can now be removed:
cd /mnt/root rm -rf var home tmp cd
Using the “blkid” command, you can see the UUIDs for each of the new partitions. Edit /etc/fstab and add on the new mount points with their corresponding UUIDs:
UUID=W /var ext4 defaults 0 2 UUID=X /tmp ext4 defaults 0 2 UUID=Y /home ext4 defaults 0 2 UUID=Z /var/lib/longhorn ext4 defaults 0 2
Where W is the UUID for /dev/sda3, X is the UUID for /dev/sda5, Y is the UUID for /dev/sda6, and Z is for /dev/sda7.
Finally, you can unmount all the partitions with the following and then reboot the system and check that the partitions are OK:
umount /dev/sda2 /dev/sda3 /dev/sda5 /dev/sda6
Not that you will have to give it time to shutdown and then restart. You can check the console with monitor attached. Mine took quite a while, I think because it was wrapping up upgrades from “sudo apt-get update -y && sudo apt-get upgrade -y” that I had done earlier. Just be patient.
After the system rebooted, I could see the partitions are mounted with “df -h”:
Filesystem Size Used Avail Use% Mounted on tmpfs 781M 3.0M 778M 1% /run /dev/sda2 99G 2.1G 93G 3% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sda6 7.8G 1.4M 7.4G 1% /home /dev/sda3 89G 1.7G 82G 3% /var /dev/sda5 2.0G 96K 1.8G 1% /tmp /dev/sda1 505M 125M 381M 25% /boot/firmware tmpfs 781M 4.0K 781M 1% /run/user/1000
Side Note
One thing to note with the UCTRONICS OLED status display and the repartitioning. The app that controls the display reports disk usage at 107%. I haven’t looked at it yet, but whatever it is using to determine disk space is not accounting for the change due to partitioning (it was fine before the partitioning). Fortunately, it is a simple Python app and the source is provided, so I can make some changes, maybe to report multiple “partitions”.