编译内核制作一个小型的linux系统

  1. 前言

今天我将会给大家带来如何定制一个属于自己linux系统,也就是编译内核,那为什么要编译内核呢?

内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统管理,决定着系统的性能和稳定性。Linux作为一个自由软件,在广
大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一
个更高效,更稳定的内核,就需要重新编译内核

对开源操作系统(主要是指Linux)的内核源代码在本机进行有针对性的编译,就叫做内核编译。

编译内核的目的主要是改变内核的默认选项,比如内核原来不支持某硬件,原因是内核的相应选项默认状态是disactivated,需要改变。

编译内核将会有更多的选择,有些功能需要启用,而有些功能不需要启动,启用我们需要的某些功能,关闭那些无用的功能,按照自己的要求来定制和优化内核,减少空间,定制一个代码少的内核,还能系统运行的速度和性能

其次还有就是有些爱捣鼓的朋友们学习和研究,可以多加尝试。那接下来我们就跟大家展示如何去编译内核。

首先要准备编译环境,centos6安装完成的一个操作系统(并且机器上已经安装过编译环境),内核 文件,虚拟机软件,我这里的用的事vmware

1、首先我们在centos6上添加一块硬盘,便于待会给小型的linux分区,添加硬盘在系统关机的情况下添加

添加一个scsi类型的磁盘,大小为5G即可,在添加磁盘时,最后要选择磁盘存放的位置,我这里指定的事桌面,以便待会好找,你们也可以放到一个自己好找的地方即可。硬盘文件时以vmdk结尾的文件

添加好硬盘之后我们这里开启centos6这个虚拟机了,开机之后fdisk -l一下查看硬盘有没有加载进去,由于我们添加的是第二块磁盘所以磁盘的编号是/dev/sdb,找到磁盘后我们开始分区,并格式化,创建两个目录,便于我们存放系统文件,我这里是在/mnt目录下创建boot 和sysroot

fdisk  -l 查看硬盘有没有加载,加载之后执行下面的命令

分区

fdisk /dev/sdb

n-->p-->1---回车--->+100M---->w

n-->p-->1---回车--->+512M---->w

这样两个分区就分好了,分区完成执行格式化命令

mke2fs -t ext4 /dev/sdb1

mke2fs -t ext4 /dev/sdb2

格式化完成,创建挂载点挂载分区

mkdir /mnt/{boot,sysroot}

mount /dev/sdb1 /mnt/boot

mount /dev/sdb2 /mnt/sysroot

创建grub

grub-install --root-directory=/mnt /dev/sdb ,grub安装完成后,查看/mnt/boot/下面有没有一个叫做grub的目录, 如果存在说明已经安装成功,如果不存在,请重新安装grub

我们挂载的/mnt/boot目录就是我们制作新系统里面的启动分区,sysroot目录就是根分区,正常系统根分区下面有很多目录,那我们也要在sysroot下面创建目录

cd /mnt/sysroot
mkdir  -pv etc/{rc.d,init.d}  bin  sbin  root  home   dev proc sys lib lib64 var/log  src usr/{local,share}  boot

2、下载内核文件

我们到内核的官当站点去下载http://www.kernel.org,这里我给大家演示的是2.6.13版本的内核编译,朋友们尽量下载跟你当前系统内核版本要搞的内核文件。

3、释放源代码

从官当下载下来的内核是一个压缩文件,内核的源代码就放在这个压缩文件里面,如果你下载到你的windows机器里面我们可以用xmanger的xftp将内核文件上传到虚拟机里面,我这里呢是穿到/root目录下面

解压源代码放到/usr/src/目录下,解压完成我们创建一个链接文件,将linux-version(内核版本)链接到linux

tar  -xf   tar xf linux-3.13.6.tar.xz  -C /usr/src (解压过程稍微有点慢,耐心等待一下)

解压完成后,链接文件到linux

ln -sv  linux-3.13.6/ linux

编译内核之前请确保你的centos6安装了编译安装环境,如果没有请创建yum仓库,然后安装编译安装环境,主要安装"Development Tools"和“Server Platform Development”,我这里已经安装过了

编译环境安装完成后,我们进到源码目录去,/usr/src/linux,然后执行make allnoconfig生成一个.confgi的文件

而后执行make menuconfig (这里要提醒一下,如果有朋友是用xshell链接到虚拟机的,需要将xshell全屏,不然会报错,会因为你的宽度不够,而打不来GUI界面)

选择某项使用空格,当显示是*时表示编译进内核,M表示做成模块,下面我会列出需要勾选的选项(全部做进内核),返回上级菜单使用ESC键

如果目标系统要做成是64位的话那我们就需要勾选这个选项了

64-bit kernel

加上本地内核版本号

Genral setup---> Local version - append to kernel release进去之后编辑就好比如el6-1.1.1

启用内核模块装载

Enable loadable module support

处理器类型及特征,这项根据你的机器的cpu类型来选择,我的是酷睿双核的所以

Processor type and features-->在这个菜单下面选择Symmetric multi-processing support 
(多处理器支持)还有Processor family (Generic-x86-64)--->Core 2/newer Xeon

启用PCI总线

Bus options (PCI etc.)-->PCI support(勾选)

设备驱动

Device Drivers-->Fusion MPT device support (NEW)  --> Fusion MPT logging facility  
Device Drivers--->SCSI device support-->SCSI device support  和SCSI disk support (勾选上))
Device Drivers-->Fusion MPT device support (NEW) -->Fusion MPT ScsiHost drivers for SPI和Fusion MPT misc device (ioctl) driver(勾选上)

文件系统

filesystem -->The Extended 4 (ext4) filesystem

可执行文件格式

Executable file formats / Emulations-->  Kernel support for ELF binaries  、 Kernel support for scripts starting with #! 、Write ELF core dumps with partial segments (NEW)

装上键盘驱动

Device Drivers-->  Input device support-->Keyboards ---> AT keyboard (默认是美式键盘)

鼠标驱动

Device Drivers-->  Input device support--->mice----> PS/2 mouse (NEW(如果是ps/2的键盘选择这项,如果是usb类型的鼠标则需要开启usb的驱动)

Device Drivers--> USB support --->Support for Host-side USB/xHCI HCD (USB 3.0) support和 EHCI HCD (USB 2.0) support还有 OHCI HCD (USB 1.1) support(勾选那个就可以了)

编译设备文件
 Device Drivers  --->Generic Driver Options --> Maintain a devtmpfs filesystem to mount at /dev /Automount devtmpfs at /dev, after the kernel mounted the rootfs

配置网络功能

Networking support ---> Networking options --->选项太多,用图来表示

UNIX: socket monitoring interface (套接字接口)/Unix domain sockets

Device Drivers-->Network device support --> Ethernet driver support (NEW)

我的网卡是intel所以选择如图

Network core driver support (NEW)

完成上述的定制之后,就来开始编译安装了执行make bzImage

编译完成的文件在/usr/src/linux/arch/x86/boot/bzImage复制到/mnt/boot/目录下

cp  /usr/src/linux/arch/x86/boot/bzImage /mnt/boot/

4、编辑一些配置文件

cd /mnt/boot/grub

编译grub配置文件

cd /mnt/boot/grub

vim grub.conf

default=0
timeout=3
title this  is my first linux (3.13.2)
         root(hd0,0)
         kernel /baImage ro root=/mnt/dev/sda2 init=/bin/bash

编辑启动程序

cd /mnt/sysroot/sbin/

vim init

#!/bin/bash
echo -e "\tWelcome to \033[34mmy first linux\033[0m"
mount -n -t proc /proc
mount -n -t sysfs sysfs /sys
mount -n -t devtmpfs none /dev
mount -n -o remount,rw /dev/sda2
/bin/bash

5、利用脚本一直一些命令到定制的主机上去,脚本内容如下,主要功能将已安装好的系统的命令及库文件移植到目标系统上,#!/bin/bash
#
target=/mnt/sysroot

clearCmd() {
  if which $cmd &> /dev/null; then
        cmdPath=`which --skip-alias $cmd`
  else
        echo "No such command"
        return 5
  fi
}

cmdCopy() {
        cmdDir=`dirname $1`
        [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}

libCopy() {
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
        done
}

while true; do
  read -p "Enter a command: " cmd
  if [ "$cmd" == ‘quit‘ ] ;then
        echo "quit"
        exit 0
  fi
  clearCmd $cmd
  [ $? -eq 5 ] && continue

cmdCopy $cmdPath
  libCopy $cmdPath
done

编写完成后,给脚本一个执行权限,然后会提示你输你想移植的命令,比如bash,cat ,fdisk ,mount ls ,touch ,ifconfig ,route, netstat ,tree ,mkdir ,rmdir,halt, shutdown,reboot等

最好将/mnt/sysroot/bin/bash 链接到文件名为sh

6、在vmware上新建一个虚拟机,将制作好系统的磁盘装载洗虚拟机里面,然后开机启动。前面的创建 我就省略了,到创建磁盘的我截图放在下面,选择系统版本是选择2.x64位内核,我们这边编译的事2.6.x的内核

将创建好的磁盘放入之后,就开始开机了。如果途中遇到什么错误,请留言

至此一个小型的linux就编译安装完成了。

时间: 2024-10-13 01:05:49

编译内核制作一个小型的linux系统的相关文章

如何自制一个小型的linux系统

centos6.7为例 第一步.在R2虚拟机里添加一块20G的硬盘,使用fdisk命令进行分区, /和/boot目录 mkfs.ext4  /dev/sdb1(/boot目录) mkfs.ext4  /dev/sdb2(/目录) mkdir /mnt/boot(新建挂载目录) mount /dev/sdb1 /mnt/boot (把sdb1挂载到/mnt/boot目录下) grub-install --root-directory=/mnt /dev/sdb  (整个磁盘下自动寻找boot目录)

linux内核分析 第三周 构造一个简单的Linux系统MenuOS

一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持多种CPU类型的源代码,重点是x86·init目录:含有main.c,内核启动相关的代码基本都在init目录下·ipc目录:进程间的通信·kernel目录:有Linux内核的核心代码.四.构造一个简单的Linux系统 使用实验楼的虚拟机打开shell 1.cd LinuxKernel/2.qemu

20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 进程上下文的切换 第一讲  Linux内核源代码介绍 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. init目录包含核心的初始化代码(不是系统的引导代

Linux内核设计第三周——构造一个简单的Linux系统

Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核源代码分析 arch/目录保存支持多种CPU类型的源代码 其中的关键目录包括:Documentation.drivers.firewall.fs(文件系统).include init目录:含有main.c,内核启动相关的代码基本都在init目录下 start_kernal()函数为启动函数,初始化内

《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在linux内核源码里面arch占有的代码量相当庞大.arch/x86目录下的代码是我们重点关注的. 2.内核启动相关的代码基本都在init目录下(main.c). start_kernel是初始化linux内核的起点. start_kernel相当于c程序中的main函数 3.linux内核的核心代码在k

《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE(2.29——3.6)构造一个简单的Linux系统MenuOS SECTION 1 Linux内核源代码简介 1.操作系统的两把宝剑(回顾上一讲) 中断上下文的切换——保存现场&恢复现场 进程上下文的切换 2.Linux内核源代码简介 打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的

Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥

一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核心代码都在kernel目录中 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相关代码 kenerl/ 进程调度相关代码 ipc/ 进程间通信 lib/ 公共库文件 mm/ 内存管理相关的代码 (二)构造一个简单的Linux系统 启动MenuOS系统

LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 回顾: [计算机三个法宝] 1)存储程序计算机 2)函数调用堆栈 3)中断 [操作系统两把宝剑] 1)中断上下文的切换:保存现场和恢复现场 2)进程上下文的切换 一.使用gdb跟踪调试内核从start_kernel到init进程启动 使用实验楼的虚拟机打开

20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS

李辰希 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周构造一个简单的Linux系统MenuOS 一.Linux内核源代码简介 三个法宝和两把宝剑: 三个法宝:存储程序计算机.函数调用堆栈.终断 操作系统的两把宝剑:中断上下文的切换(保存现场和恢复现场).进程上下文的切换 2.linux内核源代码简介 arch/x86目录下的代码是重点关注的 init目录:内核启动相关的代码基本都在init目录下