resize2fs:Memory alloction failed while trying to resize

最近入手一块 12T 的西数红盘,打算安装到 WD MyCloud Gen1 上,从 4TB 版本升级到 12TB 版本,作为 TimeMachine 来用。

使用 拯救死翘翘了的WD MyCloud 方式恢复镜像之后,最后一步执行

$ resize2fs /dev/sda4

结果报告如下错误:

$ resize2fs /dev/sda4
resize2fs 1.42.5 (29-Jul-2012)
Resizing the filesystem on /dev/sda4 to 2928542715 (4k) blocks.
resize2fs: Memory allocation failed while trying to resize /dev/sda4
Please run 'e2fsck -fy /dev/sda4' to fix the filesystem
after the aborted resize operation.

这个原因网上查询了很久,基本上断定是 e2fsprogs 1.42.5 的 BUG,这个问题在  e2fsprogs 1.42.9 版本修复。修复内容参考代码下的 debian/changelog

关键日志如下:

e2fsprogs (1.42.9-1) unstable; urgency=low

  * Fixed a large number of bugs in resize2fs, e2fsck, debugfs, to
    handle bigalloc and 64-bit file systems.

编译过程参考 How to successfully build packages for WD My Cloud from source 中对于 e2fsprogs 1.42.13 的编译。

参考链接


WD MyCloud编译golang/git-lfs

按照How to successfully build packages for WD My Cloud from source中的介绍,搭建完成WDMyCloud的编译环境

整个 `WD MyCloud` 的编译项目,可以直接在树莓派中进行编译。只是编译`4KB`分页(主要用于编译过程)的高版本应用的时候,需要在 `raspbian-wheezy` 系统中进行编译。

在树莓派中编译 `WD MyCloud` 代码的时候,由于都是 `ARM` 环境,因此,不需要 `QEMU` 的介入,以前由于 `QEMU` 导致的问题可以规避。

推荐在树莓派4B版本上搭建编译环境,效果来看,速度还是不错的。

root@debian:~/git-lfs# DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc
dpkg-buildpackage: source package git-lfs
dpkg-buildpackage: source version 2.9.0
dpkg-buildpackage: source changed by brian m. carlson <bk2204@github.com>
dpkg-buildpackage: host architecture armhf
 dpkg-source --before-build git-lfs
 debian/rules clean
mkdir -p /tmp/gocache
GO111MODULE=on GOFLAGS=-mod=vendor GOCACHE=/tmp/gocache dh clean --buildsystem=golang --with=golang
   dh_testdir -O--buildsystem=golang
   dh_auto_clean -O--buildsystem=golang
   debian/rules override_dh_clean
make[1]: Entering directory `/root/git-lfs'
rm -f debian/debhelper.log
rm -rf man
dh_clean
make[1]: Leaving directory `/root/git-lfs'
 debian/rules build
mkdir -p /tmp/gocache
GO111MODULE=on GOFLAGS=-mod=vendor GOCACHE=/tmp/gocache dh build --buildsystem=golang --with=golang
   dh_testdir -O--buildsystem=golang
   dh_auto_configure -O--buildsystem=golang
   debian/rules override_dh_auto_build
make[1]: Entering directory `/root/git-lfs'
dh_auto_build
runtime: failed to create new OS thread (have 2 already; errno=22)
throw: runtime.newosproc

goroutine 1 [syscall]:
syscall.Syscall6()
	/build/buildd-golang_1.0.2-1.1-armhf-ygST23/golang-1.0.2/src/pkg/syscall/asm_linux_arm.s:42 +0x8
syscall.setsockopt(0x3, 0x29, 0x1a, 0x10960248, 0x4, ...)
	/usr/lib/go/src/pkg/syscall/zsyscall_linux_arm.go:1101 +0x68
syscall.SetsockoptInt(0x3, 0x29, 0x1a, 0x0, 0x0, ...)
	/usr/lib/go/src/pkg/syscall/syscall_linux.go:478 +0x6c
net.probeIPv6Stack(0xff0000, 0x10960240)
	/usr/lib/go/src/pkg/net/ipsock_posix.go:41 +0x2a0
net.init()
	/usr/lib/go/src/pkg/net/unixsock_posix.go:-2932 +0x7d4
net/http.init()
	/usr/lib/go/src/pkg/net/http/transport.go:753 +0x84
main.init()
	/usr/lib/go/src/cmd/go/vet.go:37 +0xa8

goroutine 2 [runnable]:
created by runtime.main
	/build/buildd-golang_1.0.2-1.1-armhf-ygST23/golang-1.0.2/src/pkg/runtime/proc.c:221
runtime: failed to create new OS thread (have 2 already; errno=22)
throw: runtime.newosproc

goroutine 1 [syscall]:
syscall.Syscall6()
	/build/buildd-golang_1.0.2-1.1-armhf-ygST23/golang-1.0.2/src/pkg/syscall/asm_linux_arm.s:42 +0x8
syscall.setsockopt(0x3, 0x29, 0x1a, 0x10960248, 0x4, ...)
	/usr/lib/go/src/pkg/syscall/zsyscall_linux_arm.go:1101 +0x68
syscall.SetsockoptInt(0x3, 0x29, 0x1a, 0x0, 0x0, ...)
	/usr/lib/go/src/pkg/syscall/syscall_linux.go:478 +0x6c
net.probeIPv6Stack(0xff0000, 0x10960240)
	/usr/lib/go/src/pkg/net/ipsock_posix.go:41 +0x2a0
net.init()
	/usr/lib/go/src/pkg/net/unixsock_posix.go:-2932 +0x7d4
net/http.init()
	/usr/lib/go/src/pkg/net/http/transport.go:753 +0x84
main.init()
	/usr/lib/go/src/cmd/go/vet.go:37 +0xa8

goroutine 2 [runnable]:
created by runtime.main
	/build/buildd-golang_1.0.2-1.1-armhf-ygST23/golang-1.0.2/src/pkg/runtime/proc.c:221
dh_auto_build: go install -v returned exit code 2
make[1]: *** [override_dh_auto_build] Error 2
make[1]: Leaving directory `/root/git-lfs'
make: *** [build] Error 2
dpkg-buildpackage: error: debian/rules build gave error exit status 2

这个问题产生的原因是在`qemu`中创建线程/进程的时候,要求增加`CLONE_SYSVSEM`标志,否则会出现异常。 `go`在创建线程/进程的时候,没有指定这个标记。解决方法就是修改`src/pkg/runtime/os_linux.c`中的`void runtime·newosproc(M *mp, void *stk)`函数,在`flag`中增加`CLONE_SYSVSEM`标志。

这个问题解决起来比较复杂,我们在`x86`下面直接进行交叉编译的时候,是没办法通过编译的,我们可以通过树莓派下进行编译。树莓派使用`2015-05-05-raspbian-wheezy`版本的镜像来进行编译。

树莓派这个版本的系统问题在于  `wheezy`  的源已经被移动地址,因此更新安装软件的时候会报告 `404`  错误,我们需要手工修改一下源地址。

$ sed -i "s/wheezy/oldoldstable/g" /etc/apt/source.list

安装编译依赖

$ sudo apt-get update

$ sudo apt-get install vim

$ sudo apt-get install devscripts

下载并编译代码

$ wget http://security.debian.org/debian-security/pool/updates/main/g/golang/golang_1.3.3.orig.tar.gz

# 也可本站下载 wget http://www.mobibrw.com/wp-content/uploads/2019/11/golang_1.3.3.orig_.tar.gz -O golang_1.3.3.orig.tar.gz

$ mkdir golang_1.3.3

$ tar xvf golang_1.3.3.orig.tar.gz -C golang_1.3.3

$ cd golang_1.3.3/go 

$ wget http://security.debian.org/debian-security/pool/updates/main/g/golang/golang_1.3.3-1+deb8u2.debian.tar.xz

# 也可本站下载 wget http://www.mobibrw.com/wp-content/uploads/2019/11/golang_1.3.3-1deb8u2.debian.tar.xz

$ tar xvf golang_1.3.3-1*.debian.tar.xz

# BUG `runtime: failed to create new OS thread (have 2 already; errno=22)`
$ sed -i "s/| CLONE_THREAD/| CLONE_THREAD | CLONE_SYSVSEM/g" src/pkg/runtime/os_linux.c

$ export GOARCH=arm

$ export GOOS=linux

$ DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc

完成之后,拷贝到编译环境中并执行安装

$ dpkg -i golang-src_1.3.3-1*_armhf.deb

$ dpkg -i golang-go-linux-arm_1.3.3-1*_armhf.deb

$ dpkg -i golang-go_1.3.3-1*_armhf.deb

$ dpkg -i golang-doc_1.3.3-1*_all.deb

继续编译,报告如下错误信息:

root@debian:~/git-lfs# DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc
dpkg-buildpackage: source package git-lfs
dpkg-buildpackage: source version 2.9.0
dpkg-buildpackage: source changed by brian m. carlson <bk2204@github.com>
dpkg-buildpackage: host architecture armhf
 dpkg-source --before-build git-lfs
 debian/rules clean
mkdir -p /tmp/gocache
GO111MODULE=on GOFLAGS=-mod=vendor GOCACHE=/tmp/gocache dh clean --buildsystem=golang --with=golang
   dh_testdir -O--buildsystem=golang
   dh_auto_clean -O--buildsystem=golang
   debian/rules override_dh_clean
make[1]: Entering directory `/root/git-lfs'
rm -f debian/debhelper.log
rm -rf man
dh_clean
make[1]: Leaving directory `/root/git-lfs'
 debian/rules build
mkdir -p /tmp/gocache
GO111MODULE=on GOFLAGS=-mod=vendor GOCACHE=/tmp/gocache dh build --buildsystem=golang --with=golang
   dh_testdir -O--buildsystem=golang
   dh_auto_configure -O--buildsystem=golang
   debian/rules override_dh_auto_build
make[1]: Entering directory `/root/git-lfs'
dh_auto_build
fatal error: rt_sigaction failure

runtime stack:
runtime.throw(0x51f24d)
	/usr/lib/go/src/pkg/runtime/panic.c:520 +0x5c
runtime.setsig(0x40, 0x7d5ec, 0x523901)
	/usr/lib/go/src/pkg/runtime/os_linux.c:309 +0xbc
runtime.initsig()
	/usr/lib/go/src/pkg/runtime/signal_unix.c:39 +0x94
runtime.mstart()
	/usr/lib/go/src/pkg/runtime/proc.c:621 +0x80

goroutine 16 [runnable]:
runtime.main()
	/usr/lib/go/src/pkg/runtime/proc.c:207
runtime.goexit()
	/usr/lib/go/src/pkg/runtime/proc.c:1445
fatal error: rt_sigaction failure

runtime stack:
runtime.throw(0x51f24d)
	/usr/lib/go/src/pkg/runtime/panic.c:520 +0x5c
runtime.setsig(0x40, 0x7d5ec, 0x523901)
	/usr/lib/go/src/pkg/runtime/os_linux.c:309 +0xbc
runtime.initsig()
	/usr/lib/go/src/pkg/runtime/signal_unix.c:39 +0x94
runtime.mstart()
	/usr/lib/go/src/pkg/runtime/proc.c:621 +0x80

goroutine 16 [runnable]:
runtime.main()
	/usr/lib/go/src/pkg/runtime/proc.c:207
runtime.goexit()
	/usr/lib/go/src/pkg/runtime/proc.c:1445
dh_auto_build: go install -v returned exit code 2
make[1]: *** [override_dh_auto_build] Error 2
make[1]: Leaving directory `/root/git-lfs'
make: *** [build] Error 2
dpkg-buildpackage: error: debian/rules build gave error exit status 2

这个问题产生的原因是在`qemu`中无法处理编号为 64 的信号(`Qemu rejects rt_sigaction of SIGRTMAX (64).`),我们需要忽略这个信号。解决方法就是修改`src/pkg/runtime/os_linux.c`中的`void
runtime·setsig(int32 i, GoSighandler *fn, bool restart)`函数,忽略这个信号。

# BUG `fatal error: rt_sigaction failure`
$ sed -i "s/runtime·rt_sigaction(i, \&sa, nil, sizeof(sa.sa_mask)) != 0/runtime·rt_sigaction(i, \&sa, nil, sizeof(sa.sa_mask)) != 0 \&\& i != 64/g" src/pkg/runtime/os_linux.c

$ export GOARCH=arm 

$ export GOOS=linux

$ DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc

完成之后,拷贝到编译环境中并执行安装

$ dpkg -i golang-src_1.3.3-1*_armhf.deb

$ dpkg -i golang-doc_1.3.3-1*_all.deb

$ dpkg -i golang-go-linux-arm_1.3.3-1*_armhf.deb

$ dpkg -i golang-go_1.3.3-1*_armhf.deb

编译环境安装完成之后,可以成功编译`golang-1.3.3`,中途可能会失败,失败之后,重新编译可以通过。

编译 `golang-1.4` ,由于 `golang-1.4` 的特殊性,任何高于 `golang-1.4` 版本的 `golang` ,都需要 `golang-1.4` 的编译环境才能开始编译安装!
我们依旧需要在树莓派环境中 `raspbian-wheezy` && `WD MyCloud` 编译,如下:

$ git clone https://salsa.debian.org/go-team/compiler/golang.git -b debian/2%1.4.3-3	 	 

# 也可下载一份拷贝 wget https://salsa.debian.org/go-team/compiler/golang/-/archive/debian/2%251.4.3-3/golang-debian-2%251.4.3-3.tar.gz	 	 
# 也可本站下载一份代码拷贝 wget http://www.mobibrw.com/wp-content/uploads/2019/11/golang-debian-21.4.3-3.tar.gz -O golang-debian-2%251.4.3-3.tar.gz	 	 
# tar xvf golang-debian-2%1.4.3-3.tar.gz	 	 
# mv golang-debian-2%1.4.3-3 golang	 	 

$ cd golang	 	 

# BUG `fatal error: rt_sigaction failure` 	 	 
$ sed -i "s/runtime·rt_sigaction(i, \&sa, nil, sizeof(sa.sa_mask)) != 0/runtime·rt_sigaction(i, \&sa, nil, sizeof(sa.sa_mask)) != 0 \&\& i != 64/g" src/runtime/os_linux.c	 	 

# BUG `runtime: failed to create new OS thread (have 2 already; errno=22)`	 	 
$ sed -i "s/| CLONE_THREAD/| CLONE_THREAD | CLONE_SYSVSEM/g" src/runtime/os_linux.c	 	 

# 如果使用 go 1.4.3 编译 go 1.4.3 可能会报告如下三个错误,如果使用 go 1.3.3 编译 go 1.4.3不会出现错误	 	 
#--- FAIL: TestParseInLocation (0.02s)	 	 
# format_test.go:202: ParseInLocation(Feb 01 2013 AST, Baghdad) = 2013-02-01 00:00:00 +0000 AST, want 2013-02-01 00:00:00 +0300 +03	 	 
#--- FAIL: TestLoadFixed (0.00s)	 	 
# time_test.go:929: Now().In(loc).Zone() = "-01", -3600, want "GMT+1", -36	 	 
$ rm -rf src/time/format_test.go	 	 

# time_test.go:929: Now().In(loc).Zone() = "-01", -3600, want "GMT+1", -36	 	 
$ rm -rf src/time/time_test.go	 	 

# file_test.go:121: WriteTo failed: write ip: bad address	 	 
$ rm -rf src/net/file_test.go	 	 

$ export GOARCH=arm
	 	 
$ export GOOS=linux 	 	 
 	 	 
$ DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc

完成之后,拷贝到编译环境中并执行安装

$ dpkg -i golang-src_1.4.3-3_armhf.deb	 	 

$ dpkg -i golang-go_1.4.3-3_armhf.deb	 	 

$ dpkg -i golang-doc_1.4.3-3_all.deb	 	 

$ dpkg -i golang-go-linux-arm_1.4.3-3_armhf.deb	 	 

$ dpkg -i golang_1.4.3-3_all.deb

我们需要在 `golang 1.4.3` 环境中继续编译,可以在 `golang 1.3.3` 中运行:

$ cd ~/wdmc-build/64k-wheezy
 
$ sudo chroot build
 
$ mount -t proc none /proc
$ mount -t devtmpfs none /dev
$ mount -t devpts none /dev/pts
 
$ export DEBIAN_FRONTEND=noninteractive
$ export DEBCONF_NONINTERACTIVE_SEEN=true
$ export LC_ALL=C
$ export LANGUAGE=C
$ export LANG=C
$ export DEB_CFLAGS_APPEND='-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE'
$ export DEB_BUILD_OPTIONS=nocheck

$ cd root

$ git clone https://github.com/git-lfs/git-lfs.git

# 或者本站下载一份拷贝 wget http://www.mobibrw.com/wp-content/uploads/2019/11/git-lfs.zip

$ git checkout v1.2.1

$ DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc

可以本站下载:
golang_1.3.3-1deb8u2.dsc
golang_1.3.3-1+deb8u2.debian.tar.xz
golang_1.3.3.orig.tar.gz
修改完`BUG`之后编译好的 golang_1.3.3-1.deb(4KB分页)/golang_1.4.3-3.deb(4KB分页)用于编译环境使用,不能在`WD MyCloud`上使用。

参考链接


基于APC BK650-CH UPS连接群晖DS718+通过NUT(Network UPS Tools)实现WDMyCloud Gen1断电自动关机

最近新入手了 群晖 `DS718+`,鉴于群晖断电容易损坏硬盘的传说,为了保证设备的安全,特别购入了 `APC BK650-CH UPS` 。

`APC BK650-CH UPS` 有多个电源插槽,可以同时为多个设备提供断电保护,但是 `APC BK650-CH UPS` 只有一个 `USB` 设备接口,这个接口用来提供电源状态信息,比如是否断电,当前电量信息等数据。这就造成收到断电通知的只能有一个设备,这个设备必须通过网络通知其他设备,才能实现全部的断电通知。

继续阅读基于APC BK650-CH UPS连接群晖DS718+通过NUT(Network UPS Tools)实现WDMyCloud Gen1断电自动关机

软件磁盘阵列(RAID)

RAID软件磁盘阵列

RAID 即廉价磁盘冗余阵列,其高可用性和可靠性适用于大规模环境中,相比正常使用,数据更需要被保护。RAID 是将多个磁盘整合的大磁盘,不仅具有存储功能,同时还有数据保护功能.

软件磁盘整列通过mdadm命令创建.

RAID等级

  • RAID-0: 等量模式,stripe,性能较佳,磁盘利用率100%
  • RAID-1: 镜像模式,mirror,安全性较佳,磁盘利用率50%
  • RAID-0+1: 先组成RAID-0,再有RAID-0组成RAID-1 性能安全兼顾,磁盘利用率50%
  • RAID-1+0:先组成RAID-1,再有RAID-1组成RAID-0  性能安全兼顾,磁盘利用率50%
  • RAID-5: 等量模式与分布式奇偶校验,性能与安全份均衡,磁盘可用量等于n-1
  • RAID-6: 等量模式与双分布式奇偶校验,性能与安全均衡,磁盘可用量等于n-2

继续阅读软件磁盘阵列(RAID)

利用rsync断点续传scp中断的文件传输

服务器经常需要备份,但是长时间的下载,难免会出现下载中断的情况。

一直使用scp下载备份好的文件,以前数据量少的时候,直接重新下载就可以了。随着网站上数据越来越多,下载的时间越来越长,完全重新开始变得不现实了。有时候下载到90%以上的时候,失败了,完全重传是没有必要的。

我们只需要下载缺失的部分就好了,幸运的是rsync支持这种需求。

具体的做法是将如下的选项组合传递给rsync-checksum(文件分块计算校验和,只传输校验和不一致的部分),-in-place(将文件原地替换,因为rsync通常会写一个临时文件,然后移动)和-no-whole-file(告诉rsync不要复制整个文件,而是使用deltas(部分传输))。

例如:

$ rsync -Pa --checksum --inplace --no-whole-file --progress remote.server:file local.file

下面是一个真实的例子:

$ rsync -Pa --checksum --inplace --no-whole-file --progress -e 'ssh -p 22' user@www.mobibrw.com:~/backup/wordpress.20181203.tar.gz wordpress.20181203.tar.gz

receiving incremental file list
sent 19 bytes  received 76 bytes  0.22 bytes/sec
total size is 8379088896  speedup is 88200935.75

整个过程非常的快,比完全重传快多了。

scp命令拷贝文件非常好用,但在拷贝大文件时存在一个问题就是连接经常会断开,此时再使用scp进行拷贝会重新拷贝文件,为了解决这个问题。我们可以使用rsync命令来进行断点续传。命令如下:

$ rsync -P --rsh=ssh xxx.zip 192.168.0.1:~/

为了使用方便可以设置alias:

$ alias rscp="rsync -P --rsh=ssh"

参考链接


WD MyCloud编译git-2.19

目前,能编译通过,但是安装的时候,依赖关系不正确,估计还是需要继续调整编译配置文件才行。
1.按照How to successfully build packages for WD My Cloud from source中的介绍,搭建完成WDMyCloud的编译环境2.从高版本Debian源里下载git-2.19的源代码包,然后手工编译,如下:

$ cd ~/wdmc-build/64k-wheezy

#https://packages.debian.org
$ su

$ cd build/root

$ mkdir git

$ cd git

$ wget http://http.debian.net/debian/pool/main/g/git/git_2.19.1+next.20181026.orig.tar.gz

$ wget http://http.debian.net/debian/pool/main/g/git/git_2.19.1+next.20181026-1.debian.tar.xz

$ cd ../../../ 

$ chroot build

$ mount -t proc none /proc
$ mount -t devtmpfs none /dev
$ mount -t devpts none /dev/pts

$ export DEBIAN_FRONTEND=noninteractive
$ export DEBCONF_NONINTERACTIVE_SEEN=true
$ export LC_ALL=C
$ export LANGUAGE=C
$ export LANG=C
$ export DEB_CFLAGS_APPEND='-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE'
$ export DEB_BUILD_OPTIONS=nocheck

$ cd root/git

# 当前的压缩文件,解压缩出的文件目录是”0250525e“
$ tar xvf *.orig.tar.gz

$ tar xvf *.debian.tar.xz -C 0250525e/

$ cd 0250525e

# 解决不能正确编译的问题
$ sed -i "s/dh \$\@ --with apache2/dh \$\@/g" debian/rules

# 交叉编译的程序,测试用例不能完全通过,我们关闭测试用例这部分
$ sed -i "s/^TEST[ \t]*=[ \t]*test/TEST=/g" debian/rules

# 安装依赖
$ apt-get update

$ apt-get upgrade

$ apt-get install asciidoc

# 此版本git默认不使用openssl,因此安装 libcurl4-gnutls-dev 而不是 ibcurl4-openssl-dev
$ apt-get install libcurl4-gnutls-dev

$ apt-get install  libpcre2-dev

# DEB_BUILD_OPTIONS="nocheck nodoc" 不需要测试用例,不需要帮助文档, 目前如果设置了"nodoc",最后打包的时候会缺少文件
$ DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc

如果出现如下错误信息:

make[1]: Entering directory `/root/git/0250525e'
dh_install --arch
Can't exec "/root/git/0250525e/debian/git.install": No such file or directory at /usr/share/perl5/Debian/Debhelper/Dh_Lib.pm line 643.
dh_install: cannot run debian/git.install: No such file or directory
make[1]: *** [override_dh_install-arch] Error 2
make[1]: Leaving directory `/root/git/0250525e'
make: *** [binary] Error 2
dpkg-buildpackage: error: debian/rules binary gave error exit status 2

原因是低版本的系统上缺少几个无关紧要的文件,直接忽略这部分即可:

$ rm -rf debian/git.install

$ rm -rf debian/git-el.install

# 重新编译
$ DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc

如果出现如下错误信息:

dh_installdeb: unknown dpkg-maintscript-helper command: dir_to_symlink
make: *** [binary] Error 25
dpkg-buildpackage: error: debian/rules binary gave error exit status 2

原因为dpkg的版本太低,导致部分命令无法正确执行,执行如下命令即可:

$ rm -rf debian/git.maintscript

# 重新编译 
$ DEB_BUILD_OPTIONS="nocheck" dpkg-buildpackage -d -b -uc

 

如果上述源代码的下载存在问题,可以本站下载一份文件拷贝:

git_2.19.1+next.20181026.orig.tar

git_2.19.1+next.20181026-1.debian.tar

参考链接


WD MyCloud编译的busybox-1.23.2中增加e2fsprogs-1.43.7

参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出来的镜像中缺少mkfs.ext3,mkfs.ext4,无法创建GPT分区,我们在此介绍一下如何增加mkfs.ext3,mkfs.ext4的功能。

首先参考Ubuntu 17.10上使用crosstool-ng-1.23.0建立WD MyCloud修复工具编译环境(uClibc)创建我们需要的编译工具。

接着参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出启动镜像。

具体编译过程如下:

$ cd ~

$ wget https://nchc.dl.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.43.7/e2fsprogs-1.43.7.tar.gz

$ tar -zxvf e2fsprogs-1.43.7.tar.gz

$ cd e2fsprogs-1.43.7

$ ./configure --host=arm-unknown-linux-uclibcgnueabihf --prefix=`pwd`/e2fsprogs_arm/ --disable-nls

$ make

$ make install

$ cp ~/e2fsprogs-1.43.7/e2fsprogs_arm/sbin/mkfs.ext4 ~/mycloud/extrafiles/sbin/mkfs.ext4 
 
$ cp ~/e2fsprogs-1.43.7/e2fsprogs_arm/sbin/mkfs.ext3 ~/mycloud/extrafiles/sbin/mkfs.ext3

#可以简单的把整个sysroot直接拷贝过来,但是无用文件太多,导致最后的文件太大了,因此我们只提取我们自己需要的文件出来
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/ld-uClibc* ~/mycloud/extrafiles/lib/
 
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/libc.so* ~/mycloud/extrafiles/lib/
 
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/libuClibc-* ~/mycloud/extrafiles/lib/
 
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/usr/lib/libc.so ~/mycloud/extrafiles/usr/lib/libc.so
 
#打包成压缩包,稍后我们的脚本会在找到这个压缩包后,打包进入镜像
$ cd ~/mycloud/extrafiles
$ tar -cvzf extrafiles.tar.gz *
$ mv extrafiles.tar.gz ../

重新打包uImage镜像

$ cd ~/mycloud

$ ./build-sys.sh

如果e2fsprogs-1.43.7的源代码不能下载,可从本站下载一份代码拷贝。点击这里下载

参考链接


WD MyCloud编译的busybox-1.23.2中增加mdadm-3.2.6(独立编译uClibc版本)

参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出来的镜像中缺少mdadm,无法创建Raid-1分区,我们在此介绍一下如何增加mdadm-3.2.6的功能。

首先参考Ubuntu 17.10上使用crosstool-ng-1.23.0建立WD MyCloud修复工具编译环境(uClibc)创建我们需要的编译工具。

接着参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出启动镜像。

具体编译过程如下:

$ cd ~

$ wget https://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-3.2.6.tar.xz

$ tar -xvf mdadm-3.2.6.tar.xz

$ cd mdadm-3.2.6

$ export PATH=$PATH:~/x-tools/arm-unknown-linux-uclibcgnueabihf/bin/

$ ./configure --host=arm-unknown-linux-uclibcgnueabihf --prefix=`pwd`/mdadm_arm/

$ make "CFLAGS += -D_BYTESWAP_H=1 -O3"

$ mkdir ~/mycloud/extrafiles
 
$ mkdir ~/mycloud/extrafiles/sbin

$ mkdir ~/mycloud/extrafiles/lib
 
$ mkdir -p ~/mycloud/extrafiles/usr/lib
 
$ cp -r ~/mdadm-3.2.6/mdadm ~/mycloud/extrafiles/sbin/mdadm
 
#可以简单的把整个sysroot直接拷贝过来,但是无用文件太多,导致最后的文件太大了,因此我们只提取我们自己需要的文件出来
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/ld-uClibc* ~/mycloud/extrafiles/lib/
 
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/libc.so* ~/mycloud/extrafiles/lib/
 
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/libuClibc-* ~/mycloud/extrafiles/lib/
 
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/usr/lib/libc.so ~/mycloud/extrafiles/usr/lib/libc.so
 
#打包成压缩包,稍后我们的脚本会在找到这个压缩包后,打包进入镜像
$ cd ~/mycloud/extrafiles
$ tar -cvzf extrafiles.tar.gz *
$ mv extrafiles.tar.gz ../

重新打包uImage镜像

$ cd ~/mycloud

$ ./build-sys.sh

其他操作参照更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)

参考链接


WD MyCloud编译的busybox-1.23.2中增加parted-3.0/parted-2.3

参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出来的镜像中缺少parted,无法创建GPT分区,我们在此介绍一下如何增加parted-3.0/parted-2.3的功能。

首先参考Ubuntu 17.10上使用crosstool-ng-1.23.0建立WD MyCloud修复工具编译环境(uClibc)创建我们需要的编译工具。

接着参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出启动镜像。

然后下载并编译libuuid-1.0.3的源代码

$ cd ~

$ wget https://nchc.dl.sourceforge.net/project/libuuid/libuuid-1.0.3.tar.gz

$ tar -zxvf libuuid-1.0.3.tar.gz

$ export PATH=$PATH:~/x-tools/arm-unknown-linux-uclibcgnueabihf/bin/

$ cd libuuid-1.0.3

$ ./configure --host=arm-unknown-linux-uclibcgnueabihf --prefix=`pwd`/uuid_arm/

$ make 

$ make install

然后下载并编译parted-3.0/parted-2.3的源代码

$ cd ~

$ wget http://ftp.gnu.org/gnu/parted/parted-3.0.tar.xz

$ tar -xvf parted-3.0.tar.xz

$ cd parted-3.0

$ export PATH=$PATH:~/x-tools/arm-unknown-linux-uclibcgnueabihf/bin/

$ export LD_LIBRARY_PATH=~/libuuid-1.0.3/uuid_arm/lib/:$LD_LIBRARY_PATH

$ ./configure --host=arm-unknown-linux-uclibcgnueabihf --disable-device-mapper --without-readline --disable-nls LDFLAGS="-L`echo ~`/libuuid-1.0.3/uuid_arm/lib" CFLAGS="-I`echo ~`/libuuid-1.0.3/uuid_arm/include/ -DGNULIB_defined_struct_option" --prefix=`pwd`/parted_arm/

#调整几处编译问题
$ sed -i 's/_GL_CXXALIASWARN[ \t]*(gets)/\/\/_GL_CXXALIASWARN \(gets\)/g' ~/parted-3.0/lib/stdio.in.h

$ sed -i 's/_GL_WARN_ON_USE[ \t]*(gets/\/\/_GL_WARN_ON_USE (gets/g' ~/parted-2.3/lib/stdio.in.h

$ make 

$ make install

完成后,打包我们刚刚构建的应用

$ mkdir ~/mycloud/extrafiles

$ mkdir ~/mycloud/extrafiles/lib

$ mkdir -p ~/mycloud/extrafiles/usr/lib

$ cp -r ~/parted-3.0/parted_arm/* ~/mycloud/extrafiles 

$ cp -r ~/libuuid-1.0.3/uuid_arm/* ~/mycloud/extrafiles

#可以简单的把整个sysroot直接拷贝过来,但是无用文件太多,导致最后的文件太大了,因此我们只提取我们自己需要的文件出来
$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/ld-uClibc* ~/mycloud/extrafiles/lib/

$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/libc.so* ~/mycloud/extrafiles/lib/

$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/lib/libuClibc-* ~/mycloud/extrafiles/lib/

$ cp ~/x-tools/arm-unknown-linux-uclibcgnueabihf/arm-unknown-linux-uclibcgnueabihf/sysroot/usr/lib/libc.so ~/mycloud/extrafiles/usr/lib/libc.so

#打包成压缩包,稍后我们的脚本会在找到这个压缩包后,打包进入镜像
$ cd ~/mycloud/extrafiles
$ tar -cvzf extrafiles.tar.gz *
$ mv extrafiles.tar.gz ../

重新打包uImage镜像

$ cd ~/mycloud

$ ./build-sys.sh

其他操作参照更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)

上面涉及到的源代码,如果不能下载成功,可以从本站下载一份代码拷贝。点击这里下载libuuid-1.0.3点击这里下载parted-2.3, 点击这里下载parted-3.0

参考链接


Building a minimal RootFS with Busybox, GLIBC and DropBear

Ubuntu 17.10上使用crosstool-ng-1.23.0建立WD MyCloud修复工具编译环境(uClibc)

参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)编译出来的Busybox是只有3MB大小的样子,这样编译出来的东西非常基础,功能有限。如果想要增加其他软件的时候,最少改动的情况下,一般都依赖GLIBC,而GLIBC完整编译出来的库接近50MB,而我们修复系统,是一个纯内存文件系统。直接采用GLIBC会非常浪费不多的内存空间。

因此在低内存的系统上采用uClibc,变成一个不错的选择。下面我们讲一下如何通过crosstool-ng-1.23.0构建一个我们需要的编译系统出来。

首先编译crosstool-ng-1.23.0源代码

$ sudo apt-get update
$ sudo apt-get upgrade

$ sudo apt-get -y install autoconf
$ sudo apt-get -y install gperf
$ sudo apt-get -y install bison
$ sudo apt-get -y install flex
$ sudo apt-get -y install texinfo
$ sudo apt-get -y install help2man
$ sudo apt-get -y install ncurses-dev

$ cd ~

$ git clone https://github.com/crosstool-ng/crosstool-ng

$ cd crosstool-ng

$ ./bootstrap

$ ./configure --prefix=`echo ~`/wd_crosstool

$ make

$ make install

如果下载crosstool-ng源代码存在问题,可以从本站下载一份代码拷贝。点击此处下载

$ cd ~

$ mkdir wd_fix_toolchain

$ cd wd_fix_toolchain

$ export PATH=~/wd_crosstool/bin/:$PATH

$ cp ~/crosstool-ng/samples/arm-unknown-linux-uclibcgnueabihf/crosstool.config .config

$ ct-ng oldconfig

#默认一路回车,只是注意,中间选择Linux内核版本的使用,选择使用Linux 3.2 CT_LINUX_V_3_2=y

$ ct-ng build

最终的.config文件,可以参考下面的配置信息,或者简单的拷贝这个文件到编译目录即可

#
# Automatically generated file; DO NOT EDIT.
# crosstool-NG crosstool-ng-1.23.0-280-g01e32905 Configuration
#
CT_CONFIGURE_has_static_link=y
CT_CONFIGURE_has_wget=y
CT_CONFIGURE_has_stat_flavor_GNU=y
CT_CONFIGURE_has_make_3_81_or_newer=y
CT_CONFIGURE_has_autoconf_2_63_or_newer=y
CT_CONFIGURE_has_autoreconf_2_63_or_newer=y
CT_CONFIGURE_has_automake_1_15_or_newer=y
CT_CONFIGURE_has_gnu_m4_1_4_12_or_newer=y
CT_CONFIGURE_has_git=y
CT_MODULES=y

#
# Paths and misc options
#

#
# crosstool-NG behavior
#
# CT_OBSOLETE is not set
CT_EXPERIMENTAL=y
# CT_ALLOW_BUILD_AS_ROOT is not set
# CT_DEBUG_CT is not set

#
# Paths
#
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
CT_SAVE_TARBALLS=y
CT_WORK_DIR="${CT_TOP_DIR}/.build"
CT_BUILD_TOP_DIR="${CT_WORK_DIR}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}"
CT_PREFIX_DIR="${CT_PREFIX:-${HOME}/x-tools}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}"
CT_RM_RF_PREFIX_DIR=y
CT_REMOVE_DOCS=y
CT_PREFIX_DIR_RO=y
CT_STRIP_HOST_TOOLCHAIN_EXECUTABLES=y
# CT_STRIP_TARGET_TOOLCHAIN_EXECUTABLES is not set

#
# Downloading
#
CT_DOWNLOAD_AGENT_WGET=y
# CT_DOWNLOAD_AGENT_NONE is not set
# CT_FORBID_DOWNLOAD is not set
# CT_FORCE_DOWNLOAD is not set
CT_CONNECT_TIMEOUT=10
CT_DOWNLOAD_WGET_OPTIONS="--passive-ftp --tries=3 -nc --progress=dot:binary"
# CT_ONLY_DOWNLOAD is not set
# CT_USE_MIRROR is not set
CT_VERIFY_DOWNLOAD_DIGEST=y
CT_VERIFY_DOWNLOAD_DIGEST_SHA512=y
# CT_VERIFY_DOWNLOAD_DIGEST_SHA256 is not set
# CT_VERIFY_DOWNLOAD_DIGEST_SHA1 is not set
# CT_VERIFY_DOWNLOAD_DIGEST_MD5 is not set
CT_VERIFY_DOWNLOAD_DIGEST_ALG="sha512"
# CT_VERIFY_DOWNLOAD_SIGNATURE is not set

#
# Extracting
#
# CT_FORCE_EXTRACT is not set
CT_OVERRIDE_CONFIG_GUESS_SUB=y
# CT_ONLY_EXTRACT is not set
CT_PATCH_BUNDLED=y
# CT_PATCH_LOCAL is not set
# CT_PATCH_BUNDLED_LOCAL is not set
# CT_PATCH_LOCAL_BUNDLED is not set
# CT_PATCH_NONE is not set
CT_PATCH_ORDER="bundled"

#
# Build behavior
#
CT_PARALLEL_JOBS=0
CT_LOAD=""
CT_USE_PIPES=y
CT_EXTRA_CFLAGS_FOR_BUILD=""
CT_EXTRA_LDFLAGS_FOR_BUILD=""
CT_EXTRA_CFLAGS_FOR_HOST=""
CT_EXTRA_LDFLAGS_FOR_HOST=""
# CT_CONFIG_SHELL_SH is not set
# CT_CONFIG_SHELL_ASH is not set
CT_CONFIG_SHELL_BASH=y
# CT_CONFIG_SHELL_CUSTOM is not set
CT_CONFIG_SHELL="${bash}"

#
# Logging
#
# CT_LOG_ERROR is not set
# CT_LOG_WARN is not set
# CT_LOG_INFO is not set
CT_LOG_EXTRA=y
# CT_LOG_ALL is not set
# CT_LOG_DEBUG is not set
CT_LOG_LEVEL_MAX="EXTRA"
# CT_LOG_SEE_TOOLS_WARN is not set
CT_LOG_PROGRESS_BAR=y
CT_LOG_TO_FILE=y
CT_LOG_FILE_COMPRESS=y

#
# Target options
#
# CT_ARCH_ALPHA is not set
CT_ARCH_ARM=y
# CT_ARCH_AVR is not set
# CT_ARCH_M68K is not set
# CT_ARCH_MICROBLAZE is not set
# CT_ARCH_MIPS is not set
# CT_ARCH_MSP430 is not set
# CT_ARCH_NIOS2 is not set
# CT_ARCH_POWERPC is not set
# CT_ARCH_RISCV is not set
# CT_ARCH_S390 is not set
# CT_ARCH_SH is not set
# CT_ARCH_SPARC is not set
# CT_ARCH_X86 is not set
# CT_ARCH_XTENSA is not set
CT_ARCH="arm"
CT_ARCH_CHOICE_KSYM="ARM"
CT_ARCH_CPU="arm926ej-s"
CT_ARCH_ARM_PKG_KSYM=""
CT_ARCH_ARM_MODE="arm"
CT_ARCH_ARM_MODE_ARM=y
# CT_ARCH_ARM_MODE_THUMB is not set
# CT_ARCH_ARM_INTERWORKING is not set
CT_ARCH_ARM_EABI_FORCE=y
CT_ARCH_ARM_EABI=y
CT_ARCH_ARM_TUPLE_USE_EABIHF=y
CT_ARCH_SUFFIX=""

#
# Generic target options
#
# CT_MULTILIB is not set
CT_DEMULTILIB=y
CT_ARCH_SUPPORTS_BOTH_MMU=y
CT_ARCH_DEFAULT_HAS_MMU=y
CT_ARCH_USE_MMU=y
CT_ARCH_SUPPORTS_EITHER_ENDIAN=y
CT_ARCH_DEFAULT_LE=y
# CT_ARCH_BE is not set
CT_ARCH_LE=y
# CT_ARCH_BE_LE is not set
# CT_ARCH_LE_BE is not set
CT_ARCH_ENDIAN="little"
CT_ARCH_SUPPORTS_32=y
CT_ARCH_SUPPORTS_64=y
CT_ARCH_DEFAULT_32=y
CT_ARCH_BITNESS=32
CT_ARCH_32=y
# CT_ARCH_64 is not set

#
# Target optimisations
#
CT_ARCH_SUPPORTS_WITH_ARCH=y
CT_ARCH_SUPPORTS_WITH_CPU=y
CT_ARCH_SUPPORTS_WITH_TUNE=y
CT_ARCH_SUPPORTS_WITH_FLOAT=y
CT_ARCH_SUPPORTS_WITH_FPU=y
CT_ARCH_SUPPORTS_SOFTFP=y
CT_ARCH_EXCLUSIVE_WITH_CPU=y
CT_ARCH_FPU=""
# CT_ARCH_FLOAT_AUTO is not set
CT_ARCH_FLOAT_HW=y
# CT_ARCH_FLOAT_SOFTFP is not set
# CT_ARCH_FLOAT_SW is not set
CT_TARGET_CFLAGS=""
CT_TARGET_LDFLAGS=""
CT_ARCH_FLOAT="hard"

#
# Toolchain options
#

#
# General toolchain options
#
CT_FORCE_SYSROOT=y
CT_USE_SYSROOT=y
CT_SYSROOT_NAME="sysroot"
CT_SYSROOT_DIR_PREFIX=""
CT_WANTS_STATIC_LINK=y
CT_WANTS_STATIC_LINK_CXX=y
# CT_STATIC_TOOLCHAIN is not set
CT_SHOW_CT_VERSION=y
CT_TOOLCHAIN_PKGVERSION=""
CT_TOOLCHAIN_BUGURL=""

#
# Tuple completion and aliasing
#
CT_TARGET_VENDOR="unknown"
CT_TARGET_ALIAS_SED_EXPR=""
CT_TARGET_ALIAS=""

#
# Toolchain type
#
# CT_NATIVE is not set
CT_CROSS=y
# CT_CROSS_NATIVE is not set
# CT_CANADIAN is not set
CT_TOOLCHAIN_TYPE="cross"

#
# Build system
#
CT_BUILD=""
CT_BUILD_PREFIX=""
CT_BUILD_SUFFIX=""

#
# Misc options
#
# CT_TOOLCHAIN_ENABLE_NLS is not set

#
# Operating System
#
CT_KERNEL_SUPPORTS_SHARED_LIBS=y
# CT_KERNEL_BARE_METAL is not set
CT_KERNEL_LINUX=y
CT_KERNEL="linux"
CT_KERNEL_CHOICE_KSYM="LINUX"
CT_KERNEL_LINUX_PKG_KSYM="LINUX"
CT_LINUX_DIR_NAME="linux"
CT_LINUX_PKG_NAME="linux"
CT_LINUX_SRC_RELEASE=y
# CT_LINUX_SRC_DEVEL is not set
# CT_LINUX_SRC_CUSTOM is not set
# CT_LINUX_V_4_14 is not set
# CT_LINUX_V_4_13 is not set
# CT_LINUX_V_4_12 is not set
# CT_LINUX_V_4_11 is not set
# CT_LINUX_V_4_10 is not set
# CT_LINUX_V_4_9 is not set
# CT_LINUX_V_4_4 is not set
# CT_LINUX_V_4_1 is not set
# CT_LINUX_V_3_16 is not set
# CT_LINUX_V_3_13 is not set
# CT_LINUX_V_3_12 is not set
# CT_LINUX_V_3_10 is not set
# CT_LINUX_V_3_4 is not set
CT_LINUX_V_3_2=y
# CT_LINUX_V_2_6_32 is not set
CT_LINUX_VERSION="3.2.96"
CT_LINUX_MIRRORS="$(CT_Mirrors kernel.org linux ${CT_LINUX_VERSION})"
CT_LINUX_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_LINUX_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_LINUX_ARCHIVE_FORMATS=".tar.xz .tar.gz"
CT_LINUX_SIGNATURE_FORMAT="unpacked/.sign"
CT_LINUX_3_2_or_later=y
CT_KERNEL_LINUX_VERBOSITY_0=y
# CT_KERNEL_LINUX_VERBOSITY_1 is not set
# CT_KERNEL_LINUX_VERBOSITY_2 is not set
CT_KERNEL_LINUX_VERBOSE_LEVEL=0
CT_KERNEL_LINUX_INSTALL_CHECK=y

#
# Common kernel options
#
CT_SHARED_LIBS=y

#
# Binary utilities
#
CT_ARCH_BINFMT_ELF=y
CT_BINUTILS_BINUTILS=y
CT_BINUTILS="binutils"
CT_BINUTILS_CHOICE_KSYM="BINUTILS"
CT_BINUTILS_BINUTILS_PKG_KSYM="BINUTILS"
CT_BINUTILS_DIR_NAME="binutils"
CT_BINUTILS_USE_GNU=y
CT_BINUTILS_USE="BINUTILS"
CT_BINUTILS_PKG_NAME="binutils"
CT_BINUTILS_SRC_RELEASE=y
# CT_BINUTILS_SRC_DEVEL is not set
# CT_BINUTILS_SRC_CUSTOM is not set
CT_BINUTILS_V_2_29_1=y
# CT_BINUTILS_V_2_28_1 is not set
# CT_BINUTILS_V_2_27 is not set
# CT_BINUTILS_V_2_26_1 is not set
CT_BINUTILS_VERSION="2.29.1"
CT_BINUTILS_MIRRORS="$(CT_Mirrors GNU binutils) $(CT_Mirrors sourceware binutils/releases)"
CT_BINUTILS_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_BINUTILS_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_BINUTILS_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz"
CT_BINUTILS_SIGNATURE_FORMAT="packed/.sig"
CT_BINUTILS_2_25_or_later=y
CT_BINUTILS_2_23_or_later=y

#
# GNU binutils
#
CT_BINUTILS_HAS_HASH_STYLE=y
CT_BINUTILS_HAS_GOLD=y
CT_BINUTILS_HAS_PLUGINS=y
CT_BINUTILS_HAS_PKGVERSION_BUGURL=y
CT_BINUTILS_GOLD_SUPPORTS_ARCH=y
CT_BINUTILS_GOLD_SUPPORT=y
# CT_BINUTILS_LINKER_LD is not set
# CT_BINUTILS_LINKER_GOLD is not set
CT_BINUTILS_LINKER_LD_GOLD=y
# CT_BINUTILS_LINKER_GOLD_LD is not set
CT_BINUTILS_GOLD_INSTALLED=y
CT_BINUTILS_GOLD_THREADS=y
CT_BINUTILS_LINKER_BOTH=y
CT_BINUTILS_LINKERS_LIST="ld,gold"
CT_BINUTILS_LD_WRAPPER=y
CT_BINUTILS_LINKER_DEFAULT="bfd"
CT_BINUTILS_PLUGINS=y
CT_BINUTILS_EXTRA_CONFIG_ARRAY=""
# CT_BINUTILS_FOR_TARGET is not set

#
# C-library
#
# CT_LIBC_BIONIC is not set
# CT_LIBC_GLIBC is not set
# CT_LIBC_MUSL is not set
CT_LIBC_UCLIBC=y
CT_LIBC="uClibc"
CT_LIBC_CHOICE_KSYM="UCLIBC"
CT_THREADS="nptl"
CT_LIBC_UCLIBC_PKG_KSYM="UCLIBC"
CT_UCLIBC_DIR_NAME="uClibc"
CT_UCLIBC_USE_UCLIBC_NG_ORG=y
CT_UCLIBC_USE="UCLIBC_NG"
CT_UCLIBC_NG_PKG_NAME="uClibc-ng"
CT_UCLIBC_NG_SRC_RELEASE=y
# CT_UCLIBC_NG_SRC_DEVEL is not set
# CT_UCLIBC_NG_SRC_CUSTOM is not set
CT_UCLIBC_NG_V_1_0_27=y
# CT_UCLIBC_NG_V_1_0_26 is not set
# CT_UCLIBC_NG_V_1_0_25 is not set
CT_UCLIBC_NG_VERSION="1.0.27"
CT_UCLIBC_NG_MIRRORS="http://downloads.uclibc-ng.org/releases/${CT_UCLIBC_NG_VERSION}"
CT_UCLIBC_NG_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_UCLIBC_NG_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_UCLIBC_NG_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.bz2 .tar.gz"
CT_UCLIBC_NG_SIGNATURE_FORMAT="packed/.asc"
CT_UCLIBC_1_0_15_or_later=y
CT_UCLIBC_1_0_0_or_later=y
CT_UCLIBC_0_9_33_2_or_later=y
CT_LIBC_UCLIBC_PARALLEL=y
CT_LIBC_UCLIBC_NG=y
CT_UCLIBC_MERGED_LINUXTHREADS=y
CT_LIBC_UCLIBC_VERBOSITY_0=y
# CT_LIBC_UCLIBC_VERBOSITY_1 is not set
# CT_LIBC_UCLIBC_VERBOSITY_2 is not set
CT_LIBC_UCLIBC_VERBOSITY=""
CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y
# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set
# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set
# CT_LIBC_UCLIBC_DEBUG_LEVEL_3 is not set
CT_LIBC_UCLIBC_DEBUG_LEVEL=0
CT_LIBC_UCLIBC_CONFIG_FILE=""
CT_LIBC_UCLIBC_LNXTHRD=""
# CT_LIBC_UCLIBC_LOCALES is not set
# CT_LIBC_UCLIBC_IPV6 is not set
CT_LIBC_UCLIBC_WCHAR=y
# CT_LIBC_UCLIBC_FENV is not set
# CT_LIBC_UCLIBC_RPC is not set
CT_LIBC_UCLIBC_USE_GNU_SUFFIX=y
CT_LIBC_SUPPORT_THREADS_ANY=y
CT_LIBC_SUPPORT_THREADS_NATIVE=y
CT_LIBC_SUPPORT_THREADS_LT=y
CT_LIBC_SUPPORT_THREADS_NONE=y

#
# Common C library options
#
CT_THREADS_NATIVE=y
# CT_THREADS_LT is not set
# CT_THREADS_NONE is not set
# CT_CREATE_LDSO_CONF is not set
CT_LIBC_XLDD=y

#
# C compiler
#
CT_CC_CORE_PASSES_NEEDED=y
CT_CC_CORE_PASS_1_NEEDED=y
CT_CC_CORE_PASS_2_NEEDED=y
CT_CC_SUPPORT_CXX=y
CT_CC_SUPPORT_FORTRAN=y
CT_CC_SUPPORT_ADA=y
CT_CC_SUPPORT_OBJC=y
CT_CC_SUPPORT_OBJCXX=y
CT_CC_SUPPORT_GOLANG=y
CT_CC_GCC=y
CT_CC="gcc"
CT_CC_CHOICE_KSYM="GCC"
CT_CC_GCC_PKG_KSYM="GCC"
CT_GCC_DIR_NAME="gcc"
CT_GCC_USE_GNU=y
# CT_GCC_USE_LINARO is not set
CT_GCC_USE="GCC"
CT_GCC_PKG_NAME="gcc"
CT_GCC_SRC_RELEASE=y
# CT_GCC_SRC_DEVEL is not set
# CT_GCC_SRC_CUSTOM is not set
CT_GCC_V_7_2_0=y
# CT_GCC_V_6_4_0 is not set
# CT_GCC_V_5_5_0 is not set
# CT_GCC_V_4_9_4 is not set
CT_GCC_VERSION="7.2.0"
CT_GCC_MIRRORS="$(CT_Mirrors GNU gcc/gcc-${CT_GCC_VERSION}) $(CT_Mirrors sourceware gcc/releases/gcc-${CT_GCC_VERSION})"
CT_GCC_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_GCC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_GCC_ARCHIVE_FORMATS=".tar.xz .tar.gz"
CT_GCC_SIGNATURE_FORMAT=""
CT_GCC_7_or_later=y
CT_GCC_6_or_later=y
CT_GCC_5_or_later=y
CT_GCC_4_9_2_or_later=y
CT_GCC_4_9_or_later=y
CT_GCC_4_8_or_later=y
CT_CC_GCC_ENABLE_PLUGINS=y
CT_CC_GCC_GOLD=y
CT_CC_GCC_HAS_LIBMPX=y
CT_CC_GCC_ENABLE_CXX_FLAGS=""
CT_CC_GCC_CORE_EXTRA_CONFIG_ARRAY=""
CT_CC_GCC_EXTRA_CONFIG_ARRAY=""
CT_CC_GCC_STATIC_LIBSTDCXX=y
# CT_CC_GCC_SYSTEM_ZLIB is not set
CT_CC_GCC_CONFIG_TLS=m

#
# Optimisation features
#
CT_CC_GCC_USE_GRAPHITE=y
CT_CC_GCC_USE_LTO=y

#
# Settings for libraries running on target
#
CT_CC_GCC_ENABLE_TARGET_OPTSPACE=y
# CT_CC_GCC_LIBMUDFLAP is not set
# CT_CC_GCC_LIBGOMP is not set
# CT_CC_GCC_LIBSSP is not set
# CT_CC_GCC_LIBQUADMATH is not set

#
# Misc. obscure options.
#
CT_CC_CXA_ATEXIT=y
# CT_CC_GCC_DISABLE_PCH is not set
CT_CC_GCC_SJLJ_EXCEPTIONS=m
CT_CC_GCC_LDBL_128=m
# CT_CC_GCC_BUILD_ID is not set
CT_CC_GCC_LNK_HASH_STYLE_DEFAULT=y
# CT_CC_GCC_LNK_HASH_STYLE_SYSV is not set
# CT_CC_GCC_LNK_HASH_STYLE_GNU is not set
# CT_CC_GCC_LNK_HASH_STYLE_BOTH is not set
CT_CC_GCC_LNK_HASH_STYLE=""
CT_CC_GCC_DEC_FLOAT_AUTO=y
# CT_CC_GCC_DEC_FLOAT_BID is not set
# CT_CC_GCC_DEC_FLOAT_DPD is not set
# CT_CC_GCC_DEC_FLOATS_NO is not set

#
# Additional supported languages:
#
CT_CC_LANG_CXX=y
# CT_CC_LANG_FORTRAN is not set
# CT_CC_LANG_ADA is not set
# CT_CC_LANG_OBJC is not set
# CT_CC_LANG_OBJCXX is not set
# CT_CC_LANG_GOLANG is not set
CT_CC_LANG_OTHERS=""

#
# Debug facilities
#
CT_DEBUG_DUMA=y
CT_DEBUG_DUMA_PKG_KSYM="DUMA"
CT_DUMA_DIR_NAME="duma"
CT_DUMA_PKG_NAME="duma"
CT_DUMA_SRC_RELEASE=y
# CT_DUMA_SRC_DEVEL is not set
# CT_DUMA_SRC_CUSTOM is not set
CT_DUMA_V_2_5_15=y
CT_DUMA_VERSION="2_5_15"
CT_DUMA_MIRRORS="http://downloads.sourceforge.net/project/duma/duma/${CT_DUMA_VERSION//_/.}"
CT_DUMA_ARCHIVE_FILENAME="@{pkg_name}_@{version}"
CT_DUMA_ARCHIVE_DIRNAME="@{pkg_name}_@{version}"
CT_DUMA_ARCHIVE_FORMATS=".tar.gz .zip"
CT_DUMA_SIGNATURE_FORMAT=""
CT_DUMA_SO=y
CT_DUMA_CUSTOM_WRAPPER=y
CT_DEBUG_GDB=y
CT_DEBUG_GDB_PKG_KSYM="GDB"
CT_GDB_DIR_NAME="gdb"
CT_GDB_USE_GNU=y
CT_GDB_USE="GDB"
CT_GDB_PKG_NAME="gdb"
CT_GDB_SRC_RELEASE=y
# CT_GDB_SRC_DEVEL is not set
# CT_GDB_SRC_CUSTOM is not set
CT_GDB_V_8_0_1=y
# CT_GDB_V_7_12_1 is not set
# CT_GDB_V_7_11_1 is not set
CT_GDB_VERSION="8.0.1"
CT_GDB_MIRRORS="$(CT_Mirrors GNU gdb) $(CT_Mirrors sourceware gdb/releases)"
CT_GDB_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_GDB_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_GDB_ARCHIVE_FORMATS=".tar.xz .tar.gz"
CT_GDB_SIGNATURE_FORMAT=""
CT_GDB_8_0_or_later=y
CT_GDB_7_2_or_later=y
CT_GDB_7_0_or_later=y
CT_GDB_CROSS=y
CT_GDB_CROSS_STATIC=y
# CT_GDB_CROSS_SIM is not set
CT_GDB_CROSS_EXTRA_CONFIG_ARRAY=""
CT_GDB_NATIVE=y
CT_GDB_NATIVE_STATIC=y
CT_GDB_GDBSERVER=y
CT_GDB_GDBSERVER_HAS_IPA_LIB=y
# CT_GDB_GDBSERVER_STATIC is not set
# CT_GDB_GDBSERVER_STATIC_LIBSTDCXX is not set
# CT_GDB_GDBSERVER_BUILD_IPA_LIB is not set
CT_GDB_HAS_PKGVERSION_BUGURL=y
CT_GDB_HAS_PYTHON=y
CT_GDB_INSTALL_GDBINIT=y
CT_DEBUG_LTRACE=y
CT_DEBUG_LTRACE_PKG_KSYM="LTRACE"
CT_LTRACE_DIR_NAME="ltrace"
CT_LTRACE_PKG_NAME="ltrace"
CT_LTRACE_SRC_RELEASE=y
# CT_LTRACE_SRC_DEVEL is not set
# CT_LTRACE_SRC_CUSTOM is not set
CT_LTRACE_V_0_7_3=y
CT_LTRACE_VERSION="0.7.3"
CT_LTRACE_MIRRORS="http://ftp.debian.org/debian/pool/main/l/ltrace ftp:://ftp.debian.org/debian/pool/main/l/ltrace"
CT_LTRACE_ARCHIVE_FILENAME="@{pkg_name}_@{version}.orig"
CT_LTRACE_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_LTRACE_ARCHIVE_FORMATS=".tar.bz2"
CT_LTRACE_SIGNATURE_FORMAT=""
CT_DEBUG_STRACE=y
CT_DEBUG_STRACE_PKG_KSYM="STRACE"
CT_STRACE_DIR_NAME="strace"
CT_STRACE_PKG_NAME="strace"
CT_STRACE_SRC_RELEASE=y
# CT_STRACE_SRC_DEVEL is not set
# CT_STRACE_SRC_CUSTOM is not set
CT_STRACE_V_4_20=y
# CT_STRACE_V_4_19 is not set
# CT_STRACE_V_4_18 is not set
# CT_STRACE_V_4_17 is not set
# CT_STRACE_V_4_16 is not set
# CT_STRACE_V_4_15 is not set
CT_STRACE_VERSION="4.20"
CT_STRACE_MIRRORS="http://downloads.sourceforge.net/project/strace/strace/${CT_STRACE_VERSION}"
CT_STRACE_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_STRACE_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_STRACE_ARCHIVE_FORMATS=".tar.xz"
CT_STRACE_SIGNATURE_FORMAT=""

#
# Companion libraries
#
# CT_COMPLIBS_CHECK is not set
# CT_COMP_LIBS_CLOOG is not set
CT_COMP_LIBS_EXPAT=y
CT_COMP_LIBS_EXPAT_PKG_KSYM="EXPAT"
CT_EXPAT_DIR_NAME="expat"
CT_EXPAT_PKG_NAME="expat"
CT_EXPAT_SRC_RELEASE=y
# CT_EXPAT_SRC_DEVEL is not set
# CT_EXPAT_SRC_CUSTOM is not set
CT_EXPAT_V_2_2_5=y
CT_EXPAT_VERSION="2.2.5"
CT_EXPAT_MIRRORS="http://downloads.sourceforge.net/project/expat/expat/${CT_EXPAT_VERSION}"
CT_EXPAT_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_EXPAT_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_EXPAT_ARCHIVE_FORMATS=".tar.bz2"
CT_EXPAT_SIGNATURE_FORMAT=""
# CT_COMP_LIBS_GETTEXT is not set
CT_COMP_LIBS_GMP=y
CT_COMP_LIBS_GMP_PKG_KSYM="GMP"
CT_GMP_DIR_NAME="gmp"
CT_GMP_PKG_NAME="gmp"
CT_GMP_SRC_RELEASE=y
# CT_GMP_SRC_DEVEL is not set
# CT_GMP_SRC_CUSTOM is not set
CT_GMP_V_6_1_2=y
CT_GMP_VERSION="6.1.2"
CT_GMP_MIRRORS="https://gmplib.org/download/gmp https://gmplib.org/download/gmp/archive $(CT_Mirrors GNU gmp)"
CT_GMP_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_GMP_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_GMP_ARCHIVE_FORMATS=".tar.xz .tar.lz .tar.bz2"
CT_GMP_SIGNATURE_FORMAT="packed/.sig"
CT_GMP_5_1_or_later=y
CT_COMP_LIBS_ISL=y
CT_COMP_LIBS_ISL_PKG_KSYM="ISL"
CT_ISL_DIR_NAME="isl"
CT_ISL_PKG_NAME="isl"
CT_ISL_SRC_RELEASE=y
# CT_ISL_SRC_DEVEL is not set
# CT_ISL_SRC_CUSTOM is not set
CT_ISL_V_0_18=y
# CT_ISL_V_0_17_1 is not set
# CT_ISL_V_0_16_1 is not set
# CT_ISL_V_0_15 is not set
CT_ISL_VERSION="0.18"
CT_ISL_MIRRORS="http://isl.gforge.inria.fr"
CT_ISL_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_ISL_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_ISL_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz"
CT_ISL_SIGNATURE_FORMAT=""
CT_ISL_0_15_or_later=y
CT_ISL_REQUIRE_0_15_or_later=y
CT_ISL_0_14_or_later=y
CT_ISL_REQUIRE_0_14_or_later=y
CT_ISL_0_13_or_later=y
CT_ISL_0_12_or_later=y
CT_ISL_REQUIRE_0_12_or_later=y
CT_COMP_LIBS_LIBELF=y
CT_COMP_LIBS_LIBELF_PKG_KSYM="LIBELF"
CT_LIBELF_DIR_NAME="libelf"
CT_LIBELF_PKG_NAME="libelf"
CT_LIBELF_SRC_RELEASE=y
# CT_LIBELF_SRC_DEVEL is not set
# CT_LIBELF_SRC_CUSTOM is not set
CT_LIBELF_V_0_8_13=y
CT_LIBELF_VERSION="0.8.13"
CT_LIBELF_MIRRORS="http://www.mr511.de/software"
CT_LIBELF_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_LIBELF_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_LIBELF_ARCHIVE_FORMATS=".tar.gz"
CT_LIBELF_SIGNATURE_FORMAT=""
# CT_COMP_LIBS_LIBICONV is not set
CT_COMP_LIBS_MPC=y
CT_COMP_LIBS_MPC_PKG_KSYM="MPC"
CT_MPC_DIR_NAME="mpc"
CT_MPC_PKG_NAME="mpc"
CT_MPC_SRC_RELEASE=y
# CT_MPC_SRC_DEVEL is not set
# CT_MPC_SRC_CUSTOM is not set
CT_MPC_V_1_0_3=y
CT_MPC_VERSION="1.0.3"
CT_MPC_MIRRORS="http://www.multiprecision.org/mpc/download $(CT_Mirrors GNU mpc)"
CT_MPC_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_MPC_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_MPC_ARCHIVE_FORMATS=".tar.gz"
CT_MPC_SIGNATURE_FORMAT="packed/.sig"
CT_COMP_LIBS_MPFR=y
CT_COMP_LIBS_MPFR_PKG_KSYM="MPFR"
CT_MPFR_DIR_NAME="mpfr"
CT_MPFR_PKG_NAME="mpfr"
CT_MPFR_SRC_RELEASE=y
# CT_MPFR_SRC_DEVEL is not set
# CT_MPFR_SRC_CUSTOM is not set
CT_MPFR_V_3_1_6=y
CT_MPFR_VERSION="3.1.6"
CT_MPFR_MIRRORS="http://www.mpfr.org/mpfr-${CT_MPFR_VERSION} $(CT_Mirrors GNU mpfr)"
CT_MPFR_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_MPFR_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_MPFR_ARCHIVE_FORMATS=".tar.xz .tar.bz2 .tar.gz .zip"
CT_MPFR_SIGNATURE_FORMAT="packed/.asc"
CT_COMP_LIBS_NCURSES=y
CT_COMP_LIBS_NCURSES_PKG_KSYM="NCURSES"
CT_NCURSES_DIR_NAME="ncurses"
CT_NCURSES_PKG_NAME="ncurses"
CT_NCURSES_SRC_RELEASE=y
# CT_NCURSES_SRC_DEVEL is not set
# CT_NCURSES_SRC_CUSTOM is not set
CT_NCURSES_V_6_0=y
CT_NCURSES_VERSION="6.0"
CT_NCURSES_MIRRORS="ftp://invisible-island.net/ncurses $(CT_Mirrors GNU ncurses)"
CT_NCURSES_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_NCURSES_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_NCURSES_ARCHIVE_FORMATS=".tar.gz"
CT_NCURSES_SIGNATURE_FORMAT="packed/.sig"
# CT_NCURSES_NEW_ABI is not set
CT_NCURSES_HOST_CONFIG_ARGS=""
CT_NCURSES_HOST_DISABLE_DB=y
CT_NCURSES_HOST_FALLBACKS="linux,xterm,xterm-color,xterm-256color,vt100"
CT_NCURSES_TARGET_CONFIG_ARGS=""
# CT_NCURSES_TARGET_DISABLE_DB is not set
CT_NCURSES_TARGET_FALLBACKS=""
# CT_COMP_LIBS_ZLIB is not set
# CT_LIBICONV_NEEDED is not set
# CT_GETTEXT_NEEDED is not set
CT_GMP_NEEDED=y
CT_MPFR_NEEDED=y
CT_ISL_NEEDED=y
CT_MPC_NEEDED=y
CT_LIBELF_TARGET=y
CT_EXPAT_NEEDED=y
CT_EXPAT_TARGET=y
CT_NCURSES_NEEDED=y
CT_NCURSES_TARGET=y
# CT_ZLIB_NEEDED is not set
CT_GMP=y
CT_MPFR=y
CT_ISL=y
CT_MPC=y
CT_EXPAT=y
CT_NCURSES=y

#
# Companion tools
#
# CT_COMP_TOOLS_FOR_HOST is not set
# CT_COMP_TOOLS_AUTOCONF is not set
# CT_COMP_TOOLS_AUTOMAKE is not set
CT_COMP_TOOLS_LIBTOOL=y
CT_COMP_TOOLS_LIBTOOL_PKG_KSYM="LIBTOOL"
CT_LIBTOOL_DIR_NAME="libtool"
CT_LIBTOOL_PKG_NAME="libtool"
CT_LIBTOOL_SRC_RELEASE=y
# CT_LIBTOOL_SRC_DEVEL is not set
# CT_LIBTOOL_SRC_CUSTOM is not set
CT_LIBTOOL_V_2_4_6=y
CT_LIBTOOL_VERSION="2.4.6"
CT_LIBTOOL_MIRRORS="$(CT_Mirrors GNU libtool)"
CT_LIBTOOL_ARCHIVE_FILENAME="@{pkg_name}-@{version}"
CT_LIBTOOL_ARCHIVE_DIRNAME="@{pkg_name}-@{version}"
CT_LIBTOOL_ARCHIVE_FORMATS=".tar.xz .tar.gz"
CT_LIBTOOL_SIGNATURE_FORMAT="packed/.sig"
# CT_COMP_TOOLS_M4 is not set
# CT_COMP_TOOLS_MAKE is not set

#
# Test suite
#
# CT_TEST_SUITE_GCC is not set

最终在如下目录生成我们需要的编译程序

~/x-tools/arm-unknown-linux-uclibcgnueabihf

编译过程中的源代码下载可能会非常缓慢,可以从本站下载一份代码的拷贝。点击这里下载。下载完成后,解压缩到当前用户根目录,编译的时候,会自动使用已经下载的文件。可以使用下面的命令进行下载解压缩操作:

$ cd ~

$ wget http://www.mobibrw.com/wp-content/uploads/2017/12/src.tar.xz

$ tar -xvf src.tar.xz

如果懒得编译,也可点击这里下载一份已经编译好的编译工具

参考链接