登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 470|回复: 0

"多快好省"——交织编译构建本身的linux操纵体系

[复制链接]

164

主题

164

帖子

0

现金

黑狼菜鸟

Rank: 1

积分
0
发表于 2019-1-31 22:59:05 | 显示全部楼层 |阅读模式 来自 江苏徐州
w91zPYAVQ49fa4q2.jpg

媒介


  • 有许多小同伴都想在本身的存储装备上构建的Linux,本日咱就来讨论下怎样构建本身的Linux体系(编译情况+运行情况)


术语


  • Host:实行交织编译、安装动作的主机
  • Target:利用源码交织编译出来的目的机,会利用Host的交织编译工具
  • Cross compiler:在Host上编译出来的交织编译器,在Host上运行,但是它用于编译与Host不兼容的目的体系布局或微处置惩罚器。
先决条件和工具

要举行一下操纵过程,你必要在Host上有gcc,make,ncurses,perl以及grub工具(尤其是grub-install大概grub2-install)。


  • 为了构建目的体系,你必要为交织编译下载且编译以下开源包:

    • binutils-2.30.tar.xz
    • busybox-1.28.3.tar.bz2
    • bootscripts-clfs-embedded-1.0-pre5.tar.bz2
    • gcc-7.3.0.tar.xz
    • glibc-2.27.tar.xz
    • gmp-6.1.2.tar.bz2
    • linux-4.16.3.tar.xz
    • mpc-1.1.0.tar.gz
    • mpfr-4.0.1.tar.xz
    • zlib-1.2.11.tar.gz

1.设置情况


  • 1.1在开始之前,必要设置编译的shell情况,开启bash的hash功能

  • set +h


  • 1.2确保新创建的文件/目次仅由全部者可写(比方,当前登录的用户帐户)

  • umask 022


  • 1.3您将利用主目次作为主构建目次。(这不是必须)。这里将安装交织编译工具链和目的映像,并将其放入lj-os子目次中。假如您想在其他地方安装它,请对下面的代码部门举行调解:

  • export LJOS=~/lj-os
  • mkdir -pv ${LJOS}


  • 1.4 导入一些剩下的变量

  • export LC_ALL=POSIX
  • export PATH=${LJOS}/cross-tools/bin:/bin:/usr/bin


  • 1.5 创建一些创建目的映像的根文件体系条理布局

  • mkdir -pv ${LJOS}/{bin,boot/{,grub},dev,{etc/,}opt,home,lib/{firmware,modules},lib64,mnt}
  • mkdir -pv ${LJOS}/{proc,media/{floppy,cdrom},sbin,srv,sys}
  • mkdir -pv ${LJOS}/var/{lock,log,mail,run,spool}
  • mkdir -pv ${LJOS}/var/{opt,cache,lib/{misc,locate},local}
  • install -dv -m 0750 ${LJOS}/root
  • install -dv -m 1777 ${LJOS}{/var,}/tmp
  • install -dv ${LJOS}/etc/init.d
  • mkdir -pv ${LJOS}/usr/{,local/}{bin,include,lib{,64},sbin,src}
  • mkdir -pv ${LJOS}/usr/{,local/}share/{doc,info,locale,man}
  • mkdir -pv ${LJOS}/usr/{,local/}share/{misc,terminfo,zoneinfo}
  • mkdir -pv ${LJOS}/usr/{,local/}share/man/man{1,2,3,4,5,6,7,8}
  • for dir in ${LJOS}/usr{,/local}; do
  •    ln -sv share/{man,doc,info} ${dir}
  • done


  • 1.6 创建交织编译工具链的目次

  • install -dv ${LJOS}/cross-tools{,/bin}


  • 1.7 利用/proc/mounts的符号链接来维护/etc/mtab文件中精确挂载的文件体系列表

  • ln -svf ../proc/mounts ${LJOS}/etc/mtab


  • 1.8创建/etc/passwd文件

  • cat > ${LJOS}/etc/passwd v4l/


  • # load drivers for usb devices
  • usbdev[0-9].[0-9] root:root 0660 */lib/mdev/usbdev
  • usbdev[0-9].[0-9]_.* root:root 0660
  • EOF


  • 1.16 为目的机的grub bootloarder创建/boot/grub/grub.cfg

  • cat > ${LJOS}/boot/grub/grub.cfg> config.cache
  • echo "libc_cv_ssp=no" >> config.cache
  • echo "libc_cv_ssp_strong=no" >> config.cache


  • 4.10运行以下下令

  • BUILD_CC="gcc" CC="${LJOS_TARGET}-gcc" \
  • AR="${LJOS_TARGET}-ar" \
  • RANLIB="${LJOS_TARGET}-ranlib" CFLAGS="-O2" \
  • ../glibc-2.27/configure --prefix=/usr \
  • --host=${LJOS_TARGET} --build=${LJOS_HOST} \
  • --disable-profile --enable-add-ons --with-tls \
  • --enable-kernel=2.6.32 --with-__thread \
  • --with-binutils=${LJOS}/cross-tools/bin \
  • --with-headers=${LJOS}/usr/include \
  • --cache-file=config.cache


  • make && make install_root=${LJOS}/ install
GCC (终极)


  • 4.11如前所述,如今您将构建终极的GCC交织编译器,该编译器将链接到上一步中构建和安装的C库。创建目次,并进入

  • mkdir gcc-build
  • cd gcc-build/


  • 4.12运行以下下令

  • AR=ar LDFLAGS="-Wl,-rpath,${LJOS}/cross-tools/lib" \
  • ../gcc-7.3.0/configure --prefix=${LJOS}/cross-tools \
  • --build=${LJOS_HOST} --target=${LJOS_TARGET} \
  • --host=${LJOS_HOST} --with-sysroot=${LJOS} \
  • --disable-nls --enable-shared \
  • --enable-languages=c,c++ --enable-c99 \
  • --enable-long-long \
  • --with-mpfr-include=$(pwd)/../gcc-7.3.0/mpfr/src \
  • --with-mpfr-lib=$(pwd)/mpfr/src/.libs \
  • --disable-multilib --with-arch=${LJOS_CPU}


  • make && make install
  • cp -v ${LJOS}/cross-tools/${LJOS_TARGET}/lib64/libgcc_s.so.1 ${LJOS}/lib64


  • 4.13如今你已经构建了交织编译器,您必要调解和导出以下变量

  • export CC="${LJOS_TARGET}-gcc"
  • export CXX="${LJOS_TARGET}-g++"
  • export CPP="${LJOS_TARGET}-gcc -E"
  • export AR="${LJOS_TARGET}-ar"
  • export AS="${LJOS_TARGET}-as"
  • export LD="${LJOS_TARGET}-ld"
  • export RANLIB="${LJOS_TARGET}-ranlib"
  • export READELF="${LJOS_TARGET}-readelf"
  • export STRIP="${LJOS_TARGET}-strip"
5.编译目的镜像


  • 困难的部门如今完成了——您有了交织编译器。如今,让我们重点构建将安装在目的映像上的组件。这包罗各种库和实用步伐,固然另有Linux内核自己。
BusyBox


  • 5.1BusyBox是我最喜好的开源项目之一。该项目宣传本身是开源工具的瑞士军刀,这大概是对该项目最好的形貌。BusyBox将大量最常用的Linux实用步伐的小版本组合到一个分布式包中。这些工具包罗常见的二进制文件、文本编辑器和下令行shell、文件体系和网络实用步伐、流程管理工具等等。
  • 5.2解压busybox的压缩包,进入其目次,载入默认设置模板

  • make CROSS_COMPILE="${LJOS_TARGET}-" defconfig


  • 5.3默认设置模板将支持编译一组默认界说的实用步伐和库。你可以通过运行menuconfig来启用/禁用任何你以为符合的组件

  • make CROSS_COMPILE="${LJOS_TARGET}-" menuconfig


  • 5.4编译安装软件包

  • make CROSS_COMPILE="${LJOS_TARGET}-"
  • make CROSS_COMPILE="${LJOS_TARGET}-" CONFIG_PREFIX="${LJOS}" install


  • 5.5安装perl脚本,编译内核的时间必要他

  • cp -v examples/depmod.pl ${LJOS}/cross-tools/bin
  • chmod 755 ${LJOS}/cross-tools/bin/depmod.pl
Linux内核


  • 5.6进入内核的目次,载入默认设置模板

  • make ARCH=${LJOS_ARCH} CROSS_COMPILE=${LJOS_TARGET}- x86_64_defconfig


  • 5.7这将为编译过程界说最小模块集和设置集。你很大概必要针对目的呆板的情况举行得当的调解。这包罗为存储和网络控制器等启用模块。你可以用menuconfig选项做到这一点
    比方,我将在一个VirtualBox假造机中运行这个目的映像,它将依靠于一个Intel e1000网络模块(在defconfig中缺省设置)和一个用于操纵体系驱动器的LSI mpt2sas存储控制器。为了简朴起见,将这些模块设置为静态编译到内核映像中—也就是说,将其设置为*而不是m。肯定要查抄你的目的机必要什么并启用它,否则目的情况在引导时将无法正常运行。


  • make ARCH=${LJOS_ARCH} CROSS_COMPILE=${LJOS_TARGET}- menuconfig


  • 5.8编译安装内核

    • 这里大概必要安装一下elfutils-libelf-devel(Centos7):yum install -y elfutils-libelf-devel


  • make ARCH=${LJOS_ARCH} CROSS_COMPILE=${LJOS_TARGET}-
  • make ARCH=${LJOS_ARCH} CROSS_COMPILE=${LJOS_TARGET}- INSTALL_MOD_PATH=${LJOS} modules_install


  • 5.9你必要为grub拷贝一些文件到/boot目次

  • cp -v arch/x86/boot/bzImage ${LJOS}/boot/vmlinuz-4.16.3
  • cp -v System.map ${LJOS}/boot/System.map-4.16.3
  • cp -v .config ${LJOS}/boot/config-4.16.3


  • 5.10然后运行BusyBox包提供的先前安装的Perl脚本

  • ${LJOS}/cross-tools/bin/depmod.pl -F ${LJOS}/boot/System.map-4.16.3 -b ${LJOS}/lib/modules/4.16.3
Bootscripts


  • 5.11Cross Linux From Scratch (CLFS)项目(原始LFS项目标一个分支)提供了一组非常棒的引导脚本,为了简朴起见,我在这里利用这些脚本。
  • 5.12解压缩包并更改到它的目次中。这个目次的makefile之一包罗大概与当前工作shell不兼容的代码。将以下更改应用于目次的根Makefile,以确保在包安装过程中不会碰到任何题目(这个步调不是必须)

  • @@ -19,7 +19,9 @@ dist:
  •        rm -rf "dist/clfs-embedded-bootscripts-$(VERSION)"


  • create-dirs:
  • - install -d -m ${DIRMODE} ${EXTDIR}/rc.d/{init.d,start,stop}
  • + install -d -m ${DIRMODE} ${EXTDIR}/rc.d/init.d
  • + install -d -m ${DIRMODE} ${EXTDIR}/rc.d/start
  • + install -d -m ${DIRMODE} ${EXTDIR}/rc.d/stop


  • install-bootscripts: create-dirs
  •        install -m ${CONFMODE} clfs/rc.d/init.d/functions ${EXTDIR}/rc.d/init.d/


  • 5.13运行以下的下令,来安装设置目的运行情况

  • make DESTDIR=${LJOS}/ install-bootscripts
  • ln -sv ../rc.d/startup ${LJOS}/etc/init.d/rcS
Zlib(安装你所必要的别的第三方软件包)


  • 5.14本教程的末了一个包。Zlib不是必须的,但是对于你大概盼望为你的情况安装其他包来说,它是一个很好的指南。假如你想格式化和设置物理或假造硬盘,可以跳过这一步。

  • sed -i 's/-O3/-Os/g' configure
  • ./configure --prefix=/usr --shared
  • make && make DESTDIR=${LJOS}/ install


  • 5.15由于有些包大概会在/lib目次中而不是/lib64目次中查找Zlib库,以是应用以下更改

  • mv -v ${LJOS}/usr/lib/libz.so.* ${LJOS}/lib
  • ln -svf ../../lib/libz.so.1 ${LJOS}/usr/lib/libz.so
  • ln -svf ../../lib/libz.so.1 ${LJOS}/usr/lib/libz.so.1
  • ln -svf ../lib/libz.so.1 ${LJOS}/lib64/libz.so.1
6安装目的镜像


  • 6.1全部的交织编译都完成了。如今您已经拥有了将整个交织编译的操纵体系安装到物理驱动器或假造驱动器所需的统统,但是在此之前,不要通过复制原始目的构建目次来窜改它,做一份拷贝

  • cp -rf ${LJOS}/ ${LJOS}-copy


  • 6.2在本教程的别的部门中利用此副本。删除一些如今不必要的目次

  • rm -rfv ${LJOS}-copy/cross-tools
  • rm -rfv ${LJOS}-copy/usr/src/*


  • 6.3然后是删除如今不必要的静态编译库文件(假如有的话)

  • FILES="$(ls ${LJOS}-copy/usr/lib64/*.a)"
  • for file in $FILES; do
  • rm -f $file
  • done


  • 6.4如今从安装的二进制文件中删除全部调试符号。这将淘汰总体文件巨细,并将目的映像的总体占用空间保持在最小(利用root权限)

  • sudo chown -R root:root ${LJOS}-copy
  • sudo chgrp 13 ${LJOS}-copy/var/run/utmp ${LJOS}-copy/var/log/lastlog
  • sudo mknod -m 0666 ${LJOS}-copy/dev/null c 1 3
  • sudo mknod -m 0600 ${LJOS}-copy/dev/console c 5 1
  • sudo chmod 4755 ${LJOS}-copy/bin/busybox


  • 6.5进入拷贝的目次,创建整个操纵体系镜像的压缩包

  • cd ${LJOS}-copy/
  • sudo tar cfJ ../ljos-build-manjingliu.tar.xz *


  • 6.6检察整个根文件体系的巨细,该操纵体系可以装在一个少于60MB的磁盘上

  • sudo du -h|tail -n1
  • 58M  


  • 6.7压缩事后的巨细少于20MB

  • ls -lh ljos-build-manjingliu.tar.xz
  • -rw-r--r-- 1 root root 18M Apr 21 15:31 ljos-build-manjingliu.tar.xz


  • 6.8检察目的硬盘的巨细以及分区、格式化

  • # 先利用fdisk举行分区
  • sudo mkfs.ext4 /dev/sdb1
  • sudo mkdir tmp
  • sudo mount /dev/sdb1 tmp/
  • cd tmp/


  • 6.9将操纵体系的压缩包解压到该分区中

  • sudo tar xJf ../ljos-build-manjingliu.tar.xz


  • 6.10运行grub-install大概grub2-install下令安装bootloader

  • # --root-directory参数界说了staging目次的绝对路径,而末了一个参数是没有分区标签的块装备。
  • sudo grub-install --root-directory=/home/manjingliu/ljos/tmp/ /dev/sdb
7启动制作好的体系


  • 7.1将制作好的体系地点的硬盘作为第一启动项启动 
     

  • QhGm4li2Mw7hvO24.jpg

  • 7.2启动乐成
s69gGmR4w0fR9Uha.jpg




上一篇:ProxmoxVE之5.3集群安装及利用ceph
下一篇:Docker入门(一)用helloworld入门docker
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-5-18 15:46 , Processed in 0.231651 second(s), 47 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表