Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # /{user script location}/btrfs-nvme-tier.sh
- DATA_PATH="/data"
- NVME_THRESHOLD=75 # Start tiering when NVMe hits 75% full
- SSD_ADDED_FLAG="/var/lib/btrfs-ssd-added"
- # Function to check NVMe space usage
- get_nvme_usage() {
- btrfs filesystem usage $DATA_PATH | grep "Device allocated:" | head -2 | \
- awk '{gsub(/%/, "", $3); print $3}' | sort -n | tail -1
- }
- # Function to add SSDs and create tiered storage
- add_ssd_tier() {
- echo "$(date): Adding SSD tier - NVMe usage at ${1}%"
- # Add SSD devices to the filesystem
- btrfs device add /dev/sda1 /data
- btrfs device add /dev/sdb1 /data
- # Convert to have mirrored SSDs as well
- # This creates a mixed topology: NVMe RAID1 + SSD RAID1
- btrfs balance start -dconvert=raid1 -mconvert=raid1 /data
- # Mark that SSDs have been added
- touch $SSD_ADDED_FLAG
- echo "$(date): SSD tier added successfully"
- }
- # Function to tier older data to SSDs
- tier_cold_data() {
- echo "$(date): Tiering cold data to SSDs"
- # Move less-utilized chunks from NVMe to SSD
- # This preferentially moves older/fragmented data
- btrfs balance start -dusage=60,devid=1 /data &
- btrfs balance start -dusage=60,devid=2 /data &
- wait
- echo "$(date): Data tiering complete"
- }
- # Main logic
- CURRENT_USAGE=$(get_nvme_usage)
- if [ $CURRENT_USAGE -gt $NVME_THRESHOLD ]; then
- if [ ! -f $SSD_ADDED_FLAG ]; then
- # First time hitting threshold - add SSDs
- add_ssd_tier $CURRENT_USAGE
- else
- # SSDs already added - just tier data
- tier_cold_data
- fi
- fi
- echo "$(date): NVMe usage: ${CURRENT_USAGE}%"
Advertisement
Add Comment
Please, Sign In to add comment