Linux服务器编译android报no space left on device导致失败的定位解决

文章目录

错误现象

有多个android项目,编译成功一个后,其它几个接连失败,

报错信息如下:

复制代码
go build command-line-arguments: mkdir /tmp/go-build710589343/command-line-arguments: no space left on device

File "/usr/lib/python2.7/tempfile.py", line 339, in mkdtemp
    _os.mkdir(file, 0700)
OSError: [Errno 28] No space left on device: '/tmp/make-target-files-0jy9g2'

分析

内存排查

以为是内存不足了,使用free -h查看内存情况:

bash 复制代码
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           125G        782M         15G        7.0M        109G        124G
Swap:          8.0G         31M        8.0G

不是内存不足的问题。

/tmp分区

使用du -h /tmp查看/tmp分区占用情况:

复制代码
du: cannot read directory '/tmp/systemd-private-7eaeee3a2a7d40ad984e0b30dae6abb4-systemd-resolved.service-TajIYX': Permission denied
4.0K	/tmp/systemd-private-7eaeee3a2a7d40ad984e0b30dae6abb4-systemd-resolved.service-TajIYX
4.0K	/tmp/hsperfdata_nobody
4.0K	/tmp/jna--1040220445
du: cannot read directory '/tmp/systemd-private-7eaeee3a2a7d40ad984e0b30dae6abb4-systemd-timesyncd.service-fhFdwp': Permission denied
4.0K	/tmp/systemd-private-7eaeee3a2a7d40ad984e0b30dae6abb4-systemd-timesyncd.service-fhFdwp
4.0K	/tmp/.font-unix
4.0K	/tmp/hsperfdata_alfnoso
du: cannot read directory '/tmp/snap-private-tmp': Permission denied
4.0K	/tmp/snap-private-tmp
4.0K	/tmp/.X11-unix
7.4G	/tmp/sprd-pac-aFEymK
4.0K	/tmp/.ICE-unix
2.7G	/tmp/sprd-pac-bfqMYm
4.0K	/tmp/nsjail.1001.root
4.0K	/tmp/.XIM-unix
4.0K	/tmp/nsjail.1001.tmp
4.0K	/tmp/.Test-unix
......
2.6G	/tmp/make-target-files-MXuUZh
13G	/tmp

13个G,不算很大。

使用df -i /tmp查看tmp分区占用磁盘的比率:

复制代码
Filesystem                         Inodes  IUsed   IFree IUse% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 7602176 270479 7331697    4% /

占用4%,说明磁盘空间是够的。

磁盘

使用df -h查看所有分区使用情况:

复制代码
Filesystem                         Size  Used Avail Use% Mounted on
udev                                63G     0   63G   0% /dev
tmpfs                               13G  7.1M   13G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  114G  108G     0 100% /
tmpfs                               63G     0   63G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                               63G     0   63G   0% /sys/fs/cgroup
/dev/sdc                           1.8T  1.5T  208G  89% /work
/dev/sdb2                          974M  225M  682M  25% /boot
/dev/sda                           2.7T  2.0T  577G  78% /home
tmpfs                               13G     0   13G   0% /run/user/1001

发现/根分区满了。/dev/mapper/ubuntu--vg-ubuntu--lv 114G 108G 0 100% /

解决

临时方案

临时解决方法是清除/tmp目录下文件

bash 复制代码
rm -rf /tmp/*

长远方案

移动tmp

如果根分区仍然紧张,且 /work(208 GB 可用)或 /home(577 GB 可用)空间充足,可把临时目录迁移过去:

以 /work 为例

bash 复制代码
sudo mkdir -p /work/tmp
sudo rsync -a /tmp/ /work/tmp/
sudo mv /tmp /tmp.old
sudo ln -s /work/tmp /tmp

或者直接修改环境变量,让 Bash 使用自定义临时目录:

bash 复制代码
mkdir -p $HOME/tmp
echo 'export TMPDIR=$HOME/tmp' >> \~/.bashrc
source \~/.bashrc

这样即使根分区满了,临时文件也会写入用户目录。

查看/根目录下的大文件,可以删除或移动它

比如发现有个swap.img

ls -lh /swap.img

复制代码
-rw------- 1 root root 8.0G Mar  3  2023 /swap.img

它是用于挂载/swap分区用的,

内存有128G,是否还需要swap分区?

对于拥有 128 GB RAM 的系统,如果不需要休眠且日常负载不出现内存耗尽,可以完全不配置 swap,或仅保留一个小的 swap 文件(4‑8 GB)作为安全垫。

如需休眠或担心极端内存峰值,则应配置相应大小的 swap(至少等于 RAM,或根据实际需求适当缩小)。

若决定 不使用 swap,只需 swapoff -a 并在 /etc/fstab 中删除或注释对应行即可。

这里选择不关闭swap,而是移动/swap的挂载位置,以下是移动步骤:

  1. 关闭当前 swap
bash 复制代码
sudo swapoff /swap.img
  1. 在新位置创建 swap 文件(以 /work/swapfile 为例,大小 8 GB)
bash 复制代码
sudo fallocate -l 8G /work/swapfile      # 或 dd if=/dev/zero of=/work/swapfile bs=1M count=8192
sudo chmod 600 /work/swapfile
sudo mkswap /work/swapfile
  1. 启用新 swap
bash 复制代码
sudo swapon /work/swapfile
修改 /etc/fstab
编辑文件,将原来的行
/swap.img none swap sw 0 0
改为

/work/swapfile none swap sw 0 0
保存后即可。
  1. 删除旧的 swap 镜像(确认新 swap 正常后)
bash 复制代码
sudo rm -f /swap.img
  1. 检查
bash 复制代码
free -h          # 查看 swap 是否在新位置
swapon -s        # 列出已启用的 swap

这样就释放了8个G的空间,另外就是可以查看系统中安装的应用,哪些是可以卸载的,卸载后也可以释放部分空间。

防止再次满盘的方法:

Docker安装Ubuntu搭建Android SDK编译环境
ubuntu18编译Android8的Failed to contact Jack server问题
linux下docker安装ubuntu
linux opensuse使用mtk烧录工具flashtool

作者:帅得不敢出门

相关推荐
Championship.23.244 小时前
Linux 3.0 锁机制与故障排查详解
linux·运维·服务器
天疆说4 小时前
Zotero Connector 在 Edge 里找不到桌面 Zotero(Linux / Zotero 9.0.6 / Edge 150)
linux·前端·edge
-SOLO-5 小时前
Android Event 日志完全指南
android
风123456789~5 小时前
【Linux专栏】ls 排除某个文件
linux·运维·服务器
壮哥_icon6 小时前
【Android 系统开发】从掉帧卡顿到丝滑:高频硬件中断(IRQ)的 CPU 亲和性性能优化实战
android·性能优化
千里马学框架6 小时前
Android Framework 新手学习踩坑建议指南
android·智能手机·性能优化·framework·aaos·车载开发·系统工程师
IT曙光6 小时前
ubuntu apt-get离线源制作
linux·ubuntu
其实防守也摸鱼6 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚7 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
玖玥拾8 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#