在Asuswrt-Merlin上编译Golang 1.14.1失败的问题

在Asuswrt-Merlin上编译Golang 1.14.1失败的问题 你好,

我尝试在安装了Entware(因此可以使用gcc/bash/git)的Asuswrt-Merlin 384.15系统上,从源代码构建Go 1.14.1。路由器型号是ASUS RT-AC88U。物理内存为512MB,并配有512MB的交换空间。

经过5小时的编译,构建过程因“设备上没有剩余空间”而失败。我该如何解决这个问题?我应该增加rootfs的大小吗?还是将$WORK目录更改为其他目录?感谢帮助。

错误信息:

admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/goroot/src# time ./all.bash 
Building Go cmd/dist using /tmp/mnt/WD12T/home/go-ac88u/go-linux-arm-bootstrap. (go1.4-bootstrap-20170531 linux/arm)
Building Go toolchain1 using /tmp/mnt/WD12T/home/go-ac88u/go-linux-arm-bootstrap.
Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
Building Go toolchain2 using go_bootstrap and Go toolchain1.
# cmd/compile/internal/ssa
compile: writing output: write $WORK/b092/_pkg_.a: no space left on device
go tool dist: FAILED: /tmp/mnt/WD12T/home/goroot/pkg/tool/linux_arm/go_bootstrap install -gcflags=all= -ldflags=all= -i cmd/asm cmd/cgo cmd/compile cmd/link: exit status 2
Command exited with non-zero status 2
real	5h 39m 32s
user	18m 4.12s
sys	3m 41.51s

admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/goroot/src# df -Th
Filesystem           Type            Size      Used Available Use% Mounted on
rootfs               rootfs         34.1M     34.1M         0 100% /
/dev/root            squashfs       34.1M     34.1M         0 100% /
devtmpfs             devtmpfs      251.4M         0    251.4M   0% /dev
tmpfs                tmpfs           2.0G     38.8M      2.0G   2% /tmp
/dev/mtdblock4       jffs2          64.0M      1.9M     62.1M   3% /jffs
/dev/sda1            ext4           10.7T      2.3T      7.9T  22% /tmp/mnt/WD12T

admin@RT-AC88U-4AF8:/tmp/home/root# cat /etc/mtab
rootfs / rootfs rw 0 0
/dev/root / squashfs ro,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=257448k,nr_inodes=64362,mode=755 0 0
proc /proc proc rw,relatime 0 0
tmpfs /tmp tmpfs rw,relatime,size=2097152k 0 0
sysfs /sys sysfs rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
/dev/mtdblock4 /jffs jffs2 rw,noatime 0 0
usbfs /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /tmp/mnt/WD12T ext4 rw,nodev,relatime,barrier=1,data=writeback 0 0

更多关于在Asuswrt-Merlin上编译Golang 1.14.1失败的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你好,@Zhang_Bo,我理解这并没有直接回答你的问题,但如果你从一台拥有更多资源的机器上进行交叉编译,是不是就可以避免遇到这个空间限制的问题了。

更多关于在Asuswrt-Merlin上编译Golang 1.14.1失败的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢您的回复。我会尝试交叉编译。

我已经从Entware应用商店找到了一个为Asuswrt-Merlin预构建的Go版本,目前正在使用它。

从错误信息看,编译失败是因为根文件系统空间不足。df -Th显示根分区只有34.1MB且已用满。Go编译过程会在$WORK目录(默认在/tmp下)生成大量中间文件,但最终安装时需要写入根文件系统的/tmp/mnt/WD12T/home/goroot/pkg目录。

解决方案是将Go安装到外部存储并设置正确的环境变量:

# 1. 清理当前失败的构建
cd /tmp/mnt/WD12T/home/goroot/src
rm -rf ../pkg ../bin

# 2. 设置环境变量,将工作目录指向tmpfs(2GB可用空间)
export GOROOT_BOOTSTRAP=/tmp/mnt/WD12T/home/go-ac88u/go-linux-arm-bootstrap
export GOROOT=/tmp/mnt/WD12T/home/goroot
export GOBIN=$GOROOT/bin
export GOPATH=/tmp/mnt/WD12T/home/gopath
export TMPDIR=/tmp/go-build  # 使用tmpfs空间

# 3. 创建工作目录
mkdir -p $TMPDIR
mkdir -p $GOPATH

# 4. 重新编译,指定工作目录
cd $GOROOT/src
./make.bash

# 或者使用更明确的环境变量设置
GOCACHE=$TMPDIR/go-cache \
GOTMPDIR=$TMPDIR \
./all.bash

如果仍然遇到空间问题,可以完全在外部存储上编译:

# 在外部存储上创建完整构建环境
cd /tmp/mnt/WD12T/home
mkdir go-build
cd go-build

# 设置所有目录到外部存储
export GOROOT_BOOTSTRAP=/tmp/mnt/WD12T/home/go-ac88u/go-linux-arm-bootstrap
export GOROOT=/tmp/mnt/WD12T/home/goroot
export GOCACHE=/tmp/mnt/WD12T/home/go-build/cache
export GOTMPDIR=/tmp/mnt/WD12T/home/go-build/tmp

# 运行编译
cd $GOROOT/src
./all.bash

编译完成后验证安装:

# 检查Go版本
/tmp/mnt/WD12T/home/goroot/bin/go version

# 设置PATH
export PATH=/tmp/mnt/WD12T/home/goroot/bin:$PATH
go version

对于路由器这种资源受限环境,也可以考虑交叉编译:

# 在x86机器上交叉编译ARM版本的Go
cd /path/to/go/src
GOOS=linux GOARCH=arm GOARM=7 ./bootstrap.bash

生成的go-linux-arm-bootstrap.tbz可以复制到路由器使用,避免在路由器上完整编译。

回到顶部