HowTo Create A GPT Disk With EFI System And exFAT Partitions Using Parted
Contents
Overview
The purpose of this article is to create a disk that can be read / written to by all major operating systems (i.e., macOS, Windows and Linux). A removable USB storage device containing SSD SATA or NVMe media formatted with an exFAT partition can be used to accomplish this. At the time of this writing, January 02, 2020, a removable USB-C drive containing a CORSAIR FORCE Series MP500 120GB NVMe storage device will be demonstrated.
The USB drive is attached to an NST system as device: "/dev/sdc". The parted disk utility will be used to create a GUID Partition Table (GPT) disk label, the EFI System Partition and the exFAT partition. GPT partitioning allows one to use all available disk space for disk drives that exceed 2TB in size. The is one of the limitations for legacy MBR partitioning.
The following diagram is an example GUID Partition Table layout:
Zero Out Previous Disk Label - Optional
This optional step will zero out any previous disk label. We will use the dcfldd utility. The first 1GB of the disk will be zeroed out:
[root@shopper2 ~]# dcfldd if=/dev/zero of=/dev/sdc statusinterval=64 bs=1M count=1k; 1024 blocks (1024Mb) written. 1024+0 records in 1024+0 records out [root@shopper2 ~]#
We can now used parted to examine the disk and see that we are starting out with an "unrecognized" disk structure:
[root@shopper2 ~]# /sbin/parted -s /dev/sdc print; Error: /dev/sdc: unrecognised disk label Model: JM583 (scsi) Disk /dev/sdc: 120GB Sector size (logical/physical): 512B/512B Partition Table: unknown Disk Flags: [root@shopper2 ~]#
Create GPT Disk Label
The GPT disk label will now be created:
[root@shopper2 ~]# parted /dev/sdc; GNU Parted 3.2 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel gpt (parted) quit Information: You may need to update /etc/fstab. [root@shopper2 ~]# /sbin/parted -s /dev/sdc print; Model: JM583 (scsi) Disk /dev/sdc: 120GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags [root@shopper2 ~]#
Create EFI System Partition
A new EFI System Partition will be created using the following commands (the recommended size is at least 260 MiB):
[root@shopper2 ~]# parted /dev/sdc; GNU Parted 3.2 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mkpart primary fat32 1MiB 261MiB (parted) set 1 esp on (parted) print Model: JM583 (scsi) Disk /dev/sdc: 120GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 274MB 273MB fat32 primary boot, esp (parted) quit Information: You may need to update /etc/fstab. [root@shopper2 ~]#
Create exFAT Partition
A new exFAT partition will now be created using the remaining unused disk area:
[root@shopper2 ~]# parted /dev/sdc; GNU Parted 3.2 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: JM583 (scsi) Disk /dev/sdc: 120GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 274MB 273MB primary boot, esp (parted) mkpart primary ntfs 261MiB 100% (parted) print Model: JM583 (scsi) Disk /dev/sdc: 120GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 274MB 273MB primary boot, esp 2 274MB 120GB 120GB ntfs primary (parted) quit Information: You may need to update /etc/fstab. [root@shopper2 ~]# /sbin/parted -s /dev/sdc print; Model: JM583 (scsi) Disk /dev/sdc: 120GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 274MB 273MB primary boot, esp 2 274MB 120GB 120GB primary msftdata [root@shopper2 ~]#
Format exFAT Partition
Use the "mkfs.exfat" command to format the exFAT file system:
[root@shopper2 ~]# mkfs.exfat -L NVMe /dev/sdc2 mkexfatfs 1.3.0 Creating... done. Flushing... done. File system created successfully. [root@shopper2 ~]#
The "lsblk" command shows the newly created exFAT file system with label:
[root@shopper2 ~]# /bin/lsblk -a -o name,label,size,fstype,model /dev/sdc; NAME LABEL SIZE FSTYPE MODEL sdc 111.8G USB3.1_NVME_DISK ├─sdc1 260M └─sdc2 NVMe 111.5G exfat [root@shopper2 ~]#
Summary
The newly formatted disk can now be read / written to by all major operating systems (i.e., macOS, Windows and Linux).
Alternate exFat Partition Interoperability
This section will show the steps on how to create an entire exFAT partition on a USB flash drive so that all major OSs (i.e., i.e., macOS, Windows and Linux) can mount and use the data on the drive.
- Discover the target USB drive to create the exFAT partition. In this case it will be "/dev/sda"
[root@dell7480 ~]# fdisk -l Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors Disk model: FPI512MWR7 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: B276CCFE-BD35-4510-9E92-B6E44CEEFAE8 Device Start End Sectors Size Type /dev/nvme0n1p1 2048 1230847 1228800 600M EFI System /dev/nvme0n1p2 1230848 3327999 2097152 1G Linux filesystem /dev/nvme0n1p3 3328000 1000214527 996886528 475.4G Linux filesystem Disk /dev/zram0: 8 GiB, 8589934592 bytes, 2097152 sectors Units: sectors of 1 * 4096 = 4096 bytes Sector size (logical/physical): 4096 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/sda: 57.3 GiB, 61530439680 bytes, 120176640 sectors Disk model: SanDisk 3.2Gen1 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
- Use
[root@dell7480 ~]# fdisk /dev/sda Welcome to fdisk (util-linux 2.36.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x997a9a9d. Command (m for help): d No partition is defined yet! Command (m for help): g Created a new GPT disklabel (GUID: 7D769FCD-8E49-9944-B4BA-C418633F0C4E).
Command (m for help): n Partition number (1-128, default 1): First sector (2048-120176606, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-120176606, default 120176606): Created a new partition 1 of type 'Linux filesystem' and of size 57.3 GiB. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. [root@dell7480 ~]#