Tina Linux存储空间去哪了?从/proc/partitions到df命令的完整空间排查指南

📅 2026/6/19 22:20:29 👤 管理员 👁 次浏览
Tina Linux存储空间去哪了?从/proc/partitions到df命令的完整空间排查指南
Tina Linux存储空间去哪了从/proc/partitions到df命令的完整空间排查指南当你在Tina Linux设备上看到分区表显示UDISK分区有50M空间但df -h命令却只显示40M时这种消失的存储空间常常让嵌入式工程师感到困惑。本文将带你深入理解Tina Linux存储空间的三层模型并提供一套完整的排查方法论。1. Tina Linux存储空间的三层模型理解Tina Linux的存储空间需要从三个层次来看Flash物理总容量芯片的实际存储能力分区表划定的逻辑分区大小在sys_partition.fex中配置的大小文件系统实际可用大小最终通过df命令看到的大小这三层之间存在着各种损耗导致最终可用空间小于原始配置。让我们看一个典型例子# 分区表配置 [partition] name UDISK size 102400 # 50MB (102400*512B) # 实际查看 $ df -h /mnt/UDISK Filesystem Size Used Avail Use% Mounted on /dev/nand0p9 40M 2M 38M 5% /mnt/UDISK2. 存储空间排查工具链要全面排查存储空间需要掌握以下工具的组合使用工具/文件作用描述关键信息/proc/partitions显示块设备分区信息分区名称、块数量(1块1KB)/proc/mtd显示MTD分区信息(UBI方案)分区名称、大小、擦除块大小ubinfo -a显示UBI卷详细信息(UBI方案)逻辑擦除块大小、总LEB数量dumpe2fs显示ext4文件系统详细信息块大小、预留块、日志大小df -h显示文件系统使用情况总大小、已用、可用空间lsblk显示块设备信息分区大小、挂载点3. 空间消失的六大原因及排查方法3.1 隐藏空间占用Tina Linux中以下空间对用户不可见但实际占用Flash容量Bootloader区域包含boot0、uboot等MBR分区表通常占用16KB安全存储区域用于保存加密密钥等排查方法# 查看Flash总容量 $ cat /proc/partitions | grep nand0 major minor #blocks name 93 0 262144 nand0 # 这里显示128MB(262144*1KB) # 查看隐藏分区(UBI方案) $ cat /proc/mtd dev: size erasesize name mtd0: 00100000 00040000 boot0 # 1MB mtd1: 00300000 00040000 uboot # 3MB mtd2: 00100000 00040000 secure # 1MB3.2 分区对齐损耗不同存储介质有严格的对齐要求介质类型对齐大小原因说明NOR Flash64KB物理擦除块大小SPI NAND252KB(256KB - 2×2KB) UBI头部eMMC16MB兼容大多数物料实际案例# 配置分区大小为50MB(102400扇区) # 实际需要向上对齐到252KB的整数倍 计算过程 102400*512B 51,200KB 51,200KB / 252KB ≈ 203.17 → 向上取整204个块 204 * 252KB 51,408KB ≈ 50.2MB3.3 文件系统元数据开销不同文件系统有不同的元数据开销文件系统典型开销主要用途ext45-10%日志、inode表、超级块等ubifs17 LEBUBI卷信息、主节点等jffs22-5%清洁标记、擦除块信息等查看ext4开销$ dumpe2fs /dev/by-name/UDISK | grep -E Block size|Reserved block count|Journal size Block size: 4096 Reserved block count: 2560 Journal size: 1024k3.4 UBI方案的特殊开销在UBI方案中每个逻辑擦除块(LEB)需要保留空间实际可用空间 物理块大小 - 2×页大小 例如 256KB物理块 - 2×2KB 252KB可用/块查看UBI开销$ ubinfo -a UBI version: 1 Logical eraseblock size: 258048 bytes, 252.0 KiB Total amount of logical eraseblocks: 489 (126185472 bytes, 120.3 MiB) Amount of available logical eraseblocks: 0 (0 bytes)3.5 稀疏文件系统问题当文件系统被创建为稀疏镜像时df显示的大小可能与分区大小不一致# 创建稀疏ext4镜像 make_ext4fs -l 100M -b 4096 image.sparse.ext4 /data # 实际文件可能只有10M ls -lh image.sparse.ext4 -rw-r--r-- 1 user user 10M Jul 1 10:00 image.sparse.ext4 # 烧录后df显示 df -h /mnt/UDISK Filesystem Size Used Avail Use% Mounted on /dev/nand0p9 100M 10M 90M 10% /mnt/UDISK3.6 Overlayfs叠加层占用当使用overlayfs时rootfs_data分区会占用额外空间/overlay (rw) ← rootfs_data分区 └── / (ro) ← rootfs分区(squashfs)检查overlay占用$ mount | grep overlay overlay on / type overlay (rw,relatime,lowerdir/,upperdir/overlay/upper,workdir/overlay/work) $ df -h /overlay Filesystem Size Used Avail Use% Mounted on /dev/nand0p4 20M 5M 15M 25% /overlay4. 实战排查流程4.1 基础信息收集# 1. 查看分区信息 cat /proc/partitions # 2. 查看MTD信息(UBI方案) cat /proc/mtd # 3. 查看UBI卷信息(UBI方案) ubinfo -a # 4. 查看文件系统挂载 df -h mount | grep overlay4.2 空间差异分析# 计算理论空间与实际空间差异 理论空间$(cat /proc/partitions | grep nand0p9 | awk {print $3/1024}) 实际空间$(df -h /mnt/UDISK | awk NR2{print $2} | sed s/M//) 差异$(echo $理论空间 - $实际空间 | bc) echo 理论空间: ${理论空间}MB echo 实际空间: ${实际空间}MB echo 差异: ${差异}MB4.3 文件系统详细分析对于ext4文件系统# 查看详细元数据 dumpe2fs /dev/by-name/UDISK | less # 重点关注 # - Block size # - Reserved blocks # - Journal size # - Inode count对于ubifs文件系统# 查看ubi卷信息 ubinfo /dev/by-name/UDISK # 查看文件系统信息 ubiupdatevol -t /dev/by-name/UDISK # 先卸载 ubireader_extract_files -o output_dir /dev/by-name/UDISK5. 优化存储空间的实用技巧5.1 合理配置分区大小# 在sys_partition.fex中优化配置示例 [partition] name UDISK size 204800 # 100MB (204800*512B) # 对于UBI方案实际可用空间约为: # 204800*512B / (252*1024) ≈ 397 LEBs5.2 选择高效的文件系统场景推荐文件系统优点只读根文件系统squashfs高压缩比只读安全可写小分区jffs2专为NOR Flash优化大容量可写分区ubifsUBI方案最佳选择通用可写分区ext4兼容性好有日志保护5.3 减少文件系统开销对于ext4# 创建时减少预留空间 make_ext4fs -l 50M -b 4096 -m 1 -j 1024 data.img /data # -m 1: 只保留1%给root # -j 1024: 日志大小为1024个块(4MB)对于ubifs# 优化压缩参数 mkfs.ubifs -x zlib -b 4096 -e 258048 -c 500 -r /data -o data.ubifs5.4 使用稀疏镜像节省烧录时间# 将普通ext4转为稀疏镜像 img2simg data.ext4 data.sparse.ext4 # 烧录稀疏镜像 fastboot flash UDISK data.sparse.ext46. 高级调试技巧6.1 使用ftrace跟踪存储操作# 启用ftrace echo 1 /sys/kernel/debug/tracing/events/ext4/enable echo 1 /sys/kernel/debug/tracing/events/jbd2/enable echo 1 /sys/kernel/debug/tracing/tracing_on # 执行文件操作后查看trace cat /sys/kernel/debug/tracing/trace_pipe6.2 分析内存中的文件系统结构# 导出ubifs信息(需要内核支持) ubiupdatevol -t /dev/by-name/UDISK ubinfo --dump-all /dev/by-name/UDISK ubi_dump.txt # 分析ext4超级块 dd if/dev/by-name/UDISK ofsb.bin bs4096 count1 hexdump -C sb.bin | less6.3 性能监控工具# 监控I/O活动 iostat -xm 1 # 监控块设备详细统计 cat /sys/block/nand0/stat # 监控内存缓存使用 cat /proc/meminfo | grep -E Cached|Buffers7. 常见问题解决方案7.1 df显示空间大于分区大小现象分区表配置: 50MB df显示: 60MB原因文件系统创建时指定的大小大于实际分区大小稀疏文件系统未正确扩展解决# 调整文件系统大小匹配分区 resize2fs /dev/by-name/UDISK7.2 squashfs显示100%使用率现象Filesystem Size Used Avail Use% Mounted on rootfs 20M 20M 0 100% /原因squashfs是压缩的只读文件系统使用率总是显示100%与实际可用空间无关验证# 查看实际文件总大小 unsquashfs -s /dev/by-name/rootfs | grep Filesystem size7.3 文件系统损坏导致空间异常症状df显示异常大的已用空间文件操作返回ENOSPC错误但实际有空间修复步骤# 1. 卸载文件系统 umount /mnt/UDISK # 2. 修复ext4 e2fsck -y /dev/by-name/UDISK # 3. 修复ubifs(UBI方案) ubiupdatevol -t /dev/by-name/UDISK ubirepair /dev/by-name/UDISK7.4 Overlayfs耗尽rootfs_data空间现象系统日志显示no space left on device/overlay使用率接近100%解决方案# 1. 清理overlay上层文件 rm -rf /overlay/upper/* # 2. 扩大rootfs_data分区 # 修改sys_partition.fex后重新烧录 # 3. 或者使用UDISK作为overlay config mount option target /overlay option device /dev/by-name/UDISK option options rw,sync option enabled 18. 存储空间规划最佳实践8.1 量产设备分区建议分区大小建议文件系统备注boot4-8MBvfat内核镜像rootfs16-32MBsquashfs只读根文件系统rootfs_data8-16MBext4/ubifsoverlayfs上层UDISK剩余所有空间ext4/ubifs用户数据存储private1MBvfatSN/MAC等关键数据8.2 开发调试配置建议启用动态resize# 在启动脚本中添加 resize2fs /dev/by-name/UDISK增加调试分区[partition] name debug size 10M配置详细的存储日志# 在内核cmdline添加 loglevel7 rootfstypeext4 initcall_debug8.3 空间监控方案实现一个简单的空间监控脚本#!/bin/sh # 监控阈值(百分比) WARN_THRESHOLD80 CRIT_THRESHOLD90 check_space() { local partition$1 local usage$(df -h | grep $partition | awk {print $5} | cut -d% -f1) if [ -z $usage ]; then echo ERROR: Partition $partition not found return 1 fi if [ $usage -ge $CRIT_THRESHOLD ]; then echo CRITICAL: $partition usage ${usage}% return 3 elif [ $usage -ge $WARN_THRESHOLD ]; then echo WARNING: $partition usage ${usage}% return 2 else echo OK: $partition usage ${usage}% return 0 fi } # 检查关键分区 check_space /overlay check_space /mnt/UDISK9. 深入理解Tina Linux存储架构9.1 NFTL vs UBI方案对比特性NFTL方案UBI方案呈现方式块设备(/dev/nand0pX)字符设备(/dev/ubiX_Y)坏块管理驱动内部处理UBI子系统处理磨损均衡驱动内部实现UBI子系统实现文件系统支持ext4/jffs2/squashfsubifs(读写)/squashfs(只读)空间开销总容量的10-12%每个LEB损失2页掉电安全性依赖文件系统日志UBIFS内置保护适用介质Raw NAND/SPI NANDSPI NAND9.2 Tina Linux存储栈架构应用层 ├── 文件系统接口(VFS) │ ├── ext4/jffs2/squashfs/ubifs │ └── overlayfs ├── 块设备层 │ ├── NFTL (块设备抽象) │ └── UBI块模拟 (ubiblock) ├── MTD层 │ ├── NOR/NAND驱动 │ └── UBI子系统 └── 物理层 ├── SPI NOR Flash ├── SPI NAND Flash └── eMMC9.3 关键数据结构解析UBI方案中的重要结构struct ubi_volume_info { int ubi_num; // UBI设备号 int vol_id; // 卷ID long long size; // 卷大小(字节) long long used_bytes; // 已用字节 int alignment; // 对齐 char name[UBI_VOL_NAME_MAX1]; // 卷名 };ext4超级块关键字段偏移量 字段 大小 描述 0x0 s_inodes_count 4 inode总数 0x4 s_blocks_count 4 块总数 0xC s_log_block_size 4 块大小(2^(10s_log_block_size)) 0x14 s_blocks_per_group4 每组块数 0x58 s_journal_inum 4 日志inode号10. 性能优化进阶技巧10.1 优化ext4性能# 1. 调整日志模式(牺牲安全性换取性能) mount -o datawriteback /dev/by-name/UDISK /mnt/UDISK # 2. 禁用访问时间更新 mount -o noatime,nodiratime /dev/by-name/UDISK /mnt/UDISK # 3. 调整块大小匹配使用场景 # 小文件(4KB): -b 1024 # 大文件(1MB): -b 4096 make_ext4fs -l 50M -b 4096 -m 0 -j 1024 data.img /data10.2 优化ubifs性能# 1. 选择更快的压缩算法 mkfs.ubifs -x lzo -b 4096 -e 258048 -c 500 -r /data -o data.ubifs # 2. 调整压缩阈值 echo 50 /sys/module/ubifs/parameters/compression_threshold # 3. 预先生成索引节点 ubinize -o ubi.img -m 4096 -p 256KiB -s 4096 -O 2048 ubinize.cfg10.3 优化内存使用# 1. 调整文件系统缓存 echo 50 /proc/sys/vm/vfs_cache_pressure echo 100 /proc/sys/vm/dirty_background_ratio # 2. 限制overlayfs内存使用 mount -t overlay overlay -o lowerdir/,upperdir/overlay/upper,workdir/overlay/work,redirect_diron,metacopyon /mnt/merged11. 安全加固建议11.1 只读文件系统加固# 1. 将关键分区挂载为只读 mount -o remount,ro /dev/by-name/rootfs / # 2. 使用squashfs代替可写文件系统 mksquashfs rootfs rootfs.squashfs -comp xz -no-exports -xattrs # 3. 锁定分区表 fw_setenv partition_lock 111.2 安全擦除敏感数据# 1. 安全擦除UBI卷 ubiupdatevol -t /dev/by-name/private dd if/dev/zero of/dev/by-name/private bs4k count100 # 2. 擦除secure storage区域 sec_storage erase_all11.3 审计存储操作# 1. 启用文件系统审计 mount -o audit /dev/by-name/UDISK /mnt/UDISK # 2. 监控关键存储操作 inotifywait -m -r /mnt/UDISK/sensitive_data12. 调试工具集锦12.1 Tina Linux专用工具# 1. 查看分区信息 show_partitions # 2. 检查Flash健康状态 flash_health # 3. UBI调试工具 ubitest -d /dev/ubi012.2 通用Linux工具增强# 1. 增强版df df -h --outputsource,fstype,size,used,avail,pcent,target # 2. 块设备详细统计 blkid -c /dev/null lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID # 3. 文件系统检查 fsck.ext4 -nf /dev/by-name/UDISK12.3 性能分析工具# 1. I/O延迟分析 iotop -oP # 2. 块层跟踪 blktrace -d /dev/nand0 -o - | blkparse -i - # 3. 内存使用分析 smem -t -k -m13. 生产环境实践案例13.1 案例一空间突然减少现象设备运行一段时间后UDISK分区可用空间突然减少10MB排查# 1. 检查文件系统日志 dmesg | grep -i ext4\|jbd2 # 2. 发现日志显示Journal stopped # 3. 检查发现日志空间不足导致文件系统进入只读模式 # 解决方案 # 扩大分区时增加日志空间 make_ext4fs -l 100M -b 4096 -m 0 -j 2048 data.img /data13.2 案例二UBI卷挂载失败现象UBI方案设备启动时UDISK挂载失败排查# 1. 检查ubi卷状态 ubinfo -a # 2. 发现LEB数量不足 # 3. 重新计算需要的LEB数量 # 分区大小50MB 51200KB # 每个LEB 252KB → 需要203个LEB # 但ubi卷需要额外17个LEB用于元数据 # 解决方案 # 修改分区大小至少为 (20317)*252KB ≈ 55MB13.3 案例三文件写入速度慢现象写入大量小文件时速度极慢分析# 1. 检查文件系统参数 tune2fs -l /dev/by-name/UDISK | grep Filesystem features # 2. 发现没有has_extents特性 # 3. ext4未启用extents功能导致小文件性能差 # 解决方案 # 创建文件系统时启用extents make_ext4fs -l 50M -b 1024 -E extent -m 0 -j 1024 data.img /data14. 未来存储技术展望虽然本文主要关注当前Tina Linux的存储架构但值得关注一些新兴技术Zoned Storage针对Flash特性的分区存储方案F2FS专为Flash设计的文件系统可能替代ext4EROFS只读文件系统新选择性能优于squashfsBtrfs支持透明压缩和校验的高级文件系统这些技术可能在未来版本的Tina Linux中提供更好的存储性能和可靠性。