add more btrfs admin notes
This commit is contained in:
@@ -1,21 +1,29 @@
|
|||||||
# BTRFS
|
# BTRFS
|
||||||
|
|
||||||
- [BTRFS](#btrfs)
|
- [BTRFS](#btrfs)
|
||||||
|
- [Naming Conventions](#naming-conventions)
|
||||||
- [Creating an Array](#creating-an-array)
|
- [Creating an Array](#creating-an-array)
|
||||||
|
- [Converting an Array Between RAID Versions](#converting-an-array-between-raid-versions)
|
||||||
- [Mounting the Array](#mounting-the-array)
|
- [Mounting the Array](#mounting-the-array)
|
||||||
- [Adding Disks](#adding-disks)
|
- [Adding Disks](#adding-disks)
|
||||||
- [Replacing a Disk](#replacing-a-disk)
|
- [Replacing a Disk](#replacing-a-disk)
|
||||||
- [Scrubbing the Array](#scrubbing-the-array)
|
- [Scrubbing the Array](#scrubbing-the-array)
|
||||||
- [Creating Subvolumes](#creating-subvolumes)
|
- [Creating Subvolumes](#creating-subvolumes)
|
||||||
- [Monitoring Usage](#monitoring-usage)
|
- [Monitoring Usage](#monitoring-usage)
|
||||||
- [Encrypting BTRFS with LUKS](#encrypting-btrfs-with-luks)
|
|
||||||
- [Monitoring Disk Health](#monitoring-disk-health)
|
- [Monitoring Disk Health](#monitoring-disk-health)
|
||||||
- [Defragmenting and Compressing](#defragmenting-and-compressing)
|
- [Defragmenting and Compressing](#defragmenting-and-compressing)
|
||||||
|
- [Converting ext4 to btrfs](#converting-ext4-to-btrfs)
|
||||||
|
|
||||||
Oracle [has decent docs here](https://docs.oracle.com/en/operating-systems/oracle-linux/8/btrfs/btrfs-ResizingaBtrfsFileSystem.html)
|
Oracle [has decent docs here](https://docs.oracle.com/en/operating-systems/oracle-linux/8/btrfs/btrfs-ResizingaBtrfsFileSystem.html)
|
||||||
|
|
||||||
You'll also want to [read about btrfs compression](https://thelinuxcode.com/enable-btrfs-filesystem-compression/)
|
You'll also want to [read about btrfs compression](https://thelinuxcode.com/enable-btrfs-filesystem-compression/)
|
||||||
|
|
||||||
|
## Naming Conventions
|
||||||
|
|
||||||
|
`poolX` is my naming convention for data pools. `pool0` is the first pool you create.
|
||||||
|
|
||||||
|
`backupX` is my naming convention for backup pools. `backup0` is hte first backup pool you create.
|
||||||
|
|
||||||
## Creating an Array
|
## Creating an Array
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -39,11 +47,21 @@ btrfs device scan
|
|||||||
# Raid10
|
# Raid10
|
||||||
mkfs.btrfs --data raid10 --metadata raid10 /dev/vdb /dev/vdc /dev/vdd /dev/vde
|
mkfs.btrfs --data raid10 --metadata raid10 /dev/vdb /dev/vdc /dev/vdd /dev/vde
|
||||||
btrfs device scan
|
btrfs device scan
|
||||||
|
```
|
||||||
|
|
||||||
|
Label your arrays for easier identification in btrfs filesystem information commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
btrfs filesystem label /btrfs/pool0 pool0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Converting an Array Between RAID Versions
|
||||||
|
|
||||||
|
```bash
|
||||||
# Convert to raid1
|
# Convert to raid1
|
||||||
# -dconvert == "data convert"
|
# -dconvert == "data convert"
|
||||||
# -mconvert == "metadata convert"
|
# -mconvert == "metadata convert"
|
||||||
btrfs balance start -dconvert=raid1 -mconvert=raid1 /btrfs
|
btrfs balance start -dconvert=raid1 -mconvert=raid1 /btrfs/pool0
|
||||||
btrfs balance status
|
btrfs balance status
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -53,48 +71,59 @@ One off
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Create a mount point
|
# Create a mount point
|
||||||
mkdir /btrfs
|
mkdir /btrfs/pool0
|
||||||
|
|
||||||
|
# List the filesystem UUID
|
||||||
|
lsblk --fs
|
||||||
|
|
||||||
# Mount the top level subvolume
|
# Mount the top level subvolume
|
||||||
mount /dev/vdb /btrfs -o subvolid=5
|
mount UUID=xxxxx-xxxxx-xxxxx /btrfs/pool0 -o subvolid=5
|
||||||
|
|
||||||
# Mount with better SSD support
|
# Mount with better SSD support
|
||||||
mount /dev/vdb /btrfs -o subvolid=5,ssd
|
mount UUID=xxxxx-xxxxx-xxxxx /btrfs/pool0 -o subvolid=5,ssd
|
||||||
|
|
||||||
# Mount with auto defragmentation for HDD support
|
# Mount with auto defragmentation for HDD support
|
||||||
mount /dev/vdb /btrfs -o subvolid=5,autodefrag
|
mount UUID=xxxxx-xxxxx-xxxxx /btrfs/pool0 -o subvolid=5,autodefrag
|
||||||
|
|
||||||
# Mount a subvolume
|
# Mount a subvolume
|
||||||
mount /dev/vdb /btrfs -o subvol=home
|
mount UUID=xxxxx-xxxxx-xxxxx /btrfs/pool0 -o subvol=home
|
||||||
|
|
||||||
# Inspect
|
# Inspect
|
||||||
btrfs filesystem show /btrfs
|
btrfs filesystem show /btrfs/pool0
|
||||||
```
|
```
|
||||||
|
|
||||||
In fstab
|
In fstab
|
||||||
|
|
||||||
```conf
|
```conf
|
||||||
UUID=btrfs_uuid /btrfs btrfs defaults 0 0
|
UUID=btrfs_uuid /btrfs/pool0 btrfs defaults 0 0
|
||||||
```
|
```
|
||||||
|
|
||||||
## Adding Disks
|
## Adding Disks
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Add a disk
|
# Add a disk
|
||||||
btrfs device add /dev/vdd /btrfs
|
btrfs device add /dev/vdd /btrfs/pool0
|
||||||
|
|
||||||
|
# Balance the array
|
||||||
|
btrfs balance start /btrfs/pool0
|
||||||
|
|
||||||
# Watch the expansion
|
# Watch the expansion
|
||||||
btrfs filesystem usage /btrfs
|
btrfs filesystem usage /btrfs/pool0
|
||||||
```
|
```
|
||||||
|
|
||||||
## Replacing a Disk
|
## Replacing a Disk
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Remove a disk from the array
|
# Remove a disk from the array
|
||||||
btrfs device delete /dev/vdb /btrfs
|
# This may take a while, as btrfs will rebalance the array during this process
|
||||||
|
btrfs device remove /dev/vdb /btrfs/pool0
|
||||||
|
|
||||||
|
# You can watch the device "used" data drain with
|
||||||
|
watch btrfs filesystem show /btrfs/pool0/
|
||||||
|
|
||||||
# Add the new device
|
# Add the new device
|
||||||
btrfs device add /dev/vdg /btrfs
|
# Again, this may take a while while btrfs rebalances.
|
||||||
|
btrfs device add /dev/vdg /btrfs/pool0
|
||||||
```
|
```
|
||||||
|
|
||||||
## Scrubbing the Array
|
## Scrubbing the Array
|
||||||
@@ -103,10 +132,10 @@ btrfs device add /dev/vdg /btrfs
|
|||||||
# Start a scrub to check for errors
|
# Start a scrub to check for errors
|
||||||
# -B prevents the process from going to the background
|
# -B prevents the process from going to the background
|
||||||
# -d prints stats for each device
|
# -d prints stats for each device
|
||||||
btrfs scrub start -Bd /btrfs
|
btrfs scrub start -Bd /btrfs/pool0
|
||||||
|
|
||||||
# Check the status of a scrub
|
# Check the status of a scrub
|
||||||
btrfs scrub status /btrfs
|
btrfs scrub status /btrfs/pool0
|
||||||
|
|
||||||
# Watch for disk failures
|
# Watch for disk failures
|
||||||
dmesg | grep btrfs
|
dmesg | grep btrfs
|
||||||
@@ -116,13 +145,13 @@ dmesg | grep btrfs
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Create a new subvolume (make sure to mount /btrfs as subvolid=5)
|
# Create a new subvolume (make sure to mount /btrfs as subvolid=5)
|
||||||
btrfs subvolume create /btrfs/foo
|
btrfs subvolume create /btrfs/pool0
|
||||||
|
|
||||||
# List all subvolumes under a path
|
# List all subvolumes under a path
|
||||||
btrfs subvolume list -t /btrfs
|
btrfs subvolume list -o /btrfs/pool0
|
||||||
|
|
||||||
# Delete a subvolume
|
# Delete a subvolume
|
||||||
btrfs subvolume delete /btrfs/foo
|
btrfs subvolume delete /btrfs/pool0
|
||||||
```
|
```
|
||||||
|
|
||||||
## Monitoring Usage
|
## Monitoring Usage
|
||||||
@@ -132,55 +161,10 @@ btrfs subvolume delete /btrfs/foo
|
|||||||
btrfs filesystem show
|
btrfs filesystem show
|
||||||
|
|
||||||
# Show usage for a specific array
|
# Show usage for a specific array
|
||||||
btrfs filesystem usage /btrfs
|
btrfs filesystem usage /btrfs/pool0
|
||||||
|
|
||||||
# Quick command to filter for data used
|
# Quick command to filter for data used
|
||||||
btrfs filesystem usage /btrfs | grep 'Data.*Used'
|
btrfs filesystem usage /btrfs/pool0 | grep 'Data.*Used'
|
||||||
```
|
|
||||||
|
|
||||||
## Encrypting BTRFS with LUKS
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export KEYFILE_PATH=/root/btrfs.keyfile
|
|
||||||
export LUKS_DEVS="sdb sdc sdd sde sdf sdg sdh"
|
|
||||||
|
|
||||||
# Create a key file
|
|
||||||
dd if=/dev/urandom of=${KEYFILE_PATH} bs=128 count=1
|
|
||||||
chmod 400 ${KEYFILE_PATH}
|
|
||||||
|
|
||||||
# Create partitions
|
|
||||||
for luks_dev in $LUKS_DEVS; do
|
|
||||||
echo Creating partition for /dev/$luks_dev
|
|
||||||
parted -s -a optimal -- /dev/$luks_dev mklabel gpt mkpart primary 1MiB 100%
|
|
||||||
done
|
|
||||||
|
|
||||||
# Check that your list is good
|
|
||||||
for luks_dev in $LUKS_DEVS; do
|
|
||||||
echo will encrypt /dev/${luks_dev}1 and create /dev/mapper/luks-$(lsblk -n -o PARTUUID /dev/${luks_dev}1)
|
|
||||||
done
|
|
||||||
|
|
||||||
# Create the luks partitions
|
|
||||||
# Note that --iter-time 10000 is how long, in milliseconds, to decrypt the key
|
|
||||||
# -v is verbose
|
|
||||||
# -q is "batch mode", don't ask for confirmation
|
|
||||||
# Longer makes it harder to brute-force
|
|
||||||
for luks_dev in $LUKS_DEVS; do \
|
|
||||||
LUKS_UUID=$(lsblk -n -o PARTUUID /dev/${luks_dev}1)
|
|
||||||
LUKS_NAME=luks-${LUKS_UUID}
|
|
||||||
echo "Encrypting /dev/${luks_dev}1"; \
|
|
||||||
cryptsetup luksFormat -v -q --key-file ${KEYFILE_PATH} /dev/${luks_dev}1
|
|
||||||
echo "Unlocking /dev/${luks_dev}1 as ${LUKS_NAME}"
|
|
||||||
cryptsetup open /dev/${luks_dev}1 ${LUKS_NAME} --key-file=${KEYFILE_PATH}
|
|
||||||
echo "Adding ${LUKS_NAME} UUID=${LUKS_UUID} ${KEYFILE_PATH} discard to crypttab"
|
|
||||||
echo "${LUKS_NAME} UUID=${LUKS_UUID} none discard" >> /etc/crypttab
|
|
||||||
done
|
|
||||||
|
|
||||||
# List filesystems with UUID
|
|
||||||
lsblk --fs
|
|
||||||
|
|
||||||
# Now create the array using the /dev/mapper entries from above
|
|
||||||
mkfs.btrfs --data raid1 --metadata raid1 /dev/mapper/crypt-btrfs-vdb /dev/mapper/crypt-btrfs-vdc...
|
|
||||||
btrfs device scan
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Monitoring Disk Health
|
## Monitoring Disk Health
|
||||||
@@ -190,28 +174,39 @@ btrfs device scan
|
|||||||
```bash
|
```bash
|
||||||
# btrfs device stats shows any errors
|
# btrfs device stats shows any errors
|
||||||
# Grep for any line not ending in "0"
|
# Grep for any line not ending in "0"
|
||||||
btrfs device stats /mnt | grep -vE ' 0$'
|
btrfs device stats /btrfs/pool0 | grep -vE ' 0$'
|
||||||
|
|
||||||
# Show the device IDs for the mounted filesystem
|
# Show the device IDs for the mounted filesystem
|
||||||
btrfs filesystem show /mnt
|
btrfs filesystem show /btrfs/pool0
|
||||||
|
|
||||||
# Delete a device (with ID 8, for example)
|
# Delete a device (with ID 8, for example)
|
||||||
btrfs device delete 8 /mnt
|
btrfs device delete 8 /btrfs/pool0
|
||||||
|
|
||||||
# Add a device to the array
|
# Add a device to the array
|
||||||
btrfs device add /dev/vdi1 /mnt
|
btrfs device add /dev/vdi1 /btrfs/pool0
|
||||||
|
|
||||||
# Rebalance the array
|
# Rebalance the array
|
||||||
btrfs balance start /mnt
|
btrfs balance start --background --full-balance /btrfs/pool0
|
||||||
|
|
||||||
|
# Check the status
|
||||||
|
btrfs balance status /btrfs/pool0
|
||||||
```
|
```
|
||||||
|
|
||||||
## Defragmenting and Compressing
|
## Defragmenting and Compressing
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Defrag a filesystem
|
# Defrag a filesystem
|
||||||
btrfs filesystem defragment /mnt
|
btrfs filesystem defragment /btrfs/pool0
|
||||||
|
|
||||||
# Defrag and apply compression
|
# Defrag and apply compression
|
||||||
# zstd:20 is currently the best compression algorithm
|
# zstd:20 is currently the best compression algorithm
|
||||||
btrfs filesystem defragment -c zstd:20 /mnt
|
btrfs filesystem defragment -c zstd:20 /btrfs/pool0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Converting ext4 to btrfs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Unmount and then run btrfs-convert
|
||||||
|
umount /path/to/mount
|
||||||
|
btrfs-convert /dev/sdX1
|
||||||
```
|
```
|
||||||
Reference in New Issue
Block a user