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

作者:帅得不敢出门

相关推荐
用户31187945592184 小时前
申威服务器安装Java11(swjdk-11u-9.ky10.sw_64.rpm)详细操作步骤(附安装包)
linux
ajassi20004 小时前
开源 Linux 服务器与中间件(十一)Emqx服务器消息的订阅和发送(mqtt测试)
linux·服务器·开源
雨白5 小时前
协程间的通信管道 —— Kotlin Channel 详解
android·kotlin
平生不喜凡桃李5 小时前
Linux网络层:IP
linux·运维·tcp/ip
阿方索6 小时前
虚拟化技术实践指南:KVM 与 VMware ESXi 部署全流程
linux·运维·服务器
YouEmbedded6 小时前
解码Linux文件IO之库的制作与应用
linux·动态库·静态库
野犬寒鸦6 小时前
从零起步学习MySQL || 第八章:索引深入理解及高级运用(结合常见优化问题讲解)
java·服务器·数据库·后端·mysql
半梦半醒*7 小时前
ELK1——elasticsearch
linux·运维·数据仓库·elasticsearch·centos
TimeFine7 小时前
kotlin协程 容易被忽视的CompletableDeferred
android