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

作者:帅得不敢出门

相关推荐
chlk1236 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
阿巴斯甜6 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
舒一笑6 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
Kapaseker6 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
改一下配置文件7 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
xq95277 小时前
Andorid Google 登录接入文档
android
黄林晴8 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
深紫色的三北六号16 小时前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash20 小时前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
冬奇Lab21 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读