Introduction

What does the term Solid State Drive (SSD) commonly refer to?
The term SSD commonly refers to flash-based block devices.

What does flash-based technology offer compared to Hard Disk Drives (HDDs)?
Compared to HDDs, flash-based technology offers:

  • Faster access time.
  • Lower latency.
  • Silent operation.
  • Power savings.

What does flash-based technology have despite its benefits?
Despite its benefits, flash-based technology has issues which require special system attention and care.

Dealing with empty blocks

What do traditional filesystems do when deleting data?
When deleting data, traditional filesystems flag the data blocks as deleted but don't change the actual data.

What type of flash memory cell can write operations be perform on?
Write operations can be performed on empty flash memory cells.

What must be done before a write operation can be done on memory cells which are flagged as deleted but aren't empty, and what effect does it have on performance?
Before a write operation can be done on memory cells which are flagged as deleted but aren't empty, the data must be erased which causes the performance to be slower.

What other effect is there by keeping data that's flagged as deleted?
The other effect there is by keeping data that's flagged as deleted is less available empty cells.

What is possible with modern kernels in dealing with empty blocks?
In dealing with empty blocks, it is possible to hint the deleted, not-used data blocks to the SSD.

What is the mechanism called which hints the deleted, not-used data blocks to the SSD?
The mechanism that hints the deleted, not-used data blocks to the SSD is called discard.

What are the names for the different implementations of the discard mechanism?
The names for the different implementations of the discard mechanism are:

  • TRIM for ATAPI.
  • UNMAP for SCSI.
  • Deallocate for NVMe.

What is required in order to use discard?
In order to use discard, filesystem support is required.

What modern filesystems support discard?
The modern filesystems that support discard include:

  • ext4.
  • XFS.
  • btrfs.
  • bcachefs.

What traditional filesystems have had discard support added to them?
The traditional filesystems which have had discard support added to them include:

  • FAT.
  • NTFS.

What are the two basic approaches to issue the discard command to the SSD?
The two basic approaches to issue the discard command to the SSD are:

  1. Using mount -o discard for continuous discard.
  2. Making periodic calls with the fstream utility.

What should you keep in mind with the two approaches of issuing the discard command?
With the two approaches of issuing the discard command, you should keep in mind that not all filesystems support both.

Slowing wear out

What causes wear to a NAND flash cell?
Wear to a NAND flash cell is caused by each write operation.

What doesn't cause wear to a NAND flash cell?
Wear to a NAND flash cell isn't caused by read operations.

What's a basic method for increasing the lifespan of a Solid State Drive (SSD)?
A basic method for increasing the lifespan of an SSD is to uniformly distribute write operations across all blocks.

What is the method of distributing write operations across all blocks in a Solid State Drive (SSD) called?
The method of distributing write operations across all blocks in an SSD is called wear leveling.

How is wear leveling deployed?
Wear leveling is deployed with SSD firmware.

Discard (trim) support

What should be verified before performing any form of discarding on a drive?
Before performing any form of discarding on a drive, support for discarding should be verified.

What command can you use to verify if a drive supports discard?
The command you can use to verify if a drive supports discard is:

lsblk --discard

What do you check for in the output of the lsblk --discard command to verify that a drive supports discard?
To verify that a drive supports discard, check for non-zero values in the DISC-GRAN and DISC-MAX columns in the output of the lsblk --discard.

Example of output from the lsblk --discard command
NAME   DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda           0      512B       2G         0
├─sda1        0      512B       2G         0
├─sda2        0      512B       2G         0
└─sda3        0      512B       2G         0
sdb           0        0B       0B         0
└─sdb1        0        0B       0B         0

Partitioning

What varies across different Solid State Drives (SSDs)?
The sizes of internal data structures, like blocks and pages, vary across different SSDs.

What should filesystem data structures not do for optimal performance?
For optimal performance, filesystem data structures shouldn't cross the boundaries of underlying SSD internal data structures.

How do you ensure that filesystem data structures don't cross the boundaries of underlying Solid State Drive (SSD) internal data structures?
To ensure that filesystem data structures don't cross the boundaries of underlying SSD internal data structures, align the start of each partition, commonly to 1 MiB.

What two partitioning utilities support partition alignment?
The two partitioning utilities that support partition alignment include:

  1. parted.
  2. fdisk.

How do you use partition alignment with parted?
To use partition alignment with parted, use the -a optimal flag.

How do you use partition alignment with fdisk?
To use partition alignment with fdisk, simply use it as it's turned on by default.

How can you check the alignment for a given partition with parted?
To check the alignment for a given partition with parted, run parted /dev/<drive>.

blkdiscard

What program can you use to discard all data blocks on an entire device?
To discard all data blocks on an entire device, you can use blkdiscard.

LVM

...

dm-crypt/LUKS

How do you allow discards to pass through full encrypted devices?
To allow discards to pass through full encrypted devices, they have to be opened by cryptsetup with the --allow-discards flag.

Opening a full encrypted drive at /dev/thing while allowing discards
cryptsetup luksOpen --allow-discards /dev/thing luks

What does enabling discards depend on if a root-device exists in the Linux Unified Key Setup (LUKS)?
If a root-device exists in the LUKS, enabling discards depends on the initramfs implementation.

What kernel option do you need to pass in order to enable discards in the generated initramfs depending on the initramfs implementation?
The kernel option that you need to pass in order to enable discards in the generated initramfs depending on the initramfs implementation is:

  • genkernel - root_trim=yes.
  • dracut - rd.luks.allow-discards.

How do you check if discard is enabled on a Linux Unified Key Setup (LUKS) device?
To check if discard is enabled on a LUKS device, run dmsetup table /dev/mapper/crypt_dev -- showkeys and check the output for the string allow_discards.

Formatting

How can you configure the filesystem to improve performance with a drive?
You can configure the filesystem to improve performance with a drive by aligning its data structures with the size of the drive's internal structures.

Configuring for erase block size

What can you do if you know the erase block size of a Solid State Drive (SSD)?
If you know the erase block size of an SSD, you can use it when creating the filesystem.

What does mkfs.ext4 apply to a drive when it is used on an average-sized partition?
On an average sized partition, mkfs.ext4 will apply 4KiB blocks to a drive.

What are the two options you use with mkfs.ext4 to set the alignment to the erase block size?
To set the alignment to the erase block size, the two options that you use with mkfs.ext4 are:

  1. -E stride=<stride in KiB>.
  2. -E stripe-width=<stripe-width in KiB>.

Since mkfs.ext4 applies 4KiB blocks to a drive, what value do you set stride and stripe-width in order for the filesystem to be aligned with the erase block size?
In order for the filesystem to be aligned with the erase block size, the value you set stride and stripe-width to is the erase block size of the drive divided by 4KiB.

Example of formatting a drive with ext4 that has a block erase size of 512KiB
mkfs.ext4 -E stride=128,stripe-width=128 /dev/sda3

...

Mounting

What is the recommended way for using discard on the rootfs?
The recommended way for using discard on the rootfs is to periodically use the fstrim utility.

What can potentially happen if you use the discard mount option with older, poorer-quality Solid State Drives (SSDs)?
If you use the discard mount option with older, poorer-quality SSDs, it can potentially cause degradation because of discard being done continuously.

What command do you run to perform a discard operation on the rootfs?
The command you run to perform a discard operation on the rootfs is:

fstrim -v /

What are the two ways you can use the fstrim command?
The two ways you can use the fstrim command are:

  1. Manually.
  2. As a periodic job to run once a week.

What are some filesystem drivers that don't support fstrim?
Some filesystem drivers that don't support fstrim include:

  • ntfs3.
  • bcachefs.

When should it be safe to mount a Solid State Drive (SSD) with the discard mount option?
It should be safe to mount an SSD with the discard mount option if the mount point is going to have a low amount of disk writes occurring on it.

When is it recommended to mount a Solid State Drive (SSD) with the discard mount option?
It is recommended to mount an SSD with the discard mount option if maintaining performance is required.

Where do you set the discard mount option for a drive?
You set the discard mount option for a drive in /etc/fstab.

What command do you run to remount all drives once /etc/fstab has been modified?
Once /etc/fstab has been modified, the command you run to remount all drives is:

mount -a
Example of using the discard mount option on a drive.
/dev/sda3          /mnt/archive          ext4          defaults,relatime,discard          0 1

cron

Example of configuring cron to run fstrim once a week on all mounted drives
# Mins  Hours  Days   Months  Day of the week   Command
15    13     *      *       1                 /sbin/fstrim --all
Example of configuring cron to run fstrim once a week on rootfs
# Mins  Hours  Days   Months  Day of the week   Command
15    13     *      *       1                 /sbin/fstrim -v /

SSDcronTRIM

...

SSDcronTRIM-LUKS

...

Without cron, on system shutdown (with OpenRC)

...

Reducing amount of writes

What limited lifetime do flash-based Solid State Drives (SSDs) have?
The limited lifetime that flash-based SSDs have is the number of writes performed.

Portage TMPDIR on tmpfs

What can theoretically reduce writes to a Solid State Drive (SSD) when building packages with Portage?
When building packages with Portage, you can theoretically reduce writes to an SSD by performing the operations in RAM by using a tmpfs or zram mount.

Temporal files on tmpfs

What can you mount desired mount points as to reduce the amount of writes and improve performance?
To reduce the amount of writes and improve performance, you can mount desired mount points as tmpfs.

Example of mounting /tmp and /var/tmp as tmpfs in /etc/fstab
# temporal mountpoints on tmpfs
tmpfs           /tmp            tmpfs           size=16G,noatime        0 0
tmpfs           /var/tmp        tmpfs           size=1G,noatime         0 0

What does systemd do automatically with /tmp?
With /tmp, systemd automatically mounts it as tmpfs by default.

What should you make sure of when mounting /var/tmp as tmpfs and why?
When mounting /var/tmp as tmpfs, you should make sure that /var/tmp is appropriately sized because Portage uses it and there will be build errors if the size is too small.

What is the alternative to tmpfs on modern, fast systems?
On modern, fast systems, the alternative to tmpfs is zram.

XDG cache on tmpfs

What programs often make frequent writes to cache?
Programs that often make frequent writes to cache include many programs that run with the X Window System.

What specification does the location of the cache directory usually adhere to?
The specification that the location of the cache directory usually adheres to is the XDG Base Directory Specification.

What is the name of the environment variable that determines the location of the cache directory under the XDG Base Directory Specification?
The name of the environment variable that determines the location of the cache directory under the XDG Base Directory Specification is XDG_CACHE_HOME.

What is the default cache location under the XDG Base Directory Specification?
The default cache location under the XDG Base Directory Specification is ~/.cache.

How do you remap the cache directory location so that it's mounted under a tmpfs?
To remap the cache directory location so that it's mounted under a tmpfs, create a script at /etc/profile.d/xdg_cache_home.sh which exports the directory under run like so:

if [ ${LOGNAME} ]; then
	export XDG_CACHE_HOME="/run/user/${UID}/cache"
fi

Web browser profile(s) and cache on tmpfs

What utility can you use to relocate web browser profiles and cache to a tmpfs?
The utility you can use to relocate web browser profiles and cache to a tmpfs is www-misc/profile-sync-daemon.

...

OpenRC

How do you set up profile-sync-daemon for systems with OpenRC?
To setup profile-sync-daemon for systems with OpenRC:

  1. Create or modify /etc/psd.conf by adding or changing the variable USERS to be ="usernames...". This variable determines which users on the system are going to have their browser profiles symlinked to a tmpfs.
  2. Close all web browsers.
  3. Run rc-update add psd default.
  4. Run rc-service psd start.

How do you view all symlinks created by profile-sync-daemon?
To view all symlinks created by profile-sync-daemon, run:

psd p

...