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

作者:帅得不敢出门

相关推荐
浪漫血液&18 小时前
进程调度的基本过程
服务器·进程调度
Lynnxiaowen18 小时前
今天我们开始学习Linux自动化运维Ansible基础
linux·运维·学习·自动化·云计算·ansible
NiKo_W18 小时前
Linux 传输层协议
linux·运维·网络·tcp协议·传输层·udp协议
夜月yeyue18 小时前
Linux 中断处理机制详解:上下半部、内核线程与中断线程化
linux·运维·单片机·嵌入式硬件·uboot·bootloard
YJlio18 小时前
VMMap 学习笔记(8.2):启动 VMMap、选择目标进程、权限要求与首次快照流程
服务器·笔记·学习
浪漫血液&19 小时前
Linux基础指令(简易版)
linux·服务器
云计算老刘19 小时前
1. Cockpit 管理服务器;2. Linux 软件包管理
linux·运维·服务器·云原生·云计算
程序员卷卷狗19 小时前
MySQL 慢查询优化:从定位、分析到索引调优的完整流程
android·mysql·adb
写点啥呢19 小时前
Android Studio 多语言助手插件:让多语言管理变得简单高效
android·ai·ai编程·多语言
一匹电信狗20 小时前
【C++11】Lambda表达式+新的类功能
服务器·c++·算法·leetcode·小程序·stl·visual studio