2014-04-19 20:54:02
构建Linux 编译Linux BeagleBone Black
因为太长了,分了2部分。
构建Linux笔记v1.0(第一部分)
coreutils
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/coreutils/coreutils-build
也许要先编译一遍本地版的,先看下面的解释。
$ ../coreutils-8.22/configure --prefix=/usr/app/coreutils --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --enable-install-program=arch,hostname
修改Makefile,.x.1对象,$(abs_top_builddir) 改 /home/spy/Work/sources/coreutils
$ make
$ make install DESTDIR=/home/spy/Work/sources/coreutils/coreutils
--enable-install-program=arch,hostname
默认不安那2个,这样就安了。
help2man不能得到help信息
help2man: can`t get `--help` info from man/chroot.td/chroot
Try `--no-discard-stderr` if option outputs to stderr
help2man通过目标程序--help选项的输出来生成man,而我是交叉编译,目标程序不能
在我的系统中运行。所以我先编译了一遍本地版的,把运行make那个目录中的src文件夹
复制到了/home/spy/Work/sources/coreutils
。
重新配置成交叉编译,在make之前修改makefile文件,将help2man的目标程序指定到本地版的。
coreutils里面有我最喜欢的ls
命令,编译完后,可在开发板中验证下。
linux-pam
/usr
->
<- util-linux,libcap,
$ cd /home/spy/Work/sources/pam/linux-pam-build
$ ../Linux-PAM-1.1.8/configure --prefix=/usr/app/linux-pam --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/pam/linux-pam
pam与认证有关,如果没有这个,编译util-linux的时候就不会有login。
util-linux的配置中并没有指定pam的选项,所以安装后,我把pam复制一份
放到我交叉编译器搜索库的目录中了。
我也尝试过把gcc依赖的库放到交叉编译器搜索库的目录中,但遇到了新的问题,
时间关系,没有研究。
pam的库中也有个la文件,根据pam所放的目录,做类似下面的修改。
libpam_misc.la
# Libraries that this one depends upon.
dependency_libs=` /home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc/usr/lib/libpam.la -ldl`
include/security/
我当初记录了这个东西,有点忘了,可能是依赖pam头文件的程序在那个目录找而不是include/。
编译其他程序的时候如果提示找不到头文件,可改下目录。
yywrap
的问题
搜索后这个函数在flex中,安装后,我也不太会用,
conf/pam_conv1/Makefile
LIBS = -lfl
doc/specs/Makefile
还有一些其他新问题,于是换策略。
conf/pam_conv1/pam_conv_l.c
int yywrap (void)
{
return 1;
}
doc/specs/parse_l.c
int yywrap (void)
{
return 1;
}
就是在那2个c源文件中添加yywrap函数,
反正felx中有个libyywrap.c,里面的函数就这个样子。
util-linux
-> pam, ncurses
<-
我这里的编译并没有用ncurses,如果你要用的话,可先看看后面我编译ncurses的步骤。
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/util-linux/util-linux-build
$ ../util-linux-2.24.1/configure --prefix=/usr/app/util-linux --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --without-ncurses
$ make
$ su
# make install DESTDIR=/home/spy/Work/sources/util-linux/util-linux
--without-ncurses
我当初还没编译ncurses,所以加了这个选项,我不知道ncurses是干什么的,这样等以后
出问题的时候就知道它是干什么的了。
安装时,不能改变bin/wall的用户组为tty
我采用了安装时切换用户为root的方法。
带pam库编译时
cannot find the library '/usr/app/linux-pam/lib/libpam.la' or unhandled argument '/usr/app/linux-pam/lib/libpam.la'
修改libpam_misc.la中的路径,见pam中的修改。
libcap
-> pam
<- systemd,
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
将makefile要引入的文件做如下修改。
CC := arm-none-linux-gnueabi-gcc
BUILD_CC := gcc
AR := arm-none-linux-gnueabi-ar
RANLIB := arm-none-linux-gnueabi-ranlib
LIBATTR := no
$ cd /home/spy/Work/sources/libcap/libcap-2.24
$ make
$ make prefix=/usr/app/libcap lib=lib FAKEROOT=/home/spy/Work/sources/libcap/libcap install
完成以上步骤,复制一份和交叉编译器的库放到一起。
systemd
/usr
-> libcap
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/systemd/systemd-build
修改configure,避免rpl_malloc的错误
if test "$cross_compiling" = yes; then :
ac_cv_func_malloc_0_nonnull=no 改成 yes
$ ../systemd-211/configure --prefix=/usr/app/systemd --with-rootprefix=/usr/app/systemd/root --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --disable-seccomp --disable-blkid --disable-kmod --disable-pam --disable-libcryptsetup --disable-audit --disable-acl --disable-xattr --disable-selinux --disable-xz --disable-tcpwrap --disable-gcrypt --disable-qrencode --disable-microhttpd --disable-python-devel --without-python --disable-gudev --disable-apparmor --disable-dbus
$ make
$ make install DESTDIR=/home/spy/Work/sources/systemd/systemd
--with-rootprefix=/usr/app/systemd/root
由于安装的时候会有一些东西安装在了app文件夹之外,指定这个选项为安装路径内部就可以了,
root是我随便起的,但最好与其他文件夹独立。
后面那些都是可选的软件包,我全禁用了。
今天一看,竟然有个kmod,我可以告诉你,我构建完的系统好像不能自动载入模块,也许和这个有关吧。
kmod我后面也安了。
编译时看到了很多这样的信息,不知道是什么:
libsystemd_internal_la-bus-message.o (symbol from plugin): warning: memset used with constant zero length parameter; this could be due to transposed parameters
/home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc/usr/include/bits/poll2.h: In function 'bus_poll':
/home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc/usr/include/bits/poll2.h:71:2: warning: call to '__ppoll_chk_warn' declared with attribute warning: ppoll called with fds buffer too small file nfds entries [enabled by default]
return __ppoll_chk (__fds, __nfds, __timeout, __ss, __bos (__fds));
配置出错时提示过的
sys/capability.h 在libcap中
pkg-config
intltool
gperf
后3个不是库,编译时被调用,又不像编译器那样为另一个平台生成程序,所以应该不必
为我构建的系统编译他们,用自己Linux系统的包管理器安上就好了。
注意pkg-config是负责寻找库的,如果用他默认的搜索路径,找到的是你正使用系统中的库,
而不是应该用在BeagleBone Black中的库。如果像我这样把那些可选的软件包都禁用的话,
是不需要pkg-config的。我把pkg-config通过配置选项指定到一个目录,也能编译成功。
如果想让pkg-config找到正确的库的话,可看看它的手册,有几个环境变量可影响它搜索库
的路径。
终于到了真正的init程序,这么伟大的程序,竟然没找到学习的文档。我总结了一点。
systemd包含了udev。
At boot time we now print warnings if:
/usr is on a split-off partition but not already mounted by an initrd; if
/etc/mtab is not a symlink to /proc/mounts;
CONFIG_CGROUPS is not enabled in the kernel.
We`ll also expose this as tainted flag on the bus.
所以/etc/中应该放个mtab了。
systemd对一些目录的要求。
参见http://www.freedesktop.org/wiki/Software/systemd/FileHierarchy/
/, /usr, /etc must be mounted when the host systemd is first invoked. This may
be achieved either by using the kernel`s built-in root disk mounting (
in which case /, /usr and /etc need to be on the same file system), or
via an initrd, which could mount the three directories from different sources./bin, /sbin, /lib (and /lib64 if applicable) should reside on /, or be symlinks
to the /usr file system (recommended). All of them must be available
before the host systemd is first executed./var does not have to be mounted when the host systemd is first invoked,
however, it must be configured so that it is mounted writable
before local-fs.target is reached (for example, by simply listing it in /etc/fstab)./tmp is recommended to be a tmpfs (default), but doesn`t have to. If configured,
it must be mounted before local-fs.target is reached (for example, by listing it in /etc/fstab)./dev must exist as an empty mount point and will automatically be mounted
by systemd with a devtmpfs. Non-devtmpfs boots are not supported./proc and /sys must exist as empty mount points and
will automatically be mounted by systemd with procfs and sysfs./run must exist as an empty mount point and will automatically be mounted by systemd with a tmpfs.
If a process belonging to a specific cgroup fork()s, its child will become a member of the same group.
You can find the cgroups of a process by reading /proc/$PID/cgroup.
cgroups hence make a very good choice to keep track of processes for babysitting purposes.
又到了体验成就感的时候,目前,我们已经拥有的程序,
glibc,gmp,mpfr,mpc,isl,cloog,gcc,bash,
coreutils,linux-pam,util-linux,libcap,systemd。
放到SD卡中。
也许最好把SD卡中文件的用户和组改成root,但是util-linux中的wall属于tty组。
我下面这2条命令是不全的。
# chown -R 0:0
# chgrp -v tty /usr/app/util-linux/bin/wall
由于有了新的程序库,而且是systemd需要用到的,所以先别急着改把init改成systemd,
那样应该会提示找不到库的,所以先用bash,执行一下ldconfig,然后再改,
init=/usr/lib/systemd/systemd
/etc/中的文件,目前就有个mtab,
如果没有passwd文件,会有登陆的提示,还会让输入密码,然后就是登陆失败,所以要创建。
/etc/passwd
root::0:0:root:/home/root:/usr/bin/bash
目前不能设置密码,设置了会登陆失败,不知为什么,可能为了安全吧。所以密码部分空着。
/etc/pam.conf
other auth required pam_unix.so nullok
other account required pam_unix.so broken_shadow
other session required pam_unix.so
other password required pam_unix.so nullok
这是pam的配置文件,可看看pam的手册,内容没深入研究,是我自己看了很多配置后定的。
如果没有配置文件,登陆时会有下面的错误,
login: PAM failure, aborting: Critical error - immediate abort
第一部分是需要pam的程序的名字,如login,改成login也可以。
最后的nullok选项是必要的,这允许没有密码的登陆,也不知道这4个中,哪个需要,
临时先参照别人的。
前面说到,不能在passwd中设置密码,我本以为加了broken_shadow选项就可以了,但不是。
pam也可以在/etc/pam.d/
中找配置文件,这个是shadow的一部分,里面不止一个配置文件。
如果pam.d存在,则忽略pam.conf。可建个空的pam.d文件夹试试,我没研究。
现在启动BeagleBone Black吧,
systemd启动后,会在/etc/中创建一个machine-id文件,
最后systemd会启动在ttyO0上的登陆服务,提示登陆,输入root,确定后就看见bash了。
我的systemd启动过程中会有一个服务失败,就是在另一个tty设备登陆的服务,可能是我没连
显示器?
一些命令,
显示这次登陆的日志,
# journalctl -b
重启,
$ systemctl reboot
关机
$ systemctl poweroff
但我的关上后,电源指示灯还亮着,别的灯倒是灭了。
曾经没有login时遇到的问题,
localhost login: root
[ 30.279467] systemd[1]: [email protected] has no holdoff time, scheduling restart.
[ 30.314721] systemd[1]: Stopping Serial Getty on ttyO0...
[ 30.321039] systemd[1]: Starting Serial Getty on ttyO0...
[ 30.332073] systemd[1]: Started Serial Getty on ttyO0.
这是systemd的getty服务,在我的系统中该服务调用agetty,看了agetty的手册,
发现它要调用login程序,而此时我构建的系统中没有login程序。
我想表达的是这里没有错误提示。
shadow
/usr/local
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/Shadow/shadow-build
$ ../shadow-4.1.5.1/configure --prefix=/usr/app/shadow --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/Shadow/shadow
我不太喜欢shadow,因为我不能在那个网站下载到它。
但为了能改密码,还是安了。希望有避免shadow的方法。
shadow中有与已安装程序相同的命令,我选择了shadow中的。
util-linux {login,nologin,su}
coreutils {groups}
它的配置文件要复制一份到/etc/中。
它的配置文件不可以直接用,看看pam.d中的login文件。
内容的格式也就是少了第一部分,这部分用文件名表示了。
奇怪的是你会在配置中发现include,但后面的文件没有。
你也会看到额外的配置,先参照pam.conf改吧。
shadow的login命令会读取login.defs。
登陆的时候,会提示下面这些有问题。
为了不让他们出现,都被我变成注释了。
FAILLOG_ENAB
LASTLOG_ENAB
MAIL_CHECK_ENAB
OBSCURE_CHECKS_ENAB
PORTTIME_CHECKS_ENAB
QUOTAS_ENAB
MOTD_FILE
FTMP_FILE
NOLOGINS_FILE
ENV_HZ
PASS_MIN_LEN
SU_WHEEL_ONLY
CRACKLIB_DICTPATH
PASS_CHANGE_TRIES
PASS_ALWAYS_WARN
CHFN_AUTH
ENVIRON_FILE
如果你要改密码,那么首先/etc/中要有shadow文件,空的就可以。
-bash-4.3# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: Authentication token manipulation error
passwd: password unchanged
添加空的shadow文件后
-bash-4.3# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
曾经出现过的一些问题
“Login incorrect”
原因提示,
通过passwd改密码;
pam的配置文件没配置好;
有个认证可能需要/etc/shells文件,里面是可用shell的路径。
“Module is unknown”
忘了怎么引起的了。
“Permission denied”
忘了。
binutils
/usr/local
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/binutils/binutils-build
$ ../binutils-2.24/configure --prefix=/usr/app/binutils --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/binutils/binutils
这里面有汇编器,连接器等,我的目的是可以在开发板中构建程序。
LFS的网站上说,这个要在glibc和gcc之前编译,但我是现在编译的,
难道glibc的ld.so可以根据这里的ld确定搜索路径?
make
/usr/local
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/make/make-build
$ ../make-4.0/configure --prefix=/usr/app/make --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/make/make
sed
/usr/local
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/sed/sed-build
$ ../sed-4.2.2/configure --prefix=/usr/app/sed --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/sed/sed
configure脚本中会用到的,还有grep,gawk。
grep
/usr/local
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/grep/grep-build
$ ../grep-2.9/configure --prefix=/usr/app/grep --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/grep/grep
gawk
/usr/local
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/gawk/gawk-build
可能还是要先编译一遍本地版的,好像这个错误也没什么问题吧。
而且这样改也不太好。
$ ../gawk-4.1.0/configure --prefix=/usr/app/gawk --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
修改makefile如下
$ make
$ make install DESTDIR=/home/spy/Work/sources/gawk/gawk
/bin/sh: ../gawk: cannot execute binary file: Exec format error
check-for-shared-lib-support:
@if /home/spy/Work/sources/gawk/gawk.build/build/gawk$(EXEEXT) --version | sed 1q | grep API > /dev/null; \
then : do nothing ; \
else echo Building the extensions is not supported on this platform ; \
exit 1; \
fi
ncurses
/usr/local
->
<- nano,vim
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/ncurses/ncurses-build
$ ../ncurses-5.9/configure --prefix=/usr/app/ncurses --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --with-build-cc=gcc --enable-widec --with-shared
$ make
$ make install DESTDIR=/home/spy/Work/sources/ncurses/ncurses
nano
/usr/local
-> ncurses
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/nano/nano-build
好像要修改源文件。
$ ../nano-2.2.6/configure --prefix=/usr/app/nano --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/nano/nano
src/nano.h:92:20: fatal error: curses.h: No such file or directory
#elif defined(HAVE_NCURSES_H)
#include
#else
/* Curses support. */
#include
#endif /* CURSES_H */
我在BeagleBone Black中也编译过这个没成功
checking whether build environment is sane... configure: error: newly created file is older than distributed files!
Check your system clock
这是我BeagleBone Black时间的问题。
date -s 20140402
./config.status: line 1095: awk: command not found
安gawk
/bin/install: missing destination file operand after ''
Try '/bin/install --help' for more information.
安装时的错误,短时间内不知如何解决。
findutils
/usr/local
->
<-
在开发板中编译的,so easy。
安装程序的时候,有时会需要这个,比如下面的vim。
在我的电脑中编译出现以下问题没解决。
stdio.h:749:12: error: expected declaration specifiers or `...` before `(` token
extern int fseek (FILE *__stream, long int __off, int __whence);
^
vim
/usr/local
-> ncurses
<-
系统中需要linux header。
# ./configure --prefix=/usr/app/vim --with-tlib=ncursesw
# make
# make install
checking how to run the C preprocessor... /lib/cpp
configure: error: in '/home/root/vim/vim74/src':
configure: error: C preprocessor "/lib/cpp" fails sanity check
配置时出错。
linux/limits.h: No such file or directory
好像是config.log里的。
好像我把linux header放到开发板中,好了。
linux header参见内核部分。
no terminal library found
checking for tgetent()... configure: error: NOT FOUND!
You need to install a terminal library; for example ncurses.
Or specify the name of the library with --with-tlib.
--with-tlib=ncurses
checking for linking with ncurses library... configure: error: FAILED
--with-tlib=ncursesw
checking size of off_t... configure: error: in `/home/root/vim/vim74/src`:
configure: error: cannot compute sizeof (off_t)
See `config.log` for more details.
# ldconfig
./osdef.sh: line 92: diff: command not found
好像是make的时候,没有错误,没有警告。
/bin/sh: find: command not found
这就是安装的时候,暗示你需要findutils。
好了,现在我们的系统已经可以编译软件了。
虽然还缺少一些必要的软件,如压缩软件。但我构建Linux的目的是研究Linux,构建的思想
已基本掌握,再这样安软件安下去没什么意义了。
为了充分理解构建时遇到的问题,应该学习下更基础的东西了,如
Computer Systems: A Programmer's Perspective
Randal E. Bryant and David R. O'Hallaron, Carnegie Mellon University
如果不看完这本书,我会担心我完成的任务不够完美。
曾经看了一点"Linux Device Drivers",说驱动是了解内核的一个入口。
kmod
/usr
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/kmod/kmod-build
$ ../kmod-16/configure --prefix=/usr/app/kmod --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --disable-manpages
$ make
$ make install DESTDIR=/home/spy/Work/sources/kmod/kmod
编译完的目录中是有一些软链接指向kmod命令的,但安装完的目录里没有那些软链接。
这些软链接很有意思啊,比如insmod指向kmod,输入insmod
,实际运行的不是kmod
,而是
kmod insmod
。大概是这样的。
kmod与模块有关,所以你的系统中应该放上编译内核时的模块了。
libpipeline
/usr/local
->
<- man-db
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/libpipeline/libpipeline-build
$ ../libpipeline-1.3.0/configure --prefix=/usr/app/libpipeline --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/libpipeline/libpipeline
gdbm
/usr/local
->
<- man-db
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/gdbm/gdbm-build
$ ../gdbm-1.11/configure --prefix=/usr/app/gdbm --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/gdbm/gdbm
man-db
/usr/local
-> gdbm,libpipeline
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/man-db/man-db-build
$ ../man-db-2.6.6/configure --prefix=/usr/app/man-db --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi libpipeline_CFLAGS=`-I/home/spy/Work/sources/libpipeline/libpipeline/usr/app/libpipeline/include` libpipeline_LIBS=`-L/home/spy/Work/sources/libpipeline/libpipeline/usr/app/libpipeline/lib -lpipeline` --disable-setuid
$ make
$ make install DESTDIR=/home/spy/Work/sources/man-db/man-db
这个程序的README还是值得看看的,我至今未仔细看,所以标记下。
undefined reference
src/Makefile
manpath$(EXEEXT):
globbing$(EXEEXT):
accessdb$(EXEEXT):
LINK OBJECTS
-rpath /home/spy/Work/sources/libpipeline/libpipeline/usr/app/libpipeline/lib
很遗憾,我没有成功的显示manual,还没时间研究。
less
/usr/local
->
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/less/less-build
$ ../less-458/configure --prefix=/usr/app/less --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/less/less
有了它,journalctl的输出就舒服了。man的输出也是放到less中。
下面的都是与网络有关的了,网络的知识没学,不知道怎么用,可参考下安装过程。
db
/usr/local/BerkeleyDB.6.0
< iproute
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/db/db-build
$ ../db-6.0.30/dist/configure --prefix=/usr/app/db --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --enable-compat185
$ make
$ make install DESTDIR=/home/spy/Work/sources/db/db
$ make uninstall
$ make clean
$ make realclean
iptables
/usr/local
->
<- iproute
$ export PKG_CONFIG_LIBDIR=/home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc/usr/lib/pkgconfig
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/iptables/iptables-build
$ ../iptables-1.4.21/configure --prefix=/usr/app/iptables --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/iptables/iptables
看来我是在这里被迫开始用了pkg-config,要不就是iproute。
iproute
-> db(make),iptables(make)
<-
ROOTDIR=/home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc
PREFIX=/usr/app/iproute
SBINDIR=$(PREFIX)/sbin
CONFDIR=$(PREFIX)/etc/iproute2
CC = arm-none-linux-gnueabi-gcc
HOSTCC = gcc
AR = arm-none-linux-gnueabi-ar
$ export PKG_CONFIG_LIBDIR=/home/spy/Software/arm-2013.11/arm-none-linux-gnueabi/libc/usr/lib/pkgconfig
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ make DESTDIR=/home/spy/Work/sources/iproute/iproute
$ make install DESTDIR=/home/spy/Work/sources/iproute/iproute
IP_CONFIG_SETNS,
TC_CONFIG_IPSET,TC_CONFIG_XT,TC_CONFIG_ATM,TC_CONFIG_XT_OLD,TC_CONFIG_XT_OLD_H,
编译的时候需要pkg-config, bison, flex。
这个程序替代了net-tools,但作为替代品,那个官网可真不怎么好。
它依赖的软件中,我学Arch Linux,在后面括号中标记了make,表示只在编译的时候需要,
虽然不知道Arch Linux是不是这意思。
我确实没有把那2个依赖放到开发版中,iproute可以使用,但不知道有没有什么问题。
zlib
->
<- openssh,
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/zlib/zlib-1.2.8
$ CHOST=arm-none-linux-gnueabi ./configure --prefix=/usr/app/zlib
$ make
$ make install DESTDIR=/home/spy/Work/sources/zlib/zlib
openssl
->
<- openssh
临时先让系统中的pod2man不可用,见下面解释。
$ ./Configure linux-armv4 --prefix=/usr/app/openssl --cross-compile-prefix=arm-none-linux-gnueabi- shared
$ make
$ make install INSTALL_PREFIX=/home/spy/Work/sources/openssl/openssl
BeagleBone Black是armv7,但配置中没有linux-armv7,倒是有个与android有关的armv7,
那个armv7并没有用与armv7有关的东西,而是armv4的,所以我就用了“linux-armv4”。
有个可疑的zlib-dynamic选项,我没加。
POD document had syntax errors at /usr/bin/core_perl/pod2man line 71.
看了源码中的pod2mantest,里面说如果系统中没有可用的pod2man,会用openssl中自带的。
既然系统中的有问题,那就用自带的吧。
# mv /usr/bin/core_perl/pod2man /usr/bin/core_perl/pod2man.a
./pod2mantest: line 34: pod2man: command not found
pod2man does not work properly (`BasicTest` failed). Looking for another pod2man ...
No working pod2man found. Consider installing a new version.
As a workaround, we`ll use a bundled old copy of pod2man.pl.
openssh
/usr/local
-> zlib,openssl
<-
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/openssh/openssh-build
$ ../openssh-6.6p1/configure --prefix=/usr/app/openssh --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi --with-zlib=/home/spy/Work/sources/zlib/zlib/usr/app/zlib --with-ssl-dir=/home/spy/Work/sources/openssl/openssl/usr/app/openssl
修改makefile。
$ make
$ make install DESTDIR=/home/spy/Work/sources/openssh/openssh
可疑选项,
--with-pam
--without-shadow
strip: Unable to recognise the format of the input file
系统中的strip无法识别交叉编译后的程序,看来要用交叉编译器中的。
strip由install调用,看看install的手册,真的有选项可以改变调用的strip,
于是修改makefile,修改install的参数。
STRIP_OPT=-s --strip-program=/home/spy/Software/arm-2013.11/bin/arm-none-linux-gnueabi-strip
sshd: cannot execute binary file
呵,竟然想运行sshd,看看makefile,位于检测的部分,那就别检测了,
删掉install对象中的“check-config”。
编译完,并没有生成ssh-key,也没提示。
参考了makefile,在开发板中运行以下命令生成ssh-key。
ssh-keygen -t rsa1 -f /usr/app/openssh/etc/ssh_host_key -N ""
ssh-keygen -t rsa -f /usr/app/openssh/etc/ssh_host_rsa_key -N ""
ssh-keygen -t dsa -f /usr/app/openssh/etc/ssh_host_dsa_key -N ""
ssh-keygen -t ed25519 -f /usr/app/openssh/etc/ssh_host_ed25519_key -N ""
ssh-keygen -t ecdsa -f /usr/app/openssh/etc/ssh_host_ecdsa_key -N ""
iana-etc
->
<-
$ make PREFIX=/usr/app/iana-etc DESTDIR=/home/spy/Work/sources/iana-etc/iana-etc STRIP=yes
$ make install PREFIX=/usr/app/iana-etc DESTDIR=/home/spy/Work/sources/iana-etc/iana-etc STRIP=yes
不知干什么的,就是些文本文件。
以下是没用的。
flex(http://flex.sourceforge.net/)
/usr/local
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ cd /home/spy/Work/sources/flex/flex-build
$ ../flex-2.5.39/configure --prefix=/usr/app/flex --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabi
$ make
$ make install DESTDIR=/home/spy/Work/sources/flex/flex
rpl_malloc
if test "$cross_compiling" = yes; then :
ac_cv_func_malloc_0_nonnull=no --> yes
rpl_realloc
if test "$cross_compiling" = yes; then :
ac_cv_func_realloc_0_nonnull=yes
驱动的知识
The major number generally specifies a particular driver within the kernel,
and the minor number specifies a particular device handled by that driver.
曾经用过的,不用了。
BusyBox
$ export PATH=$PATH:/home/spy/Software/arm-2013.11/bin
$ make CROSS_COMPILE=arm-none-linux-gnueabi- help
$ make CROSS_COMPILE=arm-none-linux-gnueabi- distclean
$ make CROSS_COMPILE=arm-none-linux-gnueabi- allnoconfig
$ make CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
$ make CROSS_COMPILE=arm-none-linux-gnueabi- all
$ make CROSS_COMPILE=arm-none-linux-gnueabi- CONFIG_PREFIX=../busybox-build install
一开始没用systemd,用的Busybox的init。
/dev中一些基本的设备,不清楚到底需要什么,也不必考虑了,
因为systemd不需要,但前期我用BusyBox的话,还是要添加的。
# mknod -m 666 null c 1 3
# mknod -m 666 zero c 1 5
# mknod -m 600 console c 5 1
# mknod -m 666 tty c 5 0
# mknod -m 600 tty0 c 4 0
# mknod -m 600 tty1 c 4 1
# mknod -m 600 ttyS0 c 4 64
# mknod -m 600 mem c 1 1
# mknod -m 644 random c 1 8