热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用容器编译Linux内核并启动运行

本文目标是构建随处可用的内核开发环境,用于Linux内核调度器的研究。开发环境的开发套件由docker,ubuntu14.04,qemu,vim,zsh等构成。按照该开发环境的套件

本文目标是构建随处可用的内核开发环境,用于Linux内核调度器的研究。开发环境的开发套件由docker,ubuntu14.04,qemu,vim,zsh等构成。

按照该开发环境的套件要求,将在docker中构建ubuntu14.04系统,并构建内核编译和源码查看环境。主要步骤如下:

  1. 基于Docker安装Ubuntu-14.04
  2. 登录Docker中的Ubuntu-14.04
  3. 在ubuntu中安装qemu,vim,zsh
  4. 下载Linux内核源码,并编译
  5. 创建磁盘,启动编译后的内核

1. 基于Docker安装Ubuntu-14.04。指令如下所示:

axel -n 10 https://download.openvz.org/template/precreated/ubuntu-14.04-x86_64.tar.gz

cat ubuntu-14.04-x86_64.tar.gz | docker import - ubuntu:14.04

docker images

2. 登录Docker中的ubuntu-14.04

docker run -p 301:22 -d --name test ubuntu /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf

ssh [email protected] -p 301

3. 在ubuntu中安装qemu,vim,zsh

sudo apt-get install qemu vim zsh axel wget curl

4. 下载Linux内核源码,并编译

axel -n 10 https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.18.tar.gz

tar -zxfv linux-4.18.tar.gz

cd linux-4.18

关于Linux内核编译,可以参考博客。具体过程如下:

make help  # 查看make参数

make x86_64_defconfig

结果发现,缺乏编译器,此外,在编译过程中,还发现缺乏依赖库。因此,一次安装如下依赖库

sudo apt-get install bison flex qemu bc build-essential gcc g++ libelf-dev libssl-dev

make x86_64_defconfig

make bzImage  # 编译内核

make modules # 编译模块

编译完成之后,将生成内核压缩文件arch/x86/boot/bzImage

5. 创建磁盘,启动编译后的内核

起初,打算直接在docker中用qemu启动bzImage,然而,出现了图形化界面使用错误的情况。

root# qemu-system-x86_64 -m 512M -smp 4 -kernel ./bzImage
Could not initialize SDL(No available video device) - exiting

鉴于这样的情况,有两种方案:

(1)在qemu启动时使用-curses参数,可直接启动(亲测有效)

(2)将容器中编译好的压缩内核bzImage复制(docker cp)到本地host系统中,基于qemu启动。

基于第二种方案构建的开发环境,缺少了docker一贯的隔离性,即要求host系统中安装qemu环境,且主机系统和虚拟机系统的内容来回传递。因此,直接使用第一种方案,但是需要另外连接的终端终止当前qemu程序才能重新回到容器的shell中。

在启动编译后的压缩内核时,出现无法找到文件系统的错误:

使用容器编译Linux内核并启动运行

为此,需要创建磁盘镜像,制作根文件系统,且准备init程序才能启动编译后的内核。

但是在创建磁盘并挂在的过程中,出现无法找到loop设备的错误。

qemu-img create -f raw disk.raw 512M

mkfs -t ext4 ./disk.raw   # 若没有mkfs.ext4,则安装e2fsprogs套件,sudo apt-get install e2fsprogs

sudo mount -o loop ./disk.raw ./img

mount: Could not find any loop device. Maybe this kernel does not know
       about the loop device? (If so, recompile or `modprobe loop'.)

最快捷方便的解决方案就是在docker run时,加入特权:

docker run --privileged=true ...

目前,可以挂在文件系统,但是缺乏启动程序init,因此基于busybox构建启动程序。但是在编译过程中,出现缺少curses.h头文件的情况,这是因为缺少套件ncurses devel。

make defconfig

make menuconfig

In file included from scripts/kconfig/lxdialog/checklist.c:24:0:
scripts/kconfig/lxdialog/dialog.h:31:20: fatal error: curses.h: No such file or directory
 #include CURSES_LOC
                    ^
compilation terminated.
make[2]: *** [scripts/kconfig/lxdialog/checklist.o] Error 1
make[1]: *** [menuconfig] Error 2
make: *** [menuconfig] Error 2

sudo apt-get install libncurses5-dev # 缺少ncurses devel套件

然后,再次编译时,将busybox编译为静态的二进制文件。然后make编译,并安装到挂在的img目录中。

Busybox Settings --->

              --- Build Options

               [*] Build BusyBox as a static binary (no shared libs)

# make 

# make CONFIG_PREFIX= install

# ls   #可以看到包含了更多目录

使用容器编译Linux内核并启动运行

此外,还需要创建额外的文件,包括rcS,inittab,proc,sys,dev等,具体可以参考博客。

以下是直接可用的脚本,需要修改相应的路径。

#!/bin/sh

# note: Linux kernel and busybox are in the same directory
path_to_Linux_kernel=linux-4.18
path_to_busybox=busybox-1.30.0
path_to_root=`pwd`

cd $path_to_Linux_kernel
#make clean
#make distclean
#make x86_64_defconfig
#make bzImage
#make modules

# obtain the bzImage
cp arch/x86/boot/bzImage $path_to_root

# create disk by type ext4
cd $path_to_root
if [ -d img ]; then
    umount img
    rm -rf img
fi

if [ -e disk.raw ]; then
    rm disk.raw
fi

qemu-img create -f raw disk.raw 512M
mkfs -t ext4 disk.raw

mkdir img
sudo mount -o loop disk.raw img  # note that, docker run --privileged=true

# install modules and init program
cd $path_to_Linux_kernel
sudo make modules_install INSTALL_MOD_PATH=../img

cd $path_to_root/$path_to_busybox
if [ -e busybox ]; then
    make CONFIG_PREFIX=../img install
else
    echo "Busybox is not built yet. Please build the busybox first!"
    exit 2
fi

# update the init program
cd $path_to_root/img

mkdir -p etc/init.d
mkdir proc
mkdir sys
mkdir dev

touch etc/init.d/rcS
echo "#/bin/sh" > etc/init.d/rcS
echo "mount -t proc proc /proc" >> etc/init.d/rcS
echo "mount -t sysfs sysfs /sys" >> etc/init.d/rcS
chmod +777 etc/init.d/rcS

# start the bzImage
cd $path_to_root
qemu-system-x86_64 -curses -m 512M -smp 4 -kernel bzImage -drive format=raw,file=disk.raw -append "init=/linuxrc root=/dev/sda"

最后,在docker容器中的ubuntu就可以启动qemu了。

qemu-system-x86_64 -curses -m 512M -smp 2 -kernel bzImage -drive format=raw,file=disk.raw -append "init=/linuxrc root=/dev/sda"

终结

在所有的环境搭建好之后,要保存(commit)当前容器的状态,并推送到远程网络(push),这样就可以在任何一台装有docker的系统中,使用该环境,进行Linux内核开发和学习。

docker commit -m "update with busybox" [:]

 


推荐阅读
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 从 Windows 转向 Mac 的开发者指南:必备技巧与工具
    本文旨在帮助从 Windows 转向 Mac 的开发者们,提供一系列实用的技巧和工具,确保过渡过程顺畅。 ... [详细]
  • 本文探讨了在Linux系统上使用Docker时,通过volume将主机上的HTML5文件挂载到容器内部指定目录时遇到的403错误,并提供了解决方案和详细的操作步骤。 ... [详细]
  • 本文详细介绍了在Mac平台上安装和配置MySQL的步骤,包括下载安装包、卸载MySQL以及解决命令行中找不到mysql命令的问题。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 本文将详细介绍Linux系统中的两种主要软件包类型——二进制包和源码包,探讨它们的特点、优势及局限性,帮助读者更好地理解和使用Linux软件包管理系统。 ... [详细]
  • 在 Go 开发环境中,通过使用 iTerm 和 Oh My Zsh,可以显著提升终端操作的效率和体验。Oh My Zsh 是一个强大的 Zsh 配置管理框架,提供了丰富的插件支持,如代码高亮、自动补全和多种编程语言支持,同时还拥有众多美观的主题,使终端界面更加个性化和高效。Zsh 作为一种高度可定制的 shell,不仅适用于交互式应用,还可用作脚本解释器,集成了 bash、ksh 和 tcsh 等其他 shell 的诸多优点,并具备独特的功能特性。 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
author-avatar
昱辰190974945122
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有