Partition layouts and unexplained disk usage

I’ve used several Debian distros in the past, but recently hit my limit with Windows (again) and decided to try out Arch on my daily driver. Loving Manjaro so far. The forums and wiki are excellent. I just have a few questions about partitioning and disk usage which, I hope, are fairly simple – they’re just beyond my Googling prowess and basic Linux skills lol.

Context: Outputs of inxi attached, as well as fdisk, df, and lsblk.
I currently have Manjaro on a 250GB SSD with the following partitions:
300mb FAT32 (/boot/efi)
23GB BTRFS (/)
203GB EXT4 (/home)
8GB swap

  1. Is this a typical layout for a Manjaro install?

  2. If that doesn’t look like something a distro installer would have suggested or automatically created, what layout would you suggest?

  3. Is there a utility that will show what is ACTUALLY taking up space on a root BTRFS partition?

(Unnecessarily-detailed extrapolation of the aforementioned questions below. Skip if you want.)

Q1: I like the BTRFS snapshot functionality, and I’ve always had /home on a separate partition/drive, but would it complicate and/or slow things down if the entire SSD was just one big btrfs partition (including /home)?

Q2: I don’t remember choosing this layout, but I’ve reinstalled a few times in the last couple months and haven’t changed it cus I’m pretty sure the first time I installed Manjaro, I just picked the “choose for me” option and figured it knew what it was doing. It’s also possible it was set up like that by HoloISO (an unofficial SteamOS distro I played around with recently before I eventually got sick of stability issues and just decided to install Manjaro) but I didn’t choose it and I’m wondering if there’s a better way.

Q3: It keeps filling up, and I’ve tried several things to make room – deleting old snapshots, removing unneeded language packs, clearing out package caches (with pacman, pamac, and yay), and cleaning out logs. I even reformatted the root partition and reinstalled this morning (keeping the same partition layout and leaving the /home partition untouched), but started getting low free space warnings about the root partition after the first system upgrade (with pacman -Syu).
Filelight and qDirStat (even when run as root) don’t show the size of several root folders, and I’ve tried diving through them with various terminal utils as root which also seems to incorrectly report their actual size. (see screenshots)


partitions

inxi --admin --verbosity=7 --filter --no-host --width

System:
  Kernel: 6.1.41-1-MANJARO arch: x86_64 bits: 64 compiler: gcc v: 13.1.1
    parameters: BOOT_IMAGE=/@/boot/vmlinuz-6.1-x86_64
    root=UUID=700f396c-7a1e-47aa-bcba-ba92b2b398d3 rw rootflags=subvol=@ quiet
    splash udev.log_priority=3
  Desktop: KDE Plasma v: 5.27.6 tk: Qt v: 5.15.10 wm: kwin_wayland vt: 1
    dm: SDDM Distro: Manjaro Linux base: Arch Linux
Machine:
  Type: Desktop Mobo: ASRock model: B550M/ac serial: <superuser required>
    UEFI: American Megatrends LLC. v: P2.40 date: 09/29/2022
Battery:
  Message: No system battery data found. Is one present?
Memory:
  System RAM: total: 16 GiB available: 15.54 GiB used: 6.84 GiB (44.0%)
  RAM Report: permissions: Unable to run dmidecode. Root privileges required.
CPU:
  Info: model: AMD Ryzen 7 3700X bits: 64 type: MT MCP arch: Zen 2 gen: 3
    level: v3 note: check built: 2020-22 process: TSMC n7 (7nm) family: 0x17 (23)
    model-id: 0x71 (113) stepping: 0 microcode: 0x8701021
  Topology: cpus: 1x cores: 8 tpc: 2 threads: 16 smt: enabled cache:
    L1: 512 KiB desc: d-8x32 KiB; i-8x32 KiB L2: 4 MiB desc: 8x512 KiB L3: 32 MiB
    desc: 2x16 MiB
  Speed (MHz): avg: 2976 high: 4301 min/max: 2200/4426 boost: enabled
    scaling: driver: acpi-cpufreq governor: schedutil cores: 1: 4284 2: 2162
    3: 2146 4: 2200 5: 4293 6: 3497 7: 3538 8: 2200 9: 2200 10: 2200 11: 2138
    12: 2200 13: 4301 14: 3453 15: 3674 16: 3130 bogomips: 115028
  Flags: 3dnowprefetch abm adx aes aperfmperf apic arat avic avx avx2 bmi1
    bmi2 bpext cat_l3 cdp_l3 clflush clflushopt clwb clzero cmov cmp_legacy
    constant_tsc cpb cpuid cqm cqm_llc cqm_mbm_local cqm_mbm_total
    cqm_occup_llc cr8_legacy cx16 cx8 de decodeassists extapic extd_apicid
    f16c flushbyasid fma fpu fsgsbase fxsr fxsr_opt ht hw_pstate ibpb ibs
    irperf lahf_lm lbrv lm mba mca mce misalignsse mmx mmxext monitor movbe
    msr mtrr mwaitx nonstop_tsc nopl npt nrip_save nx osvw overflow_recov pae
    pat pausefilter pclmulqdq pdpe1gb perfctr_core perfctr_llc perfctr_nb
    pfthreshold pge pni popcnt pse pse36 rapl rdpid rdpru rdrand rdseed rdt_a
    rdtscp rep_good sep sev sev_es sha_ni skinit smap smca smep ssbd sse sse2
    sse4_1 sse4_2 sse4a ssse3 stibp succor svm svm_lock syscall tce topoext
    tsc tsc_scale umip v_spec_ctrl v_vmsave_vmload vgif vmcb_clean vme vmmcall
    wbnoinvd wdt x2apic xgetbv1 xsave xsavec xsaveerptr xsaveopt
  Vulnerabilities:
  Type: itlb_multihit status: Not affected
  Type: l1tf status: Not affected
  Type: mds status: Not affected
  Type: meltdown status: Not affected
  Type: mmio_stale_data status: Not affected
  Type: retbleed mitigation: untrained return thunk; SMT enabled with STIBP
    protection
  Type: spec_store_bypass mitigation: Speculative Store Bypass disabled via
    prctl
  Type: spectre_v1 mitigation: usercopy/swapgs barriers and __user pointer
    sanitization
  Type: spectre_v2 mitigation: Retpolines, IBPB: conditional, STIBP:
    always-on, RSB filling, PBRSB-eIBRS: Not affected
  Type: srbds status: Not affected
  Type: tsx_async_abort status: Not affected
Graphics:
  Device-1: AMD Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
    vendor: XFX Pine driver: amdgpu v: kernel arch: RDNA-1 code: Navi-1x
    process: TSMC n7 (7nm) built: 2019-20 pcie: gen: 4 speed: 16 GT/s lanes: 16
    ports: active: DP-1,DP-2 empty: DP-3,HDMI-A-1 bus-ID: 0a:00.0
    chip-ID: 1002:731f class-ID: 0300
  Display: wayland server: X.org v: 1.21.1.8 with: Xwayland v: 23.1.2
    compositor: kwin_wayland driver: X: loaded: amdgpu
    unloaded: modesetting,radeon alternate: fbdev,vesa dri: radeonsi
    gpu: amdgpu d-rect: 3120x1600 display-ID: 0
  Monitor-1: DP-1 pos: primary,left res: 1920x1200 size: N/A modes: N/A
  Monitor-2: DP-2 pos: right res: 1200x1600 size: N/A modes: N/A
  API: OpenGL v: 4.6 Mesa 23.0.4 renderer: AMD Radeon RX 5700 XT (navi10
    LLVM 15.0.7 DRM 3.49 6.1.41-1-MANJARO) direct-render: Yes
Audio:
  Device-1: Creative Labs CA0132 Sound Core3D [Sound Blaster Recon3D /
    Z-Series BlasterX AE-5 Plus] driver: snd_hda_intel v: kernel pcie: gen: 1
    speed: 2.5 GT/s lanes: 1 bus-ID: 05:00.0 chip-ID: 1102:0012 class-ID: 0403
  Device-2: AMD Navi 10 HDMI Audio driver: snd_hda_intel v: kernel pcie:
    gen: 4 speed: 16 GT/s lanes: 16 bus-ID: 0a:00.1 chip-ID: 1002:ab38
    class-ID: 0403
  Device-3: AMD Starship/Matisse HD Audio vendor: ASRock
    driver: snd_hda_intel v: kernel pcie: gen: 4 speed: 16 GT/s lanes: 16
    bus-ID: 0c:00.4 chip-ID: 1022:1487 class-ID: 0403
  Device-4: SteelSeries ApS Arctis 7 driver: hid-generic,snd-usb-audio,usbhid
    type: USB rev: 1.1 speed: 12 Mb/s lanes: 1 mode: 1.1 bus-ID: 3-2.4:4
    chip-ID: 1038:12ad class-ID: 0300
  API: ALSA v: k6.1.41-1-MANJARO status: kernel-api with: aoss
    type: oss-emulator tools: alsactl,alsamixer,amixer
  Server-1: JACK v: 1.9.22 status: off tools: N/A
  Server-2: PipeWire v: 0.3.75 status: off with: wireplumber status: active
    tools: pw-cli,wpctl
  Server-3: PulseAudio v: 16.1 status: active with: pulseaudio-alsa
    type: plugin tools: pacat,pactl
Network:
  Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet
    vendor: ASRock driver: r8169 v: kernel pcie: gen: 1 speed: 2.5 GT/s lanes: 1
    port: f000 bus-ID: 06:00.0 chip-ID: 10ec:8168 class-ID: 0200
  IF: enp6s0 state: up speed: 1000 Mbps duplex: full mac: <filter>
  IP v4: <filter> type: dynamic noprefixroute scope: global
    broadcast: <filter>
  IP v6: <filter> type: noprefixroute scope: link
  Device-2: Intel Dual Band Wireless-AC 3168NGW [Stone Peak] driver: iwlwifi
    v: kernel pcie: gen: 1 speed: 2.5 GT/s lanes: 1 bus-ID: 07:00.0
    chip-ID: 8086:24fb class-ID: 0280
  IF: wlp7s0 state: down mac: <filter>
  WAN IP: <filter>
Bluetooth:
  Device-1: Intel Wireless-AC 3168 Bluetooth driver: btusb v: 0.8 type: USB
    rev: 2.0 speed: 12 Mb/s lanes: 1 mode: 1.1 bus-ID: 1-9:8 chip-ID: 8087:0aa7
    class-ID: e001
  Report: rfkill ID: hci0 rfk-id: 1 state: up address: see --recommends
Logical:
  Message: No logical block device data found.
RAID:
  Message: No RAID data found.
Drives:
  Local Storage: total: 2.96 TiB used: 2.01 TiB (67.9%)
  SMART Message: Unable to run smartctl. Root privileges required.
  ID-1: /dev/nvme0n1 maj-min: 259:3 vendor: Inland model: NVMe SSD 256GB
    size: 238.47 GiB block-size: physical: 512 B logical: 512 B speed: 31.6 Gb/s
    lanes: 4 tech: SSD serial: <filter> fw-rev: T0918A0L temp: 29.9 C
    scheme: GPT
  ID-2: /dev/nvme1n1 maj-min: 259:0 vendor: Samsung
    model: SSD 970 EVO Plus 250GB size: 232.89 GiB block-size: physical: 512 B
    logical: 512 B speed: 31.6 Gb/s lanes: 4 tech: SSD serial: <filter>
    fw-rev: 2B2QEXM7 temp: 32.9 C scheme: GPT
  ID-3: /dev/sda maj-min: 8:0 vendor: Samsung model: SSD 860 EVO 250GB
    size: 232.89 GiB block-size: physical: 512 B logical: 512 B speed: 6.0 Gb/s
    tech: SSD serial: <filter> fw-rev: 1B6Q scheme: GPT
  ID-4: /dev/sdb maj-min: 8:16 vendor: Western Digital model: WD20EADS-00W4B0
    size: 1.82 TiB block-size: physical: 512 B logical: 512 B speed: 3.0 Gb/s
    tech: N/A serial: <filter> fw-rev: 0A01 scheme: MBR
  ID-5: /dev/sdc maj-min: 8:32 vendor: Western Digital
    model: WD5003ABYX-01WERA0 size: 465.76 GiB block-size: physical: 512 B
    logical: 512 B speed: 3.0 Gb/s tech: HDD rpm: 7200 serial: <filter>
    fw-rev: 1S01
  Message: No optical or floppy data found.
Partition:
  ID-1: / raw-size: 22.3 GiB size: 22.3 GiB (100.00%) used: 19.69 GiB (88.3%)
    fs: btrfs dev: /dev/sda2 maj-min: 8:2 label: N/A
    uuid: 700f396c-7a1e-47aa-bcba-ba92b2b398d3
  ID-2: /boot/efi raw-size: 301 MiB size: 300.4 MiB (99.79%)
    used: 576 KiB (0.2%) fs: vfat dev: /dev/sda1 maj-min: 8:1 label: ARCHBOOT
    uuid: 85FA-1AEB
  ID-3: /home raw-size: 202.29 GiB size: 198.06 GiB (97.91%)
    used: 125.7 GiB (63.5%) fs: ext4 dev: /dev/sda3 maj-min: 8:3 label: archhome
    uuid: e510baee-7b3c-4615-b23f-a3a90f31dddb
  ID-4: /run/media/simeon/alphablox raw-size: 465.76 GiB
    size: 465.76 GiB (100.00%) used: 442.39 GiB (95.0%) fs: ntfs dev: /dev/sdc1
    maj-min: 8:33 label: alphablox uuid: 522C8FD12C8FAE93
  ID-5: /run/media/simeon/betablox raw-size: 1.33 TiB
    size: 1.33 TiB (100.00%) used: 822.37 GiB (60.3%) fs: ntfs dev: /dev/sdb1
    maj-min: 8:17 label: betablox uuid: D8626FC4626FA64A
  ID-6: /run/media/simeon/charblox raw-size: 237.85 GiB
    size: 237.85 GiB (100.00%) used: 213.11 GiB (89.6%) fs: ntfs
    dev: /dev/nvme0n1p3 maj-min: 259:6 label: charblox uuid: 688CB6B58CB67D5E
  ID-7: /run/media/simeon/echoblox raw-size: 232.87 GiB
    size: 232.87 GiB (100.00%) used: 169.65 GiB (72.9%) fs: ntfs
    dev: /dev/nvme1n1p2 maj-min: 259:2 label: echoblox uuid: 3CBE1CDEBE1C930E
  ID-8: /run/media/simeon/hacosv raw-size: 500 GiB size: 500 GiB (100.00%)
    used: 265.56 GiB (53.1%) fs: hfsplus dev: /dev/sdb2 maj-min: 8:18
    label: hacosv uuid: d7de254b-0595-31e0-bb41-dce845bb90ab
  ID-9: /var/cache raw-size: 22.3 GiB size: 22.3 GiB (100.00%)
    used: 19.69 GiB (88.3%) fs: btrfs dev: /dev/sda2 maj-min: 8:2 label: N/A
    uuid: 700f396c-7a1e-47aa-bcba-ba92b2b398d3
  ID-10: /var/log raw-size: 22.3 GiB size: 22.3 GiB (100.00%)
    used: 19.69 GiB (88.3%) fs: btrfs dev: /dev/sda2 maj-min: 8:2 label: N/A
    uuid: 700f396c-7a1e-47aa-bcba-ba92b2b398d3
Swap:
  Kernel: swappiness: 60 (default) cache-pressure: 100 (default)
  ID-1: swap-1 type: partition size: 8 GiB used: 8.5 MiB (0.1%) priority: -2
    dev: /dev/sda4 maj-min: 8:4 label: archswap
    uuid: 45c65542-554a-42ab-b22a-0a800eb44c97
Unmounted:
  ID-1: /dev/nvme0n1p1 maj-min: 259:4 size: 100 MiB fs: vfat label: N/A
    uuid: ACAC-4745
  ID-2: /dev/nvme0n1p2 maj-min: 259:5 size: 16 MiB fs: <superuser required>
    label: N/A uuid: N/A
  ID-3: /dev/nvme0n1p4 maj-min: 259:7 size: 522 MiB fs: ntfs label: N/A
    uuid: 540C092F0C090DA4
  ID-4: /dev/nvme1n1p1 maj-min: 259:1 size: 16 MiB fs: <superuser required>
    label: N/A uuid: N/A
USB:
  Hub-1: 1-0:1 info: hi-speed hub with single TT ports: 10 rev: 2.0
    speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 chip-ID: 1d6b:0002
    class-ID: 0900
  Hub-2: 1-5:2 info: Logitech G11/G15 Keyboard / USB Hub ports: 4 rev: 1.1
    speed: 12 Mb/s (1.4 MiB/s) lanes: 1 mode: 1.1 power: 100mA chip-ID: 046d:c223
    class-ID: 0900
  Device-1: 1-5.1:4 info: Logitech G11/G15 Keyboard / type: keyboard,HID
    driver: hid-generic,usbhid interfaces: 2 rev: 2.0 speed: 1.5 Mb/s (183 KiB/s)
    lanes: 1 mode: 1.0 power: 100mA chip-ID: 046d:c221 class-ID: 0300
  Device-2: 1-5.4:6 info: Logitech G15 Keyboard / LCD type: HID
    driver: lg-g15,usbhid interfaces: 1 rev: 2.0 speed: 12 Mb/s (1.4 MiB/s)
    lanes: 1 mode: 1.1 power: 100mA chip-ID: 046d:c222 class-ID: 0300
  Device-3: 1-6:3 info: Logitech G502 Proteus Spectrum Optical Mouse
    type: mouse,HID driver: hid-generic,usbhid interfaces: 2 rev: 2.0
    speed: 12 Mb/s (1.4 MiB/s) lanes: 1 mode: 1.1 power: 300mA
    chip-ID: 046d:c332 class-ID: 0300 serial: <filter>
  Hub-3: 1-7:5 info: Genesys Logic Hub ports: 4 rev: 2.0
    speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 power: 100mA
    chip-ID: 05e3:0610 class-ID: 0900
  Device-1: 1-8:7 info: ASRock LED Controller type: HID
    driver: hid-generic,usbhid interfaces: 1 rev: 1.1 speed: 12 Mb/s (1.4 MiB/s)
    lanes: 1 mode: 1.1 power: 100mA chip-ID: 26ce:01a2 class-ID: 0300
    serial: <filter>
  Device-2: 1-9:8 info: Intel Wireless-AC 3168 Bluetooth type: bluetooth
    driver: btusb interfaces: 2 rev: 2.0 speed: 12 Mb/s (1.4 MiB/s) lanes: 1
    mode: 1.1 power: 100mA chip-ID: 8087:0aa7 class-ID: e001
  Hub-4: 2-0:1 info: super-speed hub ports: 4 rev: 3.1
    speed: 10 Gb/s (1.16 GiB/s) lanes: 1 mode: 3.2 gen-2x1 chip-ID: 1d6b:0003
    class-ID: 0900
  Hub-5: 3-0:1 info: hi-speed hub with single TT ports: 4 rev: 2.0
    speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 chip-ID: 1d6b:0002
    class-ID: 0900
  Hub-6: 3-2:2 info: ASMedia ASM1074 High-Speed hub ports: 4 rev: 2.1
    speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 power: 100mA
    chip-ID: 174c:2074 class-ID: 0900
  Hub-7: 3-2.1:3 info: Huasheng USB2.0 HUB ports: 4 rev: 2.0
    speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 power: 100mA
    chip-ID: 214b:7250 class-ID: 0900
  Hub-8: 3-2.1.3:5 info: Microchip (formerly SMSC) USB 2.0 Hub ports: 3
    rev: 2.0 speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 power: 2mA
    chip-ID: 0424:2514 class-ID: 0900
  Hub-9: 3-2.1.3.1:7 info: Microchip (formerly SMSC) USB 2.0 Hub ports: 3
    rev: 2.0 speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 power: 2mA
    chip-ID: 0424:2640 class-ID: 0900
  Device-1: 3-2.1.3.1.1:8 info: Microchip (formerly SMSC) Ultra Fast Media
    Reader type: mass storage driver: usb-storage interfaces: 1 rev: 2.0
    speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 power: 96mA
    chip-ID: 0424:4060 class-ID: 0806 serial: <filter>
  Hub-10: 3-2.1.4:6 info: Microchip (formerly SMSC) Hub ports: 4 rev: 2.0
    speed: 480 Mb/s (57.2 MiB/s) lanes: 1 mode: 2.0 power: 2mA chip-ID: 0424:2504
    class-ID: 0900
  Device-1: 3-2.4:4 info: SteelSeries ApS Arctis 7 type: audio,HID
    driver: hid-generic,snd-usb-audio,usbhid interfaces: 6 rev: 1.1
    speed: 12 Mb/s (1.4 MiB/s) lanes: 1 mode: 1.1 power: 100mA
    chip-ID: 1038:12ad class-ID: 0300
  Hub-11: 4-0:1 info: super-speed hub ports: 4 rev: 3.1
    speed: 10 Gb/s (1.16 GiB/s) lanes: 1 mode: 3.2 gen-2x1 chip-ID: 1d6b:0003
    class-ID: 0900
  Hub-12: 4-2:2 info: ASMedia ASM1074 SuperSpeed hub ports: 4 rev: 3.0
    speed: 5 Gb/s (596.0 MiB/s) lanes: 1 mode: 3.2 gen-1x1 power: 8mA
    chip-ID: 174c:3074 class-ID: 0900
Sensors:
  System Temperatures: cpu: 57.8 C mobo: N/A gpu: amdgpu temp: 50.0 C
    mem: 58.0 C
  Fan Speeds (RPM): N/A gpu: amdgpu fan: 567
Info:
  Processes: 382 Uptime: 53m wakeups: 0 Init: systemd v: 253 default: graphical
  tool: systemctl Compilers: gcc: 13.1.1 clang: 15.0.7 Packages: pm: pacman
  pkgs: 1180 libs: 351 tools: pamac,yay pm: flatpak pkgs: 0 Shell: Bash
  v: 5.1.16 running-in: konsole inxi: 3.3.28

df -th

Filesystem     Type      Size  Used Avail Use% Mounted on
dev            devtmpfs  7.8G     0  7.8G   0% /dev
run            tmpfs     7.8G  1.8M  7.8G   1% /run
/dev/sda2      btrfs      23G   20G  1.8G  93% /
tmpfs          tmpfs     7.8G  362M  7.5G   5% /dev/shm
/dev/sda2      btrfs      23G   20G  1.8G  93% /var/cache
/dev/sda2      btrfs      23G   20G  1.8G  93% /var/log
tmpfs          tmpfs     7.8G  612K  7.8G   1% /tmp
/dev/sda1      vfat      301M  576K  300M   1% /boot/efi
/dev/sda3      ext4      199G  126G   63G  67% /home
tmpfs          tmpfs     1.6G  108K  1.6G   1% /run/user/1000

lsblk -fa

NAME        FSTYPE          FSVER  LABEL     UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                                              
├─sda1      vfat            FAT32  ARCHBOOT  85FA-1AEB                             299.8M     0% /boot/efi
├─sda2      btrfs                            700f396c-7a1e-47aa-bcba-ba92b2b398d3    1.7G    88% /var/log
│                                                                                                /var/cache
│                                                                                                /
├─sda3      ext4            1.0    archhome  e510baee-7b3c-4615-b23f-a3a90f31dddb   62.2G    63% /home
└─sda4      swap            1      archswap  45c65542-554a-42ab-b22a-0a800eb44c97                [SWAP]

fdisk -l

Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors
Disk model: Samsung SSD 860 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 45525464-782C-45D4-B7C3-74D2B4051946

Device         Start       End   Sectors   Size Type
/dev/sda1         34    616447    616414   301M EFI System
/dev/sda2     616448  47378431  46761984  22.3G Linux filesystem
/dev/sda3   47378432 471619583 424241152 202.3G Linux filesystem
/dev/sda4  471619584 488397134  16777551     8G Linux swap

Sure… except for one thing.
Your root / may end up becoming filled over time, especially if you install a good number of apps and/or dont clean out the cache.
For the partition layout itself…
Not everyone uses btrfs or a separate home partition (or swap partition) … but its well within the realms of normalcy.

This is fine, besides the root size. a number thrown around often as a good minimum for root is about 30 GB. (for reference … mine right now is about 26 GB, and I only have single copies in my package cache… recent cleaning)

btrfs itself is what you should ask to know how much it is using.
This thread will probably be helpful for you:

1 Like

At least my installs are the 300MB EFI partition, and everything else on one BRTFS partition. But there is a root subvolume (@) and home (@home). The free space is shared between both unless you implement quotas.

Putting everything on one subvolume is fine. But home and root do such drastically different things, there’s no big reason to do it on one. When typing commands or scripting, it’s just copying a command and replacing @ with @home. Timeshift is still one button/command for both subvolumes.

2 Likes

If you want home seperated, then it is a valid partition scheme.

A distro installer would create /home as a subvolume @home when BTRFS was chosen.

Not a GUI, but if you want the actual size, then you need to mount the fstree (no the subvolume). Something like that:

# Mount fstree of / to /tmp/system
sudo mount -m -U $(findmnt / -o UUID -n) /tmp/system
# Get the size of each subvolume:
sudo btrfs subvolume list /tmp/system | cut -d " " -f9 | while read subvol; do echo "Subvolume: $subvol"; sudo btrfs filesystem du -s /tmp/system/$subvol; done

It is not the most elegant solution, but works.

TOTAL → That’s what you see when running normal du command.
EXCLUSIVE → Data which is only in that subvolume.
SET SHARED → Shared files which only exists once, but shared (you can say: deduplicated files).

No not really. Only for safety reasons. BTRFS is a bit rebellious when it doesn’t have enough free space, which can also prevent mounts in write mode.

When you delete subvolumes/snapshots then I would advise to balance the partition after time, so that it will “reorder” the chunks.

Something like:

sudo btrfs balance start -musage=90 -dusage=90 / & sudo watch -n1 'btrfs balance status /'
2 Likes

No, not entirely. When using btrfs, the general approach is to use a btrfs subvolume for /home, i.e. @home. In fact, if you opt for automatic partitioning with btrfs, then calamares will automatically create the following subvolumes. :arrow_down:

@            → mounted at /
@home        → mounted at /home
@cache       → mounted at /var/cache
@log         → mounted at /var/log

The reason for this layout is that it works well with timeshift and grub-btrfs for being able to make snapshots and, if things go wrong, roll back the system by booting into an earlier snapshot.

Mind you, this does not mean that it would necessarily be the best strategy or partitioning layout, but considering that timeshift and grub-btrfs are both attuned to this layout, it’s a very good choice for most users.

The general idea of btrfs is that you would use subvolumes instead of separate partitions because then you don’t have to worry about running out of free space on one of the partitions, given that the subvolumes pretty much behave as, and can for most part be configured, the way you would do with separate partitions, but with the big difference that all subvolumes share the same amount of free space on the filesystem. But you can mount them with distinct mount options per subvolume, just as you can with dedicated partitions, with only a few differences — e.g. you cannot use a different level of compression per subvolume.

btrfs filesystem df

See… :arrow_down:

man btrfs

… for all of the different options. :wink:

Negative. Basically, you get the best of both worlds: individual subvolumes with their own distinct mount options, but sharing all free space on the filesystem.

This is all a matter of personal preference, and of experience. The default layout with the four subvolumes in a flat list as I laid out above is good enough for most users, and has the advantage of working well with timeshift and grub-btrfs out-of-the-box.

Removing old snapshots and trimming your package cache are normal maintenance requirements. However, that said, you may on occasion also need to re-balance your btrfs filesystem due to the way it allocates space. Again, see the man page.

Those tools were not designed to work with btrfs, so their output will not correspond to the actual disk usage. :wink:

2 Likes

There you have already very good advice ! :+1:

To prevent this:

  • Use @ and @home with Btrfs on a single partition!
  • Use btrfs instead of ext4
  • Enable zstd compression for BTRFS (i do use :9 )
  • Balance only when necessary

  • You have much more space because the free space is shared
  • You only need to monitor free space on one volume
  • Snapshots in BTRFS are cheap, in Ext4 they are heavy
  • Compression gives you additional storage space at almost no cost
  • Compression can even speed up reading ':wink:
  • Btrfs somehow manages the free space itself, doing a little balancing on the go. Only if you get over 80% you do need to balance yourself
    :footprints:

You can find good Information about Btrfs in the wiki

2 Likes

Compression is normally enabled by default if the filesystem is created by calamares — i.e. for the mount options of the entry in /etc/fstab — albeit that the chosen algorithm may not be ideal. I think calamares defaults to zlib compression, but zstd is a better option. :wink:

2 Likes

Thanks everyone, you’ve answered all of my questions – and then some!
I’m going to back up everything on my ext4 home partition, delete it, extend the btrfs root partition to fill the drive, make subvolumes for home/cache/log, and enable zst compression.

The more I learn about BTRFS, the more I am both impressed and mystified by it. Seems like a lot of voodoo magic happening behind the scenes but the end result feels like a very “smart” file system which makes everything else seem antique in comparison. (except maybe APFS, but it’s also a total PITA to work with for a variety of reasons)

1 Like

QDirStat does not descend into mounted filesystems (because that would be counterproductive if you need to know what fills up the filesystem where you started from); so you only see the mount point of each of them, and that’s the directories that you see reported as “0 Bytes”. That’s perfectly normal and expected.

In your screenshot, that’s /dev, /run, /proc, /sys because that’s mounted pseudo filesystems, in reality just exported kernel tables; none of the items there has a true size anyway. /tmp may be on a RAM disk, and /home is a separate filesystem (which is always a good choice to keep your own work and system files separate).

So yes, your screenshot does show the correct size of your complete root filesystem with 7.5 GB. That’s what all system tools also report, including “du” and “df”.

What you don’t see because Btrfs is essentially lying about its disk usage is things like snapshots; that was a decision by the designers of Btrfs. You need to use dedicated Btrfs tools to get that information.

QDirStat even contains an entry in its “Help” menu about that (“Help”-> “Problems and Solutions”, “Btrfs Size Reporting”; see also here), and it reports something along those lines in its “Mounted Filesystems” window (basically a graphical “df”; menu “View” → “Show Mounted Filesystems”).

Btrfs reports only half-truths to system calls like “stat()”: Only the sizes of each file and directory, completely ignoring advanced Btrfs features like snapshots. And it’s those snapshots that can ruin your day.

23 GB for a Btrfs root filesystem is very optimistic; you’ll run out of disk space soon if you are using any meaningful amount of snapshots, which are probably created automatically for system administration tasks such as package updates.

HTH


HuHa
QDirStat Author

1 Like

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.