growing an EFI System Partition (ESP)

(This is a recipe. If you find errors or think of improvements, please let me know.) == context == The ESP is the partition to hold anything the UEFI firmware can run. Mostly bootloaders but also diagnostics and firmware updates. It is a FAT filesystem in a partition with a special type. In a running Linux, it is usually mounted on /boot/efi. This stuff is a little bit tricky and not well-documented. I tried to be very detailed to make sure you don't get lost. == motivation == The ESP doesn't have to be very big, but sometimes it isn't big enough. I often buy computers pre-loaded with Windows -- typically cheaper than computers without Windows. Sometimes the ESP is 100MB. This has pinched. So I want to increase the size. I have a feeling that 200MB would be a good size, but I will probably settle on 400MB. == naive method and a failure == Tools: - a live USB Linux system. [You don't want to be doing partition surgery on the disk from which you are running.] - some place to temporarily hold the contents of the ESP. It could be on another partition of the same disk or on a USB devicee. - gparted for partition manipulation. You could substitute with something like parted(8). - gnome "disks" (gnome-disk-utility). I find it convenient for mounting, unmounting, and looking at the properties of disks and partition. You can choose to do these things with other tools. 1. boot the live Linux stick. 2. if your live system doesn't include gparted, install it. Fedora: "sudo dnf install gparted" debian or Ubuntu: "sudo apt install gparted" 3. run gparted and point it at the disk with the too-small ESP. Make sure that none of that disk's partitions is mounted. 3. shift and shrink partitions to make sufficient unallocated space adjacent to the ESP. If you are going to install Linux on the disk, this would be a good time to make space for it too. Make sure to tell gparted to "apply" these changes. 4. If you changed the size of any NTFS partitions, gparted might have damaged some redundant metadata. Fix it now. - boot into Windows - ask it to scan and repair the volume(s) - reboot into your live Linux system and get back into gparted 5. ask gparted to resize the ESP. It should succeed in resizing the partition but may fail in resizing the FAT filesystem. The failure message will be rather obscure: No Implementation: GNU Parted cannot resize this partition to this size. We're working on it! What it means is that libparted-fs-resize doesn't have code to deal with some common forms of FAT. The message is wrong: the partition has been resized but the filesystem it contains has not. Oh, and nobody has worked on this in a decade. If you had no failure, STOP HERE, you are done. Continuing past FAT filesystem resize failure: 1. exit gparted 2. mount the old ESP. GNOME "disks" has a button for that. 3. copy the contents of the ESP somewhere safe. It could be to a USB device or even a non-ESP partition on the system disk. "sudo cp -a ESP SAVED" ESP is the ESP mount point. SAVED is to be a new directory in the place where you have enough free space 4. unmount the old ESP 5. Make a new, larger FAT filesystem, filling the partition: "sudo mkfs.vfat X" where X is the device name of the ESP partition. On my system, it was /dev/nvme0n1p1 but yours might well be different This will wipe the old FAT filesystem and make an empty new one that fills the partition. 6. mount the new ESP 7. copy the old contents of the ESP into the new ESP. "sudo cp -a SAVED/* ESP Note: the /* bit is to avoid creating an extra directory layer in the ESP. * isn't great but FAT filesystems don't have files starting with ".". 8. shut down Linux; unplug the live stick FINI

Fedora 30 was released today. In the release notes, it talks about EFI sizes: Make the EFI System Partition at least 500MiB in size The minimum size of the EFI System Partition (ESP) created by Anaconda has changed from 200 MiB to 500 MiB. The maximum size, which is used in most cases, remains at 600 MiB. The reasons for this change include: * This partition is used to deploy firmware updates. These updates need free space of twice the SPI flash size, which will grow from 64 to 128 MiB in near future and make the current partition size too small. * The new minimum is identical with what Microsoft mandates OEMs allocate for the partition. See also: https://fedoraproject.org/wiki/Changes/BiggerESP https://github.com/rhinstaller/anaconda/pull/4711 https://github.com/rhinstaller/anaconda/pull/5081

On 07/11/2023 12:20, D. Hugh Redelmeier via talk wrote:
5. Make a new, larger FAT filesystem, filling the partition: "sudo mkfs.vfat X" where X is the device name of the ESP partition. On my system, it was /dev/nvme0n1p1 but yours might well be different This will wipe the old FAT filesystem and make an empty new one that fills the partition.
I would add a note about the flags for the partition: boot & esp (as reported by gparted). Some BIOS-es might check the flags and refuse to boot from it if not flagged. -- -- This email has been checked for viruses by Avast antivirus software. www.avast.com
participants (2)
-
Aurelian Melinte
-
D. Hugh Redelmeier