151 lines
3.7 KiB
Markdown
151 lines
3.7 KiB
Markdown
---
|
|
title: BTRFS
|
|
visible: true
|
|
---
|
|
|
|
[toc]
|
|
|
|
## Utils
|
|
|
|
`# pacman -S btrfs-progs`
|
|
|
|
## Fstab example
|
|
|
|
`UUID=2dc70a6e-b4cf-4d94-b326-0ba9f886cf49 /mnt/tmp btrfs defaults,noatime,compress-force=zstd,space_cache=v2,subvol=@ 0 0`
|
|
|
|
Options:
|
|
|
|
```
|
|
defaults -> Use whatever defaults
|
|
noatime -> Reading access to a file is not recorded
|
|
compress-force -> Send all files through the compression algorithm
|
|
space_cache -> Increases performance by mapping unallocated blocks
|
|
subvol -> Subvolume to mount
|
|
```
|
|
|
|
## Filesystem usage
|
|
|
|
Show storage allocated, used and free
|
|
`# btrfs fi usage (mountpoint)`
|
|
|
|
```
|
|
allocated: space used
|
|
unallocated: actual free space
|
|
Used: amount of data stored
|
|
Free: free storage based on "Used"
|
|
```
|
|
|
|
Start rebalance of datachunks filled less than 70%
|
|
`# btrfs balance start --b -dusage=70 -musage=70 (mountpoint)`
|
|
|
|
Check status of rebalance
|
|
`# btrfs balance status -v (mountpoint)`
|
|
|
|
## Disable CoW
|
|
|
|
Disable copy on write for folders (Only works on new files)
|
|
`$ chattr +C (path)`
|
|
|
|
## Device errors
|
|
|
|
Error counts for a given mountpoint
|
|
`# btrfs dev stat (mountpoint)`
|
|
|
|
## Compression
|
|
|
|
### Algorithms
|
|
|
|
```
|
|
zlib: Slow, but strong compression, level 1-9
|
|
lzo : Fastest, weak compression
|
|
zstd: [Recommended] Medium, newer compression standard than the others, only works on newer kernels, level 1-15
|
|
```
|
|
|
|
Enable compression for existing files
|
|
`# btrfs filesystem defragment -r -v -c(alg) (path)`
|
|
_It is impossible to specify the level of compression wanted._
|
|
|
|
Add `compress=(alg)` to `/etc/fstab`
|
|
|
|
To specify a level of compression (zlib and zstd) use `compress=(alg):(level)` in fstab.
|
|
For zstd compression it is recommended to use `compress-force=zstd:(level)`
|
|
|
|
## Subvolumes
|
|
|
|
List
|
|
`# btrfs subv list (path)`
|
|
|
|
Create
|
|
`# btrfs subv create (path)`
|
|
|
|
Mount a subvolume
|
|
`# mount -o subvol=@(subvolname) /dev/sdXX /(mountpoint)`
|
|
|
|
## Snapshots
|
|
|
|
TODO
|
|
|
|
## RAID
|
|
|
|
An array can be mounted by specifying one of its members.
|
|
`# mount /dev/sdXX /mnt`
|
|
|
|
All members of an array have the same UUID, which can be mounted through fstab.
|
|
|
|
### RAID 1
|
|
|
|
On filesystem creation
|
|
`# mkfs.btrfs -m raid1 -d raid1 /dev/sdXX /dev/sdYY`
|
|
|
|
### RAID 5
|
|
|
|
On filesystem creation
|
|
_It is recommended not to use raid5/6 for metadata yet_
|
|
`# mkfs.btrfs -m raid1 -d raid5 /dev/sdXX /dev/sdYY /dev/sdZZ`
|
|
|
|
### RAID 10
|
|
|
|
On filesystem creation
|
|
`# mkfs.btrfs -m raid10 -d raid10 /dev/sdXX /dev/sdYY /dev/sdZZ /dev/sdQQ`
|
|
|
|
### Convert to single device
|
|
|
|
First, the files have to be collected on one device.
|
|
_DUP on system and metadata should only be used on HDDs. Use single on SSDs_
|
|
`# btrfs balance start -f -sconvert=dup,devid=(id) -mconvert=dup,devid=(id) -dconvert=single,devid=(id) /(mountpoint)`
|
|
|
|
Now unused devices can be removed
|
|
`# btrfs device delete /dev/sdYY /(mountpoint)`
|
|
|
|
### Replace dying/dead device in RAID array
|
|
|
|
Show arrays that are available
|
|
`btrfs fi show`
|
|
|
|
From my testing the log has to be dropped before btrfs will mount the incomplete array
|
|
`btrfs rescue zero-log /dev/sdXX`
|
|
|
|
Mount with these options to be able to fix it
|
|
`mount -o rw,degraded /(mountpoint)`
|
|
|
|
The ID has to be replaced with the ID of the **missing** device!
|
|
`btrfs replace start -B (id) /dev/sdYY /(mountpoint)`
|
|
|
|
Query the status of the repace
|
|
`btrfs replace status /(mountpoint)`
|
|
|
|
Balance the filesystem at the end
|
|
`btrfs balance /(mountpoint)`
|
|
|
|
## Issues
|
|
|
|
### 100% CPU Usage
|
|
|
|
`btrfs-transaction` and `btrfs-cleaner` will run on a single cpu core, maxing it out with 100% load.
|
|
_TODO: Check what enabled quotas in the first place. A likely candidate is snapper_
|
|
The issue is apparently caused by using quotas in btrfs.
|
|
Check if quotas are enabled:
|
|
`# btrfs qgroup show (path)`
|
|
Disable quotas:
|
|
`# btrfs quota disable (path)`
|