Linux 中用 pip/apt 安装软件时,若出现「OSError: [Errno 28] No space left on device」,核心原因是 某个分区(通常是根分区 / 或临时目录所在分区)剩余空间不足,导致安装过程中无法写入解压文件、缓存或临时数据。本文结合「嵌入式设备(如泰山派无 eMMC 版)」和「通用 Linux 系统」两种场景,提供从「定位问题」到「永久解决」的完整方案,尤其适配根分区小、大存储空间闲置的场景(如 32G SD 卡仅用 6G 根分区)。

一、先定位:空间不足到底出在哪?

在解决前,需先明确「哪个分区 / 目录」空间不够,避免盲目清理。执行以下命令快速定位:

1. 查看所有分区的空间使用情况

# -h 表示人性化显示(GB/MB),重点看 /(根分区)和临时目录所在分区
df -h
关键关注两点:
  • 根分区(/dev/root 或 /dev/mmcblk1p6,嵌入式设备常见):若 Use% 接近 100%(如 95% 以上),说明根分区满了;
  • 临时目录分区:临时目录默认是 /tmp(通常属于根分区)或 /dev/shm(内存临时分区,容量小),若安装时大量依赖需解压,会快速占满。

2. 查看临时目录所在分区

# 查看 /tmp 属于哪个分区(若输出根分区,则临时文件会占用根空间)
df -h /tmp
# 查看当前 TMPDIR 环境变量(若未设置,默认用 /tmp)
echo $TMPDIR

3. 定位根分区的大文件(可选)

若根分区满了,可进一步找出占用空间的大文件 / 目录,针对性清理:

# 查看根目录下各一级目录的空间占用(忽略权限错误)
sudo du -sh /* 2>/dev/null | sort -hr
# 重点检查:/var/cache(APT 缓存)、/var/log(日志)、/home(用户文件)

二、场景 1:嵌入式设备(如泰山派无 eMMC 版)—— 激活闲置 SD 卡空间

泰山派、树莓派等依赖 SD 卡启动的设备,常因「厂商固定分区表」导致 32G/64G SD 卡仅用 5-6G 根分区,剩余 20+G 空间闲置(如 /dev/mmcblk1p8),这是安装包时空间不足的核心原因。解决思路:激活闲置大分区 → 把临时目录 / 安装目录移到该分区

步骤 1:激活 SD 卡的闲置大分区

以泰山派为例,SD 卡闲置分区通常是 /dev/mmcblk1p8,需通过「识别→格式化→挂载→开机自动挂载」激活:

1.1 确认闲置分区
# 查看 SD 卡(/dev/mmcblk1)完整分区表,找 Size 20G+ 的分区(如 p8)
fdisk -l /dev/mmcblk1
预期输出(32G SD 卡):
Device Size Type 说明
/dev/mmcblk1p6 6G 根分区 满溢的核心分区
/dev/mmcblk1p8 23.4G 闲置分区 需激活的大空间
1.2 卸载默认挂载(若已挂载到 /userdata

厂商镜像可能将 p8 错误挂载到小容量目录,先卸载:

# 查看 p8 当前挂载状态
mount | grep /dev/mmcblk1p8
# 若输出“/dev/mmcblk1p8 on /userdata”,执行卸载
sudo umount /userdata
1.3 格式化闲置分区为 ext4(适配大容量)
# 强制格式化为 ext4(-F 跳过交互,该分区无重要数据,放心执行)
sudo mkfs.ext4 -F /dev/mmcblk1p8
成功标志:输出包含「Creating filesystem with X 4k blocks」(X 对应 23G 容量)。
1.4 挂载大分区到固定目录(如 /mnt/large_storage
# 1. 创建挂载目录
sudo mkdir -p /mnt/large_storage
# 2. 临时挂载(立即生效,重启后失效)
sudo mount /dev/mmcblk1p8 /mnt/large_storage
# 3. 验证(显示 23G 容量即成功)
df -h /mnt/large_storage
1.5 配置开机自动挂载(避免重启后失效)

通过 /etc/fstab 写入规则,防止重启后大分区 “消失”:

# 1. 备份 fstab(重要!防止配置错误导致无法开机)
sudo cp /etc/fstab /etc/fstab.bak
# 2. 获取 p8 的 UUID(唯一标识,避免设备名变化)
p8_uuid=$(blkid /dev/mmcblk1p8 | awk -F '"' '{print $2}')
# 3. 写入 fstab
echo "UUID=$p8_uuid /mnt/large_storage ext4 defaults 0 2" | sudo tee -a /etc/fstab
# 4. 测试(卸载后重新加载,确认挂载成功)
sudo umount /mnt/large_storage
sudo mount -a
df -h /mnt/large_storage

步骤 2:永久配置临时目录(TMPDIR)

安装包时,pip 会先将依赖解压到临时目录(默认 /tmp,属根分区),需将临时目录移到激活的大分区,永久配置 TMPDIR

2.1 创建永久临时目录
# 在大分区下创建 tmp 目录,权限设为 777(所有用户可读写)
sudo mkdir -p /mnt/large_storage/tmp
sudo chmod 777 /mnt/large_storage/tmp
2.2 永久设置 TMPDIR(所有终端生效)
# 1. 编辑系统级配置文件(所有用户生效)
sudo nano /etc/profile
# 2. 在文件末尾添加:指定 TMPDIR 为大分区的 tmp 目录
export TMPDIR=/mnt/large_storage/tmp
# 3. 立即生效(无需重启)
source /etc/profile
# 4. 验证(输出 /mnt/large_storage/tmp 即成功)
echo $TMPDIR

步骤 3:安装包(以 YOLO 为例,避免根分区占用)

此时所有临时文件、安装文件都会存到大分区,彻底解决空间不足:

# 1. 指定安装目录和缓存目录到大分区
pip3 install ultralytics \
--target=/mnt/large_storage/python_libs \  # 安装到大分区
--cache-dir=/mnt/large_storage/pip_cache  # 缓存到大分区
# 2. (可选)若仍提示空间不足,加 --no-cache-dir 跳过缓存
pip3 install ultralytics --target=/mnt/large_storage/python_libs --no-cache-dir

三、场景 2:通用 Linux 系统(PC / 服务器)—— 清理空间 + 迁移临时目录

若你的 Linux 是 PC 或服务器(无闲置 SD 卡空间),空间不足通常是「根分区真的满了」,解决思路:清理冗余空间 → 迁移临时目录到大容量分区

步骤 1:紧急清理根分区空间

优先清理「安全且占用大」的文件,快速释放空间:

1.1 清理 APT 缓存(最有效,释放几百 MB - 几 GB)
# 彻底清理所有已下载的安装包(不影响已安装软件)
sudo apt clean
# 或仅清理过期缓存(保留最新版本)
sudo apt autoclean
1.2 清理日志文件
# 删除 30 天前的压缩日志(/var/log 下的 .log.gz 文件)
sudo find /var/log -name "*.log.gz" -mtime +30 -delete
# 清空当前大日志(如 /var/log/syslog,避免删除正在写入的文件)
sudo truncate -s 0 /var/log/syslog
1.3 清理临时文件(/tmp)
# 安全删除 /tmp 下 24 小时未修改的文件(避免删除正在使用的文件)
sudo find /tmp -type f -mtime +1 -delete

步骤 2:迁移临时目录到大容量分区

若根分区长期紧张,将临时目录迁移到其他大容量分区(如 /home):

# 1. 在 /home 下创建新临时目录
sudo mkdir -p /home/tmp
sudo chmod 777 /home/tmp
# 2. 永久设置 TMPDIR(同场景1步骤2.2,编辑 /etc/profile)
echo "export TMPDIR=/home/tmp" | sudo tee -a /etc/profile
source /etc/profile
# 3. 验证
echo $TMPDIR  # 输出 /home/tmp

步骤 3:安装包时的额外技巧

# 1. 用 --no-cache-dir 跳过缓存,减少空间占用
pip3 install 包名 --no-cache-dir
# 2. 若安装大依赖(如 torch、opencv),临时指定 TMPDIR(若未永久配置)
TMPDIR=/home/tmp pip3 install 包名 --no-cache-dir

四、验证:确认问题已解决

安装包后,执行以下命令确认空间充足且软件可正常使用:

# 1. 查看分区空间(根分区和临时目录分区 Use% 正常)
df -h
# 2. 验证软件导入(以 YOLO 为例)
export PYTHONPATH=/mnt/large_storage/python_libs:$PYTHONPATH  # 若自定义安装目录
python3 -c "from ultralytics import YOLO; print('安装成功!')"

五、预防:避免以后再出现空间不足

  1. 定期清理:每月执行 sudo apt clean && sudo find /var/log -name "*.log.gz" -mtime +30 -delete
  2. 安装前检查:安装大软件前,先用 df -h 确认根分区 / 临时目录分区剩余空间 ≥ 2G;
  3. 优先用大分区:嵌入式设备激活闲置空间后,所有大软件(如 Python 库、编译源码)都安装到大分区(如 /mnt/large_storage),避免根分区占用。

总结

No space left on device」的本质是「目标分区空间不足」,嵌入式设备重点是激活闲置存储,通用系统重点是清理冗余 + 迁移临时目录。核心逻辑是:让安装过程中的「解压、缓存、临时文件」都放到空间充足的分区,而非挤在满溢的根分区。按本文步骤操作后,无论是安装 YOLO、OpenCV 还是其他大软件,都能彻底避开空间不足问题。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐