docker 实例

注:本章节所有的实例操作在window系统下!!!

nginx

在C:/Users目录下新建nginx_root目录,新建一个index.html文件,里面写个helloworld

docker run -it --name nginx -v /c/Users/nginx_root:/usr/share/nginx/html -p 80:80 nginx
docker-machine.exe ls

浏览器输入上面命令中的IP地址访问,显示helloworld

下面来解释一下
先进入这个镜像看看,另起一个终端

@FOR /f "tokens=*" %i IN ('docker-machine.exe env default') DO @%i
docker exec -it nginx bash
cat /etc/nginx/conf.d/default.conf

这里就是nginx的配置信息,上面/usr/share/nginx/html和端口号就是根据整理来的。

再来说说/c/Users/nginx_root这个地址

我们先打开virtualbox的客户端,default->设置->共享文件夹,可以看到 c/Users\ \?\c:\Users,然后我们进default系统

docker-machine.exe ssh default
ls /c/Users/

是不是发现本地c:\Users目录和default的c/Users做了一个映射,然后我们的镜像其实是在default的映射目录再挂载过来的目录,所以上面为什么写的是/c/Users/nginx_root,其实是c:\Users\nginx_root目录

流程是这样:
virtualbox的default系统挂载了本地系统的C:/users目录,目录为/c/Users
我们的nginx镜像挂载了default的/c/Users/nginx_root目录,目录为/usr/share/nginx/html
最终/usr/share/nginx/html挂载的是本地系统的C:/users/nginx_root目录

docker安装

一、centos6.x下安装docker

先更新系统

yum update

查看

uname -r

2.6.32-xx..x86_64

如果没有更新过内核应该是2.6.x-x的版本

升级内核。

我们用的是带aufs模块的3.10内核,自己编译太复杂,加一个源,找个现成的,操作如下:

vi /etc/yum.repos.d/hop5.repo

复制下面内容

[hop5]
name=www.hop5.in Centos Repository
baseurl=http://www.hop5.in/yum/el6/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-HOP5

保存退出 :wq

安装 kernel-ml-aufs kernel-ml-aufs-devel

yum install kernel-ml-aufs kernel-ml-aufs-devel

装好重启,在启动页面选择3.10.x的内核

查看

uname -r

3.10.5-3.el6.x86_64

内核就升级好了。

接下来安装docker

6.x的版本源上没有docker.io,所以我们再增加一个源

yum install epel-release-6-8.noarch.rpm

然后

yun install docker-io

安装好后

service docker start

没有什么问题的话就算好了。有问题的话看红色字,是否有和你同样的问题

测试一下看看

docker run hello-world

出现

Hello from Docker!
This message shows that your installation appears to be working correctly.

就说明成功了!

如果出现 Error starting daemon: Couldn’t create Tag store: EOF 什么错误

rm -rf /var/lib/docker/repositories-devicemapper

如果出现 key.json 什么错误

rm -f /etc/docker/key.json

二、官方centos安装

参照https://docs.docker.com/engine/installation/linux/centos/

我没有按照这个流程,你们可以试试

三、window7安装

下载
virtualbox(https://www.virtualbox.org)
安装

下载
docker-machine
(https://github.com/docker/machine/releases/) 根据自己的系统下载32或64位
下载好后改个文件名,后面好操作
docker-machine-Windows-x86_64.exe -> docker-machine.exe

下载docker
(https://github.com/docker/docker/releases) 根据自己的系统下载32或64位

打开命令行:

docker-machine.exe create -d "virtualbox" default

慢慢等待,因为用的是virtualbox所以要下一个docker系统,通常比较慢,当前你也可以直接先下载,然后复制到docker的缓存目录,但是版本变了又要重新下,为了不产生新的麻烦,暂时就忍忍等待下完。

完了以后大概字样

To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine.exe env default

接下来运行

docker-machine.exe env default

这个命令只要是告诉你要怎么样来更新当前的环境变量,只要执行最后一句就可以了

SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\Administrator\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default1
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM @FOR /f “tokens=*” %i IN (‘docker-machine.exe env default’) DO @%i

@FOR /f "tokens=*" %i IN ('docker-machine.exe env default') DO @%i

接下来就可以开始了,是不是很简单!

四、官方window7安装

参照https://docs.docker.com/docker-for-windows/

 

最后感谢网上各位朋友的教程文章。

特殊字符

♫♬♪♩♭♥♡☜☞◎♦◊◈☆❤ⓛⓞⓥⓔ╬『』☀。◕‿◕。の★▶☺☻►◄↔↕♦◊◦♠♣☆♂♀☎☏➸✱✿❆ღ゚ღ❆ﻬஐﻬ❆ღ゚ღ❆✿ﻬஐﻬ✿╰☆╮≈➽ⓛⓞⓥⓔஐ卐※ξ●•ღ&≈♣ஐ∞↘↙ωண✗↔∑∮々~εїз➽∩@の☼❤♡☊☋£☀☂→←Ψ¤╰☆╮)♂♀﹌оО❥♈♠♣☜☞➸∴。◕‿◕。✘✚★☆∷░▒☎⊹⊱⋛⋌⋚⊰⊹◕。oO.♥.:✿*゚¨゚゚・☀╮✔✕╬〓『』►◄【】〖〗☁凸◆◇▲△▼▽●〇◎◕‿-┱┲✣✤✥✦✧✩✫✬✭✮✯✰✱✲✳❃❂❁❀✿✾✽✼✻✺✹✸✷✶✵✴❄❅❆❇❈❉❊❋❖✱✲✳❃❂❁❀✿✾✽✼✻✺✹✸✷✶✵✴❄❅❆❇❈❉❊❋❖ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓆⓠⓡⓢⓣⓤⓥⓦⓧ№DêMЁ™㊚㊛㊣㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉㊊♠♣▣▤▥▦▩▨

跟着我来一起编译lfs(五) LFS系统配置

这章主要是对lfs的系统进行配置,这样大家就会更了解Linux配置文件的位置和配置内容,下面我们开始。


配置系统主机名称

echo "MYOS" > /etc/hostname

输出到/etc/hostname就可以了

自定义 /etc/hosts 文件

cat > /etc/hosts << "EOF"
# Begin /etc/hosts

127.0.0.1 <HOSTNAME.example.org> <HOSTNAME> localhost [alias1] [alias2] ...
::1       <HOSTNAME.example.org> <HOSTNAME> localhost [alias1] [alias2] ...

# End /etc/hosts
EOF

设备和模块管理
配置系统时间
设置本地时间

cat > /etc/adjtime << "EOF"
0.0 0 0.0
0
LOCAL
EOF

配置 Linux 控制台
/etc/vconsole.conf为配置文件
里面每一行内容格式为:VARIABLE=”value”
KEYMAP
此变量指定了键盘的按键映射表。如未设置,默认为 us。
KEYMAP_TOGGLE
此变量指定配置第二个切换键盘映射,默认不设置。
FONT
此变量指定虚拟控制台的字体。
FONT_MAP
此变量指定要使用的控制台映射。
FONT_UNIMAP
此变量指定 unicode 字体映射。
你也可以使用localectl命令来更改这些值
展示及个性化的设置这边就不多讨论了。

系统区域设置,字符集设置
/etc/locale.conf为配置文件

locale -a

查看系统支持的字符集
中国,我们就用中文

cat > /etc/locale.conf << "EOF"
LANG=zh_CN.utf8
EOF

你也可以使用localectl命令来更改这些值

键盘布局
一般我们用的都是普通的设置,如果有个性化,可以自行修改

cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>

# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off

# Enable 8bit input
set meta-flag On
set input-meta On

# Turns off 8th bit stripping
set convert-meta Off

# Keep the 8th bit for display
set output-meta On

# none, visible or audible
set bell-style none

# All of the following map the escape sequence of the value
# contained in the 1st argument to the readline specific functions
"\eOd": backward-word
"\eOc": forward-word

# for linux console
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert

# for xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line

# End /etc/inputrc
EOF

当前系统所有可用 shell 的列表文件设置

cat > /etc/shells << "EOF"
# Begin /etc/shells

/bin/sh
/bin/bash

# End /etc/shells
EOF

这里主要是一些特殊的命令需要这个列表来进行判断权限,否则不允许执行

Systemd 的用法与配置
/etc/systemd/system.conf为配置文件

创建 /etc/fstab 文件
这个文件的作用是让其它程序确定存储设备的默认挂载点、挂载参数和检查信息

cat > /etc/fstab << "EOF"
# Begin /etc/fstab

# file system  mount-point  type     options             dump  fsck
#                                                              order

/dev/sda1     /            ext4    defaults            1     1

# End /etc/fstab
EOF

Linux内核安装

cd sources/
tar xf linux-4.7.2.tar
cd linux-4.7.2
make mrproper
make menuconfig

打开页面后直接esc选择save

make
make modules_install
cp -v arch/x86/boot/bzImage /boot/vmlinuz-4.7.2-lfs-7.10-systemd
cp -v System.map /boot/System.map-4.7.2
cp -v .config /boot/config-4.7.2
install -d /usr/share/doc/linux-4.7.2
cp -r Documentation/* /usr/share/doc/linux-4.7.2

配置 Linux 模块加载顺序

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf
EOF

使用 GRUB 设置启动过程
GRUB 命名约定,GRUB 对于硬盘和分区自有一套命名规则(hdN,M),其中 N 是硬盘数,M 是分区号。硬盘数 N 从 0 开始计数,分区数需要区别对待——主分区从 1 开始计数而扩展分区从 5 开始计数
执行下面的命令请看清楚,找到你创建lfs的硬盘,我是用的是sdb1,所以下面命令的参数是/dev/sda

grub-install /dev/sda
cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd0,1)

menuentry "GNU/Linux, Linux 4.7.2-lfs-7.10-systemd" {
        linux   /boot/vmlinuz-4.7.2-lfs-7.10-systemd root=/dev/sda1 ro
}
EOF

添加一些系统版本信息

cat > /etc/os-release << "EOF"
NAME="Linux From Scratch"
VERSION="7.10-systemd"
ID=lfs
PRETTY_NAME="Linux From Scratch 7.10-systemd"
VERSION_CODENAME="<your name here>"
EOF
echo 7.10-systemd > /etc/lfs-release
cat > /etc/lsb-release << "EOF"
DISTRIB_ID="Linux From Scratch"
DISTRIB_RELEASE="7.10-systemd"
DISTRIB_CODENAME="<your name here>"
DISTRIB_DESCRIPTION="Linux From Scratch"
EOF

好了,到这里恭喜你~~~~~系统做好了,一个自制的系统诞生了。想想就激动了,下面开始,最激动人心的时候

关闭虚拟机,开始启动,上图

启动,用户名root 密码没有直接回车~~~

好了~~终于进了~~

下一章,我们再继续配置一下这个新鲜的系统。

跟着我来一起编译lfs(四) 构建LFS系统

现在开始建立LFS系统,也就是说现在真正开始了解Linux系统。

让我们一步一步来构建,看看每个目录到底放的是什么?有什么用呢?平时使用的命令是干什么的?

我相信只要我们一步一步做下来,你立马就摆脱linux菜鸟阵营。

开始~~~

这里我们不用切换用户到lfs,就用root用户

第一件事

echo $LFS

/mnt/lfs

查看环境,这一步一定要看清楚!!!!!

如果不是这个结果请执行

LFS=/mnt/lfs

创建将用来挂载文件系统的目录

mkdir -pv $LFS/{dev,proc,sys,run}

创建初始设备节点
在内核引导系统的时候,它依赖于几个设备节点,特别是 console 和 null 两个设备。

mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3

挂载和激活 /dev

mount -v --bind /dev $LFS/dev

挂载虚拟文件系统

mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

在某些宿主机系统里,/dev/shm 是一个指向 /run/shm 的软链接。这个 /run 下的 tmpfs 文件系统已经在之前挂载了,所以在这里只需要创建一个目录。

if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi

由于我们的新系统还没有 Udev 而且也没有被引导启动,所以通过绑定挂载宿主机系统实现

进入 Chroot 环境

chroot "$LFS" /tools/bin/env -i \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='\u:\w\$ '              \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
    /tools/bin/bash --login +h

这是你看到的是I have no name!不用怕,这个是对的,后面等/etc/passwd文件创建好了就好了。


现在准备创建 LFS 文件系统里的一些目录结构

mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v  /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v  /usr/libexec
mkdir -pv /usr/{,local/}share/man/man{1..8}
case $(uname -m) in
 x86_64) ln -sv lib /lib64
         ln -sv lib /usr/lib64
         ln -sv lib /usr/local/lib64 ;;
esac
mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}

发现没有,我们建立的很多目录,再看看其他Linux系统,是不是很熟悉,其实这些都是可以改的,但是大家比较准守这种规则。


创建必需的文件和符号链接

ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la
ln -sv bash /bin/sh

为什么要创建这些链接呢?因为有些源码把路径写死在代码里了,不做链接编译不过去。

ln -sv /proc/self/mounts /etc/mtab

上面这个是历史遗留问题,我们同样加上。

现在我们命令行前面的提示是i have no name! ,之前说是缺少文件,现在我们补起来,要在/ect目录里新建两个文件,passwd和group

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
systemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false
systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false
systemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false
systemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false
systemd-network:x:76:76:systemd Network Management:/:/bin/false
systemd-resolve:x:77:77:systemd Resolver:/:/bin/false
systemd-timesync:x:78:78:systemd Time Synchronization:/:/bin/false
systemd-coredump:x:79:79:systemd Core Dumper:/:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
systemd-bus-proxy:x:72:
systemd-journal-gateway:x:73:
systemd-journal-remote:x:74:
systemd-journal-upload:x:75:
systemd-network:x:76:
systemd-resolve:x:77:
systemd-timesync:x:78:
systemd-coredump:x:79:
nogroup:x:99:
users:x:999:
EOF

打开一个新的shell看看

exec /tools/bin/bash --login +h

是不是变了?


接下来初始化日志文件,如果没有这些文件日志是不会记录的。

touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp

/var/log/wtmp 会记录所有的登录和登出
/var/log/btmp 会记录失败的登录尝试
/var/log/lastlog 最后一次登录信息
/var/log/faillog 会记录错误的登录


又要开始编译源码了

Linux API Headers

cd /sources
xz -d linux-4.7.2.tar.xz  (如果你是从我分享的网盘下的源码,可能已经解压成tar了,报错就忽略)
tar xf linux-4.7.2.tar
cd linux-4.7.2
make mrproper
make INSTALL_HDR_PATH=dest headers_install
find dest/include \( -name .install -o -name ..install.cmd \) -delete
cp -rv dest/include/* /usr/include

Man-pages

cd /sources
xz -d man-pages-4.07.tar.xz
tar xf man-pages-4.07.tar
cd man-pages-4.07
make install

Glibc

cd /sources
xz -d glibc-2.24.tar.xz  (如果你是从我分享的网盘下的源码,可能已经解压成tar了,报错就忽略)
tar xf glibc-2.24.tar
cd glibc-2.24
patch -Np1 -i ../glibc-2.24-fhs-1.patch
mkdir -v build
cd build
../configure --prefix=/usr          \
             --enable-kernel=2.6.32 \
             --enable-obsolete-rpc
make
make check
touch /etc/ld.so.conf
make install

为 nscd 安装配置文件并创建运行时目录

cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /lib/systemd/system/nscd.service

安装语言环境

mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030

配置 Glibc

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

安装时区

tar -xf ../../tzdata2016f.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward pacificnew systemv; do
    zic -L /dev/null   -d $ZONEINFO       -y "sh yearistype.sh" ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
    zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

选择时区

tzselect
ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

配置动态库加载器

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF

调整工具链

备份

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

修改 GCC 参数文件

gcc -dumpspecs | sed -e 's@/tools@@g'                   \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' >      \
    `dirname $(gcc --print-libgcc-file-name)`/specs

测试

cd /root
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

应该显示下面的内容
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

查看

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

会显示下面内容
/usr/lib/../lib64/crt1.o succeeded
/usr/lib/../lib64/crti.o succeeded
/usr/lib/../lib64/crtn.o succeeded

grep -B1 '^ /usr/include' dummy.log

会显示下面内容
#include <...> search starts here:
/usr/include

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

会有显示下面内容
SEARCH_DIR(“/usr/lib”)
SEARCH_DIR(“/lib”)

grep "/lib.*/libc.so.6 " dummy.log

会显示下面内容
attempt to open /lib/libc.so.6 succeeded

grep found dummy.log

会显示下面内容
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2


Zlib

cd /sources
tar zxf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr
make
make check
make install
mv -v /usr/lib/libz.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so

File

cd /sources
tar zxf file-5.28.tar.gz
cd file-5.28
./configure --prefix=/usr
make
make check
make install

Binutils

cd /sources
tar jxf binutils-2.27.tar.bz2
cd binutils-2.27
expect -c "spawn ls"

会显示
spawn ls
如果显示其他的都是错误的

mkdir -v build
cd build
../configure --prefix=/usr   \
             --enable-shared \
             --disable-werror
make tooldir=/usr
make -k check
make tooldir=/usr install

GMP

cd /sources
xz -d gmp-6.1.1.tar.xz
tar xf gmp-6.1.1.tar
cd gmp-6.1.1

编译软件包并生成 HTML 文档

make
make html

查看结果及测试

make check 2>&1 | tee gmp-check-log
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log

应该有190

没问题就安装

make install
make install-html

MPFR

cd /sources
xz -d zxf mpfr-3.1.4.tar.xz
tar xf mpfr-3.1.4.tar
cd mpfr-3.1.4
./configure --prefix=/usr        \
            --disable-static     \
            --enable-thread-safe \
            --docdir=/usr/share/doc/mpfr-3.1.4
make
make html
make check
make install
make install-html

MPC

cd /sources
tar zxf mpc-1.0.3.tar.gz
cd mpc-1.0.3
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/mpc-1.0.3
make
make html
make check
make install
make install-html

GCC

cd /sources
tar jxf gcc-6.2.0.tar.bz2
cd gcc-6.2.0
mkdir -v build
cd build
SED=sed                               \
../configure --prefix=/usr            \
             --enable-languages=c,c++ \
             --disable-multilib       \
             --disable-bootstrap      \
             --with-system-zlib
make
ulimit -s 32768
make -k check
../contrib/test_summary
make install
ln -sv ../usr/bin/cpp /lib
ln -sv gcc /usr/bin/cc
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/6.2.0/liblto_plugin.so \
        /usr/lib/bfd-plugins/

测试

echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

显示如下
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

显示如下
/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../lib64/crt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../lib64/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../lib64/crtn.o succeeded

grep -B4 '^ /usr/include' dummy.log

显示如下
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/include-fixed
/usr/include

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

显示如下
SEARCH_DIR(“/usr/x86_64-pc-linux-gnu/lib64”)
SEARCH_DIR(“/usr/local/lib64”)
SEARCH_DIR(“/lib64”)
SEARCH_DIR(“/usr/lib64”)
SEARCH_DIR(“/usr/x86_64-pc-linux-gnu/lib”)
SEARCH_DIR(“/usr/local/lib”)
SEARCH_DIR(“/lib”)
SEARCH_DIR(“/usr/lib”);

grep "/lib.*/libc.so.6 " dummy.log

显示如下
attempt to open /lib64/libc.so.6 succeeded

grep found dummy.log

显示如下
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2
删除

rm -v dummy.c a.out dummy.log
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

Bzip2

cd /sources
tar zxf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
make -f Makefile-libbz2_so
make clean
make
make PREFIX=/usr install
cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat

Pkg-config

cd /sources
tar zxf pkg-config-0.29.1.tar.gz
cd pkg-config-0.29.1
./configure --prefix=/usr              \
            --with-internal-glib       \
            --disable-compile-warnings \
            --disable-host-tool        \
            --docdir=/usr/share/doc/pkg-config-0.29.1
make
make check
make install

Ncurses

cd /sources
tar zxf ncurses-6.0.tar.gz
cd ncurses-6.0
sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in
./configure --prefix=/usr           \
            --mandir=/usr/share/man \
            --with-shared           \
            --without-debug         \
            --without-normal        \
            --enable-pc-files       \
            --enable-widec
make
make install
mv -v /usr/lib/libncursesw.so.6* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so
for lib in ncurses form panel menu ; do
    rm -vf                    /usr/lib/lib${lib}.so
    echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so
    ln -sfv ${lib}w.pc        /usr/lib/pkgconfig/${lib}.pc
done
rm -vf                     /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
ln -sfv libncurses.so      /usr/lib/libcurses.so
mkdir -v       /usr/share/doc/ncurses-6.0
cp -v -R doc/* /usr/share/doc/ncurses-6.0
make distclean
./configure --prefix=/usr    \
            --with-shared    \
            --without-normal \
            --without-debug  \
            --without-cxx-binding \
            --with-abi-version=5
make sources libs
cp -av lib/lib*.so.5* /usr/lib

Attr

cd /sources
tar zxf attr-2.4.47.src.tar.gz
cd attr-2.4.47
sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
sed -i -e "/SUBDIRS/s|man[25]||g" man/Makefile
./configure --prefix=/usr \
            --disable-static
make
make -j1 tests root-tests
make install install-dev install-lib
chmod -v 755 /usr/lib/libattr.so
mv -v /usr/lib/libattr.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so

Acl

cd /sources
tar zxf acl-2.2.52.src.tar.gz
cd acl-2.2.52
sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
sed -i "s:| sed.*::g" test/{sbits-restore,cp,misc}.test
sed -i -e "/TABS-1;/a if (x > (TABS-1)) x = (TABS-1);" \
    libacl/__acl_to_any_text.c
./configure --prefix=/usr    \
            --disable-static \
            --libexecdir=/usr/lib
make
make install install-dev install-lib
chmod -v 755 /usr/lib/libacl.so
mv -v /usr/lib/libacl.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so

Libcap

cd /sources
xz -d libcap-2.25.tar.xz
tar xf libcap-2.25.tar
cd libcap-2.25
sed -i '/install.*STALIBNAME/d' libcap/Makefile
make
make RAISE_SETFCAP=no prefix=/usr install
chmod -v 755 /usr/lib/libcap.so
mv -v /usr/lib/libcap.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.so

sed

cd /sources
tar jxf sed-4.2.2.tar.bz2
cd sed-4.2.2
./configure --prefix=/usr --bindir=/bin --htmldir=/usr/share/doc/sed-4.2.2
make
make html
make check
make install
make -C doc install-html

Shadow

cd /sources
xz -d shadow-4.2.1.tar.xz
tar xf shadow-4.2.1.tar
cd shadow-4.2.1
sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /'   {} \;
find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
find man -name Makefile.in -exec sed -i 's/passwd\.5 / /'   {} \;
sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \
       -e 's@/var/spool/mail@/var/mail@' etc/login.defs
sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' etc/login.defs
sed -i 's/1000/999/' etc/useradd
./configure --sysconfdir=/etc --with-group-name-max-length=32
make
make install
mv -v /usr/bin/passwd /bin
sed -i 's/yes/no/' /etc/default/useradd
passwd root

Psmisc

cd /sources
tar zxf psmisc-22.21.tar.gz
cd psmisc-22.21
./configure --prefix=/usr
make
make install
mv -v /usr/bin/fuser   /bin
mv -v /usr/bin/killall /bin

Iana-Etc

cd /sources
tar jxf iana-etc-2.30.tar.bz2
cd iana-etc-2.30
make
make install

M4

cd /sources
tar xf m4-1.4.17.tar
cd m4-1.4.17
./configure --prefix=/usr
make
make check
make install

Bison

cd /sources
xz -d bison-3.0.4.tar.xz
tar xf bison-3.0.4.tar
cd bison-3.0.4
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.0.4
make
make install

Flex

cd /sources
xz -d flex-2.6.1.tar.xz
tar xf flex-2.6.1.tar
cd flex-2.6.1
./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.1
make
make check
make install
ln -sv flex /usr/bin/lex

Grep

cd /sources
tar xf grep-2.25.tar
cd grep-2.25
./configure --prefix=/usr --bindir=/bin
make
make check
make install

Readline

cd /sources
tar zxf readline-6.3.tar.gz
cd readline-6.3
patch -Np1 -i ../readline-6.3-upstream_fixes-3.patch
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/readline-6.3
make SHLIB_LIBS=-lncurses
make SHLIB_LIBS=-lncurses install
mv -v /usr/lib/lib{readline,history}.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libreadline.so) /usr/lib/libreadline.so
ln -sfv ../../lib/$(readlink /usr/lib/libhistory.so ) /usr/lib/libhistory.so
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-6.3

Bash

cd /sources
tar zxf bash-4.3.30.tar.gz
cd bash-4.3.30
patch -Np1 -i ../bash-4.3.30-upstream_fixes-3.patch
./configure --prefix=/usr                       \
            --docdir=/usr/share/doc/bash-4.3.30 \
            --without-bash-malloc               \
            --with-installed-readline
make
chown -Rv nobody .
su nobody -s /bin/bash -c "PATH=$PATH make tests"
make install
mv -vf /usr/bin/bash /bin
exec /bin/bash --login +h

Bc

cd /sources
tar jxf bc-1.06.95.tar.bz2
cd bc-1.06.95
patch -Np1 -i ../bc-1.06.95-memory_leak-1.patch
./configure --prefix=/usr           \
            --with-readline         \
            --mandir=/usr/share/man \
            --infodir=/usr/share/info
make
echo "quit" | ./bc/bc -l Test/checklib.b
make install

Libtool

cd /sources
xz -d libtool-2.4.6.tar.xz
tar xf libtool-2.4.6.tar
cd libtool-2.4.6
./configure --prefix=/usr
make
make check
make install

GDBM

cd /sources
tar zxf gdbm-1.12.tar.gz
cd gdbm-1.12
./configure --prefix=/usr \
            --disable-static \
            --enable-libgdbm-compat
make
make check
make install

Gperf

cd /sources
tar zxf gperf-3.0.4.tar.gz
cd gperf-3.0.4
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.0.4
make
make -j1 check
make install

Expat

cd /sources
tar jxf expat-2.2.0.tar.bz2
cd expat-2.2.0
./configure --prefix=/usr --disable-static
make
make check
make install
install -v -dm755 /usr/share/doc/expat-2.2.0
install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.2.0

Inetutils

cd /sources
xz -d inetutils-1.9.4.tar.xz
tar xf inetutils-1.9.4.tar
cd inetutils-1.9.4
./configure --prefix=/usr        \
            --localstatedir=/var \
            --disable-logger     \
            --disable-whois      \
            --disable-rcp        \
            --disable-rexec      \
            --disable-rlogin     \
            --disable-rsh        \
            --disable-servers
make
make check
make install
mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin
mv -v /usr/bin/ifconfig /sbin

Perl

cd /sources
tar jxf perl-5.24.0.tar.bz2
cd perl-5.24.0
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
export BUILD_ZLIB=False
export BUILD_BZIP2=0
sh Configure -des -Dprefix=/usr                 \
                  -Dvendorprefix=/usr           \
                  -Dman1dir=/usr/share/man/man1 \
                  -Dman3dir=/usr/share/man/man3 \
                  -Dpager="/usr/bin/less -isR"  \
                  -Duseshrplib
make
make -k test
make install
unset BUILD_ZLIB BUILD_BZIP2

XML::Parser

cd /sources
tar zxf XML-Parser-2.44.tar.gz
cd XML-Parser-2.44
perl Makefile.PL
make
make test
make install

Intltool

cd /sources
tar zxf intltool-0.51.0.tar.gz
cd intltool-0.51.0
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
./configure --prefix=/usr
make
make check
make install
install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO

Autoconf

cd /sources
xz -d autoconf-2.69.tar.xz
tar xf autoconf-2.69.tar
cd autoconf-2.69
./configure --prefix=/usr
make
make check
make install

Automake

cd /sources
xz -d automake-1.15.tar.xz
tar xf automake-1.15.tar
cd automake-1.15
sed -i 's:/\\\${:/\\\$\\{:' bin/automake.in
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.15
make
sed -i "s:./configure:LEXLIB=/usr/lib/libfl.a &:" t/lex-{clean,depend}-cxx.sh
make -j4 check
make install

Xz

cd /sources
tar xf xz-5.2.2.tar
cd xz-5.2.2
sed -e '/mf\.buffer = NULL/a next->coder->mf.size = 0;' \
     -i src/liblzma/lz/lz_encoder.c
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/xz-5.2.2
make
make check
make install
mv -v   /usr/bin/{lzma,unlzma,lzcat,xz,unxz,xzcat} /bin
mv -v /usr/lib/liblzma.so.* /lib
ln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.so

Kmod

cd /sources
xz -d kmod-23.tar.xz
tar xf kmod-23.tar
cd kmod-23
./configure --prefix=/usr          \
            --bindir=/bin          \
            --sysconfdir=/etc      \
            --with-rootlibdir=/lib \
            --with-xz              \
            --with-zlib
make
make install
for target in depmod insmod lsmod modinfo modprobe rmmod; do
  ln -sfv ../bin/kmod /sbin/$target
done
ln -sfv kmod /bin/lsmod

Gettext

cd /sources
tar xf gettext-0.19.8.1.tar
cd gettext-0.19.8.1
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/gettext-0.19.8.1
make
make check
make install
chmod -v 0755 /usr/lib/preloadable_libintl.so

Systemd

cd /sources
xz -d systemd-231.tar.xz
tar xf systemd-231.tar
cd systemd-231
sed -i "s:blkid/::" $(grep -rl "blkid/blkid.h")
sed -e 's@test/udev-test.pl @@'  \
    -e 's@test-copy$(EXEEXT) @@' \
    -i Makefile.in
cat > config.cache << "EOF"
KILL=/bin/kill
MOUNT_PATH=/bin/mount
UMOUNT_PATH=/bin/umount
HAVE_BLKID=1
BLKID_LIBS="-lblkid"
BLKID_CFLAGS="-I/tools/include/blkid"
HAVE_LIBMOUNT=1
MOUNT_LIBS="-lmount"
MOUNT_CFLAGS="-I/tools/include/libmount"
cc_cv_CFLAGS__flto=no
XSLTPROC="/usr/bin/xsltproc"
EOF
./configure --prefix=/usr            \
            --sysconfdir=/etc        \
            --localstatedir=/var     \
            --config-cache           \
            --with-rootprefix=       \
            --with-rootlibdir=/lib   \
            --enable-split-usr       \
            --disable-firstboot      \
            --disable-ldconfig       \
            --disable-sysusers       \
            --without-python         \
            --with-default-dnssec=no \
            --docdir=/usr/share/doc/systemd-231
make LIBRARY_PATH=/tools/lib
make LD_LIBRARY_PATH=/tools/lib install
mv -v /usr/lib/libnss_{myhostname,mymachines,resolve}.so.2 /lib
rm -rfv /usr/lib/rpm
for tool in runlevel reboot shutdown poweroff halt telinit; do
     ln -sfv ../bin/systemctl /sbin/${tool}
done
ln -sfv ../lib/systemd/systemd /sbin/init
systemd-machine-id-setup
rm -fv /etc/resolv.conf
ln -s ../lib/systemd/resolv.conf /etc/resolv.conf
sed -i "s:minix:ext4:g" src/test/test-path-util.c
make LD_LIBRARY_PATH=/tools/lib -k check

Procps

cd /sources
xz -d procps-ng-3.3.12.tar.xz
tar xf procps-ng-3.3.12.tar
cd procps-ng-3.3.12
./configure --prefix=/usr                            \
            --exec-prefix=                           \
            --libdir=/usr/lib                        \
            --docdir=/usr/share/doc/procps-ng-3.3.12 \
            --disable-static                         \
            --disable-kill                           \
            --with-systemd
make
sed -i -r 's|(pmap_initname)\\\$|\1|' testsuite/pmap.test/pmap.exp
make check
make install
mv -v /usr/lib/libprocps.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.so

E2fsprogs

cd /sources
tar zxf e2fsprogs-1.43.1.tar.gz
cd e2fsprogs-1.43.1
sed -i -e 's:\[\.-\]::' tests/filter.sed
mkdir -v build
cd build

LIBS=-L/tools/lib \

CFLAGS=-I/tools/include              \
PKG_CONFIG_PATH=/tools/lib/pkgconfig \
../configure --prefix=/usr           \
             --bindir=/bin           \
             --with-root-prefix=""   \
             --enable-elf-shlibs     \
             --disable-libblkid      \
             --disable-libuuid       \
             --disable-uuidd         \
             --disable-fsck
make
ln -sfv /tools/lib/lib{blk,uu}id.so.1 lib
make LD_LIBRARY_PATH=/tools/lib check
make install
make install-libs
chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
makeinfo -o      doc/com_err.info ../lib/et/com_err.texinfo
install -v -m644 doc/com_err.info /usr/share/info
install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info

Coreutils

cd /sources
tar xf coreutils-8.25.tar
cd coreutils-8.25
patch -Np1 -i ../coreutils-8.25-i18n-2.patch
FORCE_UNSAFE_CONFIGURE=1 ./configure \
            --prefix=/usr            \
            --enable-no-install-program=kill,uptime
FORCE_UNSAFE_CONFIGURE=1 make
make NON_ROOT_USERNAME=nobody check-root
echo "dummy:x:1000:nobody" >> /etc/group
chown -Rv nobody .
su nobody -s /bin/bash \
          -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
sed -i '/dummy/d' /etc/group
make install
mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
mv -v /usr/bin/chroot /usr/sbin
mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8
mv -v /usr/bin/{head,sleep,nice,test,[} /bin

Diffutils

cd /sources
tar xf diffutils-3.5.tar
cd diffutils-3.5
sed -i 's:= @mkdir_p@:= /bin/mkdir -p:' po/Makefile.in.in
./configure --prefix=/usr
make
make check
make install

Gawk

cd /sources
tar xf gawk-4.1.3.tar
cd gawk-4.1.3
./configure --prefix=/usr
make
make check
make install

mkdir -v /usr/share/doc/gawk-4.1.3
cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.1.3


Findutils

cd /sources
tar zxf findutils-4.6.0.tar.gz
cd findutils-4.6.0
./configure --prefix=/usr --localstatedir=/var/lib/locate
make
make check
make install
mv -v /usr/bin/find /bin
sed -i 's|find:=${BINDIR}|find:=/bin|' /usr/bin/updatedb

Groff

cd /sources
tar zxf groff-1.22.3.tar.gz
cd groff-1.22.3
PAGE=A4 ./configure --prefix=/usr
make
make install

GRUB

cd /sources
xz -d grub-2.02~beta3.tar.xz
tar xf grub-2.02~beta3.tar
cd grub-2.02~beta3
./configure --prefix=/usr          \
            --sbindir=/sbin        \
            --sysconfdir=/etc      \
            --disable-efiemu       \
            --disable-werror
make
make install

Less

cd /sources
tar zxf less-481.tar.gz
cd less-481
./configure --prefix=/usr --sysconfdir=/etc
make
make install

Gzip

cd /sources
tar xf gzip-1.8.tar
cd gzip-1.8
./configure --prefix=/usr
make
make check
make install
mv -v /usr/bin/gzip /bin

IPRoute2

cd /sources
xz -d iproute2-4.7.0.tar.xz
tar xf iproute2-4.7.0.tar
cd iproute2-4.7.0
sed -i /ARPD/d Makefile
sed -i 's/arpd.8//' man/man8/Makefile
rm -v doc/arpd.sgml
sed -i 's/m_ipt.o//' tc/Makefile
make
make DOCDIR=/usr/share/doc/iproute2-4.7.0 install

Kbd

cd /sources
xz -d kbd-2.0.3.tar.xz
tar xf kbd-2.0.3.tar
cd kbd-2.0.3
patch -Np1 -i ../kbd-2.0.3-backspace-1.patch
sed -i 's/\(RESIZECONS_PROGS=\)yes/\1no/g' configure
sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr --disable-vlock
make
make check
make install
mkdir -v       /usr/share/doc/kbd-2.0.3
cp -R -v docs/doc/* /usr/share/doc/kbd-2.0.3

Libpipeline

cd /sources
tar zxf libpipeline-1.4.1.tar.gz
cd libpipeline-1.4.1
PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr
make
make check
make install

Make

cd /sources
tar jxf make-4.2.1.tar.bz2
cd make-4.2.1
./configure --prefix=/usr
make
make check
make install

Patch

cd /sources
tar xf patch-2.7.5.tar
cd patch-2.7.5
./configure --prefix=/usr
make
make check
make install

D-Bus

cd /sources
zxf dbus-1.10.10.tar.gz
cd dbus-1.10.10
 ./configure --prefix=/usr                       \
              --sysconfdir=/etc                   \
              --localstatedir=/var                \
              --disable-static                    \
              --disable-doxygen-docs              \
              --disable-xml-docs                  \
              --docdir=/usr/share/doc/dbus-1.10.10 \
              --with-console-auth-dir=/run/console
make
make install
mv -v /usr/lib/libdbus-1.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libdbus-1.so) /usr/lib/libdbus-1.so
ln -sfv /etc/machine-id /var/lib/dbus

Util-linux

cd /sources
tar xf util-linux-2.28.1.tar
cd util-linux-2.28.1
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime   \
            --docdir=/usr/share/doc/util-linux-2.28.1 \
            --disable-chfn-chsh  \
            --disable-login      \
            --disable-nologin    \
            --disable-su         \
            --disable-setpriv    \
            --disable-runuser    \
            --disable-pylibmount \
            --disable-static     \
            --without-python     \
            --enable-libmount-force-mountinfo
make
chown -Rv nobody .
su nobody -s /bin/bash -c "PATH=$PATH make -k check"
make install

Man-DB

cd /sources
xz -d man-db-2.7.5.tar.xz
tar xf man-db-2.7.5.tar
cd man-db-2.7.5
./configure --prefix=/usr                        \
            --docdir=/usr/share/doc/man-db-2.7.5 \
            --sysconfdir=/etc                    \
            --disable-setuid                     \
            --with-browser=/usr/bin/lynx         \
            --with-vgrind=/usr/bin/vgrind        \
            --with-grap=/usr/bin/grap
make
make check
make install
sed -i "s:man root:root root:g" /usr/lib/tmpfiles.d/man-db.conf

Tar

cd /sources
tar xf tar-1.29.tar
cd tar-1.29
FORCE_UNSAFE_CONFIGURE=1  \
./configure --prefix=/usr \
            --bindir=/bin
make
make check
make install
make -C doc install-html docdir=/usr/share/doc/tar-1.29

Texinfo

cd /sources
tar xf texinfo-6.1.tar
cd texinfo-6.1
./configure --prefix=/usr --disable-static
make
make check
make install
make TEXMF=/usr/share/texmf install-tex
pushd /usr/share/info
rm -v dir
for f in *
  do install-info $f dir 2>/dev/null
done
popd

Vim

cd /sources
tar jxf vim-7.4.tar.bz2

cd vim74

echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
./configure --prefix=/usr
make
make -j1 test
make install
ln -sv vim /usr/bin/vi
for L in  /usr/share/man/{,*/}man1/vim.1; do
    ln -sv vim.1 $(dirname $L)/vi.1
done
ln -sv ../vim/vim74/doc /usr/share/doc/vim-7.4
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc

set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
  set background=dark
endif

" End /etc/vimrc
EOF
vim -c ':options'

终于编译完了,很累很累,中间是不是也碰到很多错误?呵呵~~~

清理一下
先退出 保证环境没有错误

logout

重新进入

chroot $LFS /tools/bin/env -i            \
    HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin   \
    /tools/bin/bash --login

清理

/tools/bin/find /usr/lib -type f -name \*.a \
   -exec /tools/bin/strip --strip-debug {} ';'
/tools/bin/find /lib /usr/lib -type f -name \*.so* \
   -exec /tools/bin/strip --strip-unneeded {} ';'
/tools/bin/find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \
    -exec /tools/bin/strip --strip-all {} ';'
rm -rf /tmp/*

修改进入命令

chroot "$LFS" /usr/bin/env -i              \
    HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin     \
    /bin/bash --login
rm -f /usr/lib/lib{bfd,opcodes}.a
rm -f /usr/lib/libbz2.a
rm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.a
rm -f /usr/lib/libltdl.a
rm -f /usr/lib/libfl.a
rm -f /usr/lib/libfl_pic.a
rm -f /usr/lib/libz.a

好了,这章终于结束了,搞个LOL,看个电影,等待下一章系统配置!

跟着我来一起编译lfs(三) 临时工具链及文件系统

接下来开始第二次工具链的编译建立一个完成临时系统,为什么要第二次,上一文中解释了,就不多啰嗦了,为了避免不必要的错误,我们先把第一次解压出来的目录文件删除,重新来。

第一件事

echo $LFS

/mnt/lfs

查看环境,这一步一定要看清楚!!!!!

cd $LFS/sources
rm -rf binutils-2.27 gcc-6.2.0 linux-4.7.2 glibc-2.24

编译Binutils

tar jxf binutils-2.27.tar.bz2
cd binutils-2.27
mkdir -v build
cd build
CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configure \
--prefix=/tools \
--disable-nls \
--disable-werror \
--with-lib-path=/tools/lib \
--with-sysroot
make
make install
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

GCC

cd $LFS/sources
tar jxf gcc-6.2.0.tar.bz2
cd gcc-6.2.0
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done
tar -xf ../mpfr-3.1.4.tar.xz
mv -v mpfr-3.1.4 mpfr
tar -xf ../gmp-6.1.1.tar.xz
mv -v gmp-6.1.1 gmp
tar -xf ../mpc-1.0.3.tar.gz
mv -v mpc-1.0.3 mpc
mkdir -v build
cd build
CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configure \
--prefix=/tools \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp
make
make install

进入/tools/bin目录建一个CC的链接,很多软件编译的时候用的是CC

cd $LFS/tools/bin
ln -sv gcc /tools/bin/cc

来测试一下编译的工具

cd ~
echo 'int main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

正常情况,首该没有任何错误,然后显示
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

如果输出不是像上面那样或者根本就没有输出,那么可能某些地方出错了。调查并回溯这些步骤,找出问题所在并改正它。在继续之前必须解决这个问题。

一旦一切都顺利,清理测试文件:

rm -v dummy.c a.out
我们继续


下面我们编译4个用来测试的包,目的就是为了后面的测试用的,非必须。


Tcl-core

cd $LFS/sources
tar zxf tcl-core8.6.6-src.tar.gz
cd tcl8.6.6/unix/
./configure --prefix=/tools
make

测试

TZ=UTC make test
make install

改权限

chmod -v u+w /tools/lib/libtcl8.6.so

安装tcl头文件

make install-private-headers

创建软链接

cd $LFS/tools/bin
ln -sv tclsh8.6 /tools/bin/tclsh

Expect

cd $LFS/sources
tar zxf expect5.45.tar.gz
cd expect5.45
cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure
./configure --prefix=/tools \
--with-tcl=/tools/lib \
--with-tclinclude=/tools/include
make

测试一下,这里测试可能会有错误,不过不要紧

make test
make SCRIPTS="" install

DejaGNU

cd $LFS/sources
tar zxf dejagnu-1.6.tar.gz
cd dejagnu-1.6
./configure --prefix=/tools
make install
make check

Check

cd $LFS/sources
tar zxf check-0.10.0.tar.gz
cd check-0.10.0
PKG_CONFIG= ./configure --prefix=/tools
make

这个过程可能会很慢,等不及就退出吧

make check
make install

继续安装
Ncurses

cd $LFS/sources
tar zxf ncurses-6.0.tar.gz
cd ncurses-6.0
sed -i s/mawk// configure
./configure --prefix=/tools \
--with-shared \
--without-debug \
--without-ada \
--enable-widec \
--enable-overwrite
make
make install

Bash

cd $LFS/sources
tar zxf bash-4.3.30.tar.gz
cd bash-4.3.30
./configure --prefix=/tools --without-bash-malloc
make
make tests
make install

建立软链接

cd $LFS/tools/bin
ln -sv bash /tools/bin/sh

Bzip2

cd $LFS/sources
tar zxf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
make PREFIX=/tools install

Coreutils

cd $LFS/sources
xz -d coreutils-8.25.tar.xz
tar xf coreutils-8.25.tar
cd coreutils-8.25
./configure --prefix=/tools --enable-install-program=hostname
make
make RUN_EXPENSIVE_TESTS=yes check
make install

Diffutils

cd $LFS/sources
xz -d diffutils-3.5.tar.xz
tar xf diffutils-3.5.tar
cd diffutils-3.5
./configure --prefix=/tools
make
make check
make install

File

cd $LFS/sources
tar zxf file-5.28.tar.gz
cd file-5.28
./configure --prefix=/tools
make
make check
make install

Findutils

cd $LFS/sources
tar zxf findutils-4.6.0.tar.gz
cd findutils-4.6.0
./configure --prefix=/tools
make
make check
make install

Gawk

cd $LFS/sources
xz -d gawk-4.1.3.tar.xz
tar xf gawk-4.1.3.tar
cd gawk-4.1.3
./configure --prefix=/tools
make
make check
make install

Gettext

cd $LFS/sources
xz -d gettext-0.19.8.1.tar.xz
tar xf gettext-0.19.8.1.tar
cd gettext-0.19.8.1
cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt
make -C src msgmerge
make -C src xgettext
cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

Grep

cd $LFS/sources
xz -d grep-2.25.tar.xz
tar xf grep-2.25.tar
cd grep-2.25
./configure --prefix=/tools
make
make check
make install

Gzip

cd $LFS/sources
xz -d gzip-1.8.tar.xz
tar xf gzip-1.8.tar
cd gzip-1.8
./configure --prefix=/tools
make
make check
make install

M4

cd $LFS/sources
xz -d m4-1.4.17.tar.xz
tar xf m4-1.4.17.tar
cd m4-1.4.17
./configure --prefix=/tools
make
make check
make install

Make

cd $LFS/sources
tar jxf make-4.2.1.tar.bz2
cd make-4.2.1
./configure --prefix=/tools --without-guile
make
make check
make install

Patch

cd $LFS/sources
xz -d patch-2.7.5.tar.xz
tar xf patch-2.7.5.tar
cd patch-2.7.5
./configure --prefix=/tools
make
make check
make install

Perl

cd $LFS/sources
tar jxf perl-5.24.0.tar.bz2
cd perl-5.24.0
sh Configure -des -Dprefix=/tools -Dlibs=-lm
make
cp -v perl cpan/podlators/scripts/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.24.0
cp -Rv lib/* /tools/lib/perl5/5.24.0

Sed

cd $LFS/sources
tar jxf sed-4.2.2.tar.bz2
cd sed-4.2.2
./configure --prefix=/tools
make
make check
make install

Tar

cd $LFS/sources
xz -d tar-1.29.tar.xz
tar xf tar-1.29.tar
cd tar-1.29
./configure --prefix=/tools
make
make check
make install

Texinfo

cd $LFS/sources
xz -d texinfo-6.1.tar.xz
tar xf texinfo-6.1.tar
cd texinfo-6.1
./configure --prefix=/tools
make
make check
make install

Util-linux

cd $LFS/sources
xz -d util-linux-2.28.1.tar.xz
tar xf util-linux-2.28.1.tar
cd util-linux-2.28.1
./configure --prefix=/tools \
--without-python \
--disable-makeinstall-chown \
--without-systemdsystemunitdir \
--enable-libmount-force-mountinfo \
PKG_CONFIG=""
make
make install

Xz

cd $LFS/sources
xz -d xz-5.2.2.tar.xz
tar xf xz-5.2.2.tar
cd xz-5.2.2
./configure --prefix=/tools
make
make check
make install

如果你一路到了这里,恭喜你,工具链环境编译结束了,轻松一下,虽让只是一路复制,但是也是很辛苦的。

接下来做一下收尾工作,清理一下不用的东西,但是这不是必须的,如果怕出问题就算了,这边主要是清理无效的文件,节省空间

strip --strip-debug /tools/lib/*
/usr/bin/strip --strip-unneeded /tools/{,s}bin/*

还可以删除一些帮助文件,当然也不是必须的

rm -rf /tools/{,share}/{info,man,doc}

最后改变目录的所属

exit
chown -R root:root $LFS/tools

好了,接下来这一步很重要,备份!!,备份!!,备份!!,重要的话说三遍

在第一章中我们创建了一个虚拟硬盘,我们现在就要备份这个硬盘,怎么备份?找到这个文件拷贝一份。

先关闭虚拟机

查看虚拟硬盘位置

复制一份。

 

好了,大家休息吧!后面正真开始构建lfs系统,期待一下!

跟着我来一起编译lfs(二) 工具链编译初识

建立交叉编译环境,这个步骤比较长及繁琐,耗时非常长,中间要准备好零食、饮料、连续剧,当然也可以LOL,尽量在娱乐中度过。

这里要理解一下交叉编译环境是干什么的?为什么要有这个环境?

首先我们最终的目的就是完成一个独立mini linux操作系统,记得前一章我们添加的那块虚拟硬盘么,这个系统将会在这块硬盘上产生,而产生这个系统的过程就是要用编译等工具生产相应的二进制文件,但是如果我们直接编译出二进制文件放在虚拟硬盘中,最终将无法运行,因为这块虚拟的硬盘上只有二进制文件,对应的依赖包等在我们的centos(及宿主机)中,所以我们先用centos(及宿主机)的编译工具和下载的源码编译出一套工具链,然后再用这个编译出来的工具链和下载的源码编译出独立的工具链。这样整个工具链及环境就都在我们的虚拟硬盘上,后面脱离宿主机一样可以运行。

好的,大概解释了一下,可能有不完整的地方,大家大概知道意思就可以。

第一件事

echo $LFS

/mnt/lfs

查看环境,这一步一定要看清楚!!!!!

接下来开始第一次工具链编译

cd $LFS/sources

编译Binutils

tar jxf binutils-2.27.tar.bz2
cd binutils-2.27
mkdir -v build
cd build
../configure --prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror

如果报错看看是不是GCC C++等工具没有安装?yum install 缺少的工具

make

64位系统添加一个lib64目录的软连接

case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
make install

编译GCC

这一步出错的可能性比较高,我们继续

重新进入sources目录

cd $LFS/sources
tar jxf gcc-6.2.0.tar.bz2
cd gcc-6.2.0
tar -xf ../mpfr-3.1.4.tar.xz
mv -v mpfr-3.1.4 mpfr
tar -xf ../gmp-6.1.1.tar.xz
mv -v gmp-6.1.1 gmp
tar -xf ../mpc-1.0.3.tar.gz
mv -v mpc-1.0.3 mpc

修改 GCC 默认的动态链接器为安装在 /tools 文件夹中的

for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done
mkdir -v build
cd build
../configure \
--target=$LFS_TGT \
--prefix=/tools \
--with-glibc-version=2.11 \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libmpx \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++
make
make install

Linux-4.7.2 API Headers

cd $LFS/sources
xz -d linux-4.7.2.tar.xz  (如果你是从我分享的网盘下的源码,可能已经解压成tar了,报错就忽略)
tar xf linux-4.7.2.tar
cd linux-4.7.2
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

Glibc

cd $LFS/sources
xz -d glibc-2.24.tar.xz  (如果你是从我分享的网盘下的源码,可能已经解压成tar了,报错就忽略)
tar xf glibc-2.24.tar
cd glibc-2.24
mkdir -v build
cd build
../configure \
--prefix=/tools \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=2.6.32 \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
make
make install

到这第一次编译快结束了,我们来验证一下,编译的东西是否正确。

换一个目录

cd ~
echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'

正常情况,首该没有任何错误,然后显示
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

如果输出不是像上面那样或者根本就没有输出,那么可能某些地方出错了。调查并回溯这些步骤,找出问题所在并改正它。在继续之前必须解决这个问题。

一旦一切都顺利,清理测试文件:

rm -v dummy.c a.out

我们继续


Libstdc++

Libstdc++ 是 GCC 源文件的一部分,我们还是使用gcc-6.2.0源码,先删除之前的,重新解压

cd $LFS/sources
rm -rf gcc-6.2.0
tar jxf gcc-6.2.0.tar.bz2
cd gcc-6.2.0
mkdir -v build
cd build
../libstdc++-v3/configure           \
    --host=$LFS_TGT                 \
    --prefix=/tools                 \
    --disable-multilib              \
    --disable-nls                   \
    --disable-libstdcxx-threads     \
    --disable-libstdcxx-pch         \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/6.2.0
make
make install

好了,第一次工具链编译结束了,如果一切都顺利的话,恭喜你!否则我想你应该是很郁闷的,各种报错。

这里很多编译时的参数都没有详细介绍,因为写出来篇幅会比较多,而且官网上也有,其次,如果你是第一次玩lfs建议你就忽略吧,先弄出来再说。

休息一下~后面准备第二次编译。

跟着我来一起编译lfs(一) 前期准备

linuxfromscratch (lsf)

http://www.linuxfromscratch.org

具体是什么自行百度吧。

我编译的是7.10的版本(官方教程地址:点这里),其他版本大家可以自己去试,这个教程主要是让大家能够更清楚linux的一些目录,文件及命令。

这个过程是很漫长的,如果要跟着一起编译,要有足够的耐心,每台机器的环境都不一样,每个人所碰到的问题很有可能完全不一样,所以最终还是要靠大家自己去找答案,当然,我在编译的过程出现的问题一定会告之大家,避免碰到弯路。

先说一下我的环境

操作系统:win7

虚拟机:virtualbox

前期准备

1、在virtualbox中安装centos的系统,我用的是CentOS release 6.8,其他版本自行安装

2、添加一块虚拟硬盘,分区,创建目录

3、检测环境及下载源代码


一、安装centos

下载一个centos镜像

virtualbox 新建虚拟电脑,名称为 centos,上图

安装系统

然后启动,具体安装过程不再细说。


二、添加一块虚拟硬盘,分区,创建目录

安装好以后,关闭centos,添加一块虚拟硬盘给lfs用,上图

虚拟硬盘就添加好了。上图

启动系统,先全局更新

yum update

给虚拟硬盘分区

fdisk /dev/sdb

输入 n  (创建分区)

输入 p  (创建主分区)

输入 1  (只有一个分区)

一路回车 (确认分区大小)

最后w (写入分区信息)

环境变量及创建目录,这里命令比较多

export LFS=/mnt/lfs

请注意,以后每次重启或断开等情况都要先执行

echo $LFS

/mnt/lfs

看看目录是否正确,一定要记住

创建根目录

mkdir -pv $LFS

挂载硬盘

mount -v -t ext4 /dev/sdb1 $LFS

创建源码目录

mkdir -v $LFS/sources

添加读写权限

chmod -v a+wt $LFS/sources

创建工具目录

mkdir -v $LFS/tools

链接到根目录

ln -sv $LFS/tools /

添加lfs组

groupadd lfs

添加lfs用户

useradd -s /bin/bash -g lfs -m -k /dev/null lfs

修改lfs密码,自行设置

passwd lfs

修改目录所属

chown -v lfs $LFS/tools
chown -v lfs $LFS/sources

切换用户

su - lfs

给lfs添加环境变量
第一个脚本

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

第二个脚本

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF

生效环境

source ~/.bash_profile ~/.bashrc

三、检测环境及下载源代码

cd ~

检测环境
第一个脚本

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH

echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found"
fi

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1

if [ -h /usr/bin/awk ]; then
  echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
  echo awk is `/usr/bin/awk --version | head -n1`
else
  echo "awk not found"
fi

gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-  # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1

echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF
bash version-check.sh

看结果,差哪个就安装哪个,这边不说了,有看到什么xxx not found什么的都是缺少的工具,一一补上。

第二个脚本

cat > library-check.sh << "EOF"
#!/bin/bash
for lib in lib{gmp,mpfr,mpc}.la; do
  echo $lib: $(if find /usr/lib* -name $lib|
               grep -q $lib;then :;else echo not;fi) found
done
unset lib
EOF
bash library-check.sh

这里是检测gmp,mpfr,mpc这三个库,结果如果不是以下两种就是有问题
1、都显示没有 (not found)
2、都显示有 (found)

如果有的有,有的没有就有问题

下载源码,这个过程比较漫长,好多包要翻墙

源码列表地址 http://www.linuxfromscratch.org/lfs/view/7.10-systemd/wget-list,下载下来

wget --input-file=wget-list --continue --directory-prefix=$LFS/sources

下载会比较慢,这边给一个百度云盘的链接: http://pan.baidu.com/s/1pKP86t9 密码: dkpa

漫长的等待,那第一篇也结束了。

docker简述

这些都是从网络上摘抄的,大家看看。

琢磨一下,docker可以做很多东西。

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
Docker通常用于如下场景:

web应用的自动化打包和发布;
自动化测试和持续集成、发布;
在服务型环境中部署和调整数据库或其他的后台应用;
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

官网 https://www.docker.com/
文档 https://docs.docker.com/

 

Docker 两个主要部件:

  • Docker: 开源的容器虚拟化平台
  • Docker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台 — Docker Hub

Docker 使用客户端-服务器 (C/S) 架构模式。Docker 客户端会与 Docker 守护进程进行通信。Docker 守护进程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker 客户端去连接一个远程的 Docker 守护进程。Docker 客户端和守护进程之间通过 socket 或者 RESTful API 进行通信。

非常详细的 Docker 学习笔记

1.1 Docker 守护进程

如上图所示,Docker 守护进程运行在一台主机上。用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。

1.2 Docker 客户端

Docker 客户端,实际上是 docker 的二进制程序,是主要的用户与 Docker 交互方式。它接收用户指令并且与背后的 Docker 守护进程通信,如此来回往复。

1.3 Docker 内部

要理解 Docker 内部构建,需要理解以下三种部件:

  • Docker 镜像 – Docker images
  • Docker 仓库 – Docker registeries
  • Docker 容器 – Docker containers

Docker 镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新 的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

Docker 仓库

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

Docker 容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

1.4 libcontainer

Docker 从 0.9 版本开始使用 libcontainer 替代 lxc,libcontainer 和 Linux 系统的交互图如下:

非常详细的 Docker 学习笔记

1.5 命名空间「Namespaces」

pid namespace

不同用户的进程就是通过 pid namespace 隔离开的,且不同 namespace 中可以有相同 PID。具有以下特征:

  • 每个 namespace 中的 pid 是有自己的 pid=1 的进程(类似 /sbin/init 进程)
  • 每个 namespace 中的进程只能影响自己的同一个 namespace 或子 namespace 中的进程
  • 因为 /proc 包含正在运行的进程,因此在 container 中的 pseudo-filesystem 的 /proc 目录只能看到自己 namespace 中的进程
  • 因为 namespace 允许嵌套,父 namespace 可以影响子 namespace 的进程,所以子 namespace 的进程可以在父 namespace 中看到,但是具有不同的 pid

参考文档:Introduction to Linux namespaces – Part 3: PID

mnt namespace

类似 chroot,将一个进程放到一个特定的目录执行。mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个 namespace 中的 Container 在 /proc/mounts 的信息只包含所在 namespace 的 mount point。

net namespace

网络隔离是通过 net namespace 实现的, 每个 net namespace 有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个 container 的网络就能隔离开来。 docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 docker bridge 连接在一起。

参考文档:Introduction to Linux namespaces – Part 5: NET

uts namespace

UTS (“UNIX Time-sharing System”) namespace 允许每个 container 拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。

参考文档:Introduction to Linux namespaces – Part 1: UTS

ipc namespace

container 中进程交互还是采用 Linux 常见的进程间交互方法 (interprocess communication – IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同,container 的进程间交互实际上还是 host 上具有相同 pid namespace 中的进程间交互,因此需要在IPC资源申请时加入 namespace 信息 – 每个 IPC 资源有一个唯一的 32bit ID。

参考文档:Introduction to Linux namespaces – Part 2: IPC

user namespace

每个 container 可以有不同的 user 和 group id, 也就是说可以以 container 内部的用户在 container 内部执行程序而非 Host 上的用户。

有了以上 6 种 namespace 从进程、网络、IPC、文件系统、UTS 和用户角度的隔离,一个 container 就可以对外展现出一个独立计算机的能力,并且不同 container 从 OS 层面实现了隔离。 然而不同 namespace 之间资源还是相互竞争的,仍然需要类似 ulimit 来管理每个 container 所能使用的资源 – cgroup。

Reference

1.6 资源配额「cgroups」

cgroups 实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup 目录下新建一个文件夹即可新建一个 group,在此文件夹中新建 task 文件,并将 pid 写入该文件,即可实现对该进程的资源控制。具体的资源配置选项可以在该文件夹中新建子 subsystem ,{子系统前缀}.{资源项} 是典型的配置方法, 如 memory.usageinbytes 就定义了该 group 在 subsystem memory 中的一个内存限制选项。 另外,cgroups 中的 subsystem 可以随意组合,一个 subsystem 可以在不同的 group 中,也可以一个 group 包含多个 subsystem – 也就是说一个 subsystem。

  • memory
    • 内存相关的限制
  • cpu
    • 在 cgroup 中,并不能像硬件虚拟化方案一样能够定义 CPU 能力,但是能够定义 CPU 轮转的优先级,因此具有较高 CPU 优先级的进程会更可能得到 CPU 运算。 通过将参数写入 cpu.shares ,即可定义改 cgroup 的 CPU 优先级 – 这里是一个相对权重,而非绝对值
  • blkio
    • block IO 相关的统计和限制,byte/operation 统计和限制 (IOPS 等),读写速度限制等,但是这里主要统计的都是同步 IO
  • devices
    • 设备权限限制

参考文档:how to use cgroup

jenkins 通过git获取代码

在jenkins中通过git插件获取代码时会要求jenkins必须有获取代码的权限。在jenkins项目时可以通过下述方法来配置:

1、启动jenkins并在浏览器访问你的jenkins即:http://your ip:8080

2、在jenkins上配置credentials,在创建项目时使用。其配置方法如下:

a、在jenkins左边目录树依次点击credentials—-system—-add domain,如图:

其中:domain name:为方便起见填写git服务器的地址;description :为描述性文字可填可不填。

b、点击“ok”后,再点击“adding some credentials”,如图:

点击“adding some credentials”弹出页面如下:

 

其中:

kind:有username with password、SSH Username with private key。这个根据实际情况选择,这里我们选择“username with password”.

username:一般取项目名称,用来在创建项目时使用该credentials。如图:

保存后,jenkins就可以通过git插件来获取代码了。

要验证,单击新建项目在 Jenkins 的菜单选项。然后输入一个名称的工作,在以下示例中,输入的名称为”test2″,选中“构建一个maven项目”
点击“确定”后。标签切换到“源码管理”如下图: