精华内容
下载资源
问答
  • linux 2.6的内核配置选项简单介绍,对于嵌入式以及其他用户户有用,根据需要配置最小系统。
  • Linux嵌入式系统环境搭建、内核配置最小系统启动与设备文件分析.pdf
  • 制作最小linux内核(3)

    千次阅读 2017-02-22 23:31:00
    本文是制作最小linux内核系列的最后一篇,这篇相对简单:把内核配置界面下"Device Driver"选项中一些编译进内核的驱动编译成模块,并把这些模块安装到initrd.img。当引导系统时,内核从initrd.img中加载模块,最终使...

        本文是制作最小linux内核系列的最后一篇,这篇相对简单:把内核配置界面下"Device Driver"选项中一些编译进内核的驱动编译成模块,并把这些模块安装到initrd.img。当引导系统时,内核从initrd.img中加载模块,最终使系统正常工作起来。

    首先配置内核选项,执行make menuconfig进入Device Driver选项:

    将"Serial ATA and Parallel ATA drivers"编译为模块,并将其中的子项"AHCI SATA support"编译为模块



    进入Device Driver选项-"Block devices",将RAM block device support编译为模块:


    进入Device Driver选项-"SCSI device support",将SCSI disk support编译为模块:


    进入Device Driver选项-"SCSI device support"-"SCSI low-level driver"中LSI MPT相关的选项编译成模块:


    至此配置结束。准备编译内核,执行make all -j4。请注意,生成新的bzImage后不要急吼吼执行命令cp bzImage然后就重新引导系统。Why?新生成的kernel中没有磁盘驱动,引导过程中会报panic。那磁盘驱动去哪了?恩,还在内核目录下,只不过需要把他们安装到制作initrd.img文件的目录中。命令如下:

    make modules_install INSTALL_MOD_PATH=/home/eugen/Desktop/initramfs
    参数modules_install用于告诉make工具准备安装内核模块;而INSTALL_MOD_PATH后面跟着的路径是我用于制作initrd.img文件的目录。安装后,可以看到initramfs/lib目录下多了两个目录分别为firmware/目录,用于存放设备固件和modules/目录,用于存放驱动模块:



    图中modules/目录下的3.13.11-ckt39目录是我使用的linux内核源码的版本号;3.13.11-ckt39/下存放了加载模块时的用于匹配设备PID VID的modules.alias文件,模块依赖关系modules.dep文件等,而kernel/目录存放了引导内核时用到的模块:


    最后重新引导系统看看定制的结果:

    lsmod查看系统已加载的模块,很不幸,busybox中没有这个命令。换个方式用cat /proc/modules来列举内核模块


    从中我们看到了libahci/libata/mptscsih等以前被编译进内核的模块。另外,我们进入/lib/modules路径后也能看到这些设备驱动是以.ko可加载模块的形式存放在根文件系统中。



    参考文档:王柏生 <深度探索Linux操作系统系统构建和原理解析>

    展开全文
  • 制作最小linux内核(2)

    千次阅读 2017-02-22 21:35:11
    制作最小linux内核(1) 一文中定制了一个小型内核,当重启系统加载小型内核后,往屏幕上输出"Hello world"。说实话,这样的OS并没有什么作用,至少得有个能和用户交互的界面吧?本文将继续定制内核,以实现这个目的...

        制作最小linux内核(1) 一文中定制了一个小型内核,当重启系统加载小型内核后,往屏幕上输出"Hello world"。说实话,这样的OS并没有什么作用,至少得有个能和用户交互的界面吧?本文将继续定制内核,以实现这个目的。要实现这个目的需要2部分支持:1.继续配置内核选项以完善内核功能;2.为initrd.img增加新功能。

        1.先来完成第一部分,在这步中需要加入以下内核选项:

    1.1.配置内核支持netlink。后面initrd.img中要通过udevd来动态加载模块,udevd需要这项支持:
    执行make menuconfig-"Networking support"-"Networking options"-将"Unix domain sockets"编译进内核

        

    1.2.配置内核支持inotify。udev使用inotify检测udev规则文件是否发生变化:

    执行make menuconfig-"File systems"-将"inotify support for userspace"编译进内核


    1.3.配置内核支持shell脚本。initrd.img中将执行shell脚本:

    执行make menuconfig-"Executable file formats/Emulations"-将"Kernel support for scripts starting with #!"编译进内核


    1.4.配置内核支持ramfs。udev挂载系统时需要用到ramfs:

    执行make menuconfig-"ubuntu supplied Third-party" device drivers-将"Aufs"编译进内核;勾选"Aufs"内核项后,会出现Ramfs,同时将Ramfs(initramfs/rootfs)编译进内核


    至此,内核新特性部分添加完毕,重新编译内核,并将bzImage拷贝到/boot下

    $make all -j4
    $sudo cp arch/x86/boot/bzImage /boot
        2.再来准备第二部分,定制initrd.img。initrd.img中包含了大量的工具,从头开始编译这些工具不是很方便,为此我找了个替代的方法:将/boot目录下ubuntu发行版的initrd.img拷贝出来,剔除一些不需要的工具和脚本,然后重新打包做成initrd.img并拷贝回/boot目录。看过前一篇文章的读者一定了解这个背景知识----initrd.img其实是经过gz压缩的cpio包。因此只要将initrd.img文件重命名为initrd.cpio.gz就能还原出其中的文件。下图是解压发行版ubuntu自带的initrd.img文件后得到的目录结构和init文件的内容:

    图片中init脚本实现的功能很复杂:它实现了CDROM/网络/磁盘等多种启动方式,此外还加载了大量的驱动。这些对于我来说是不必要的,所以我对init文件做了瘦身,仅仅启动udev守护程序以及udev运行时需要挂载的sysfs/proc/ramfs等文件系统

    #!/bin/sh
    
    [ -d /dev ] || mkdir -m 0755 /dev #如果/dev目录不存在则创建 下同
    [ -d /sys ] || mkdir /sys
    [ -d /proc ] || mkdir /proc
    [ -d /tmp ] || mkdir /tmp
    [ -d /run ] || mkdir /run
    export PATH=/bin 
    mount -t devtmpfs -o mode=0755 udev /dev #挂载各类udev依赖的文件系统
    mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
    mount -t proc -o nodev,noexec,nosuid proc /proc
    [ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1 #如果不存在/dev/console设备节点则创建 下同
    [ -e /dev/null ] || mknod /dev/null c 1 3
    mount -n -t ramfs ramfs /run
    echo > /sys/kernel/uevent_helper #uevent_helper是内核与用户层用于交互uevent事件的文件
    /lib/systemd/systemd-udevd --daemon --resolve-names=never #启动udev守护程序
    udevadm trigger --action=add #udevadm trigger 请求内核对全部设备模拟一遍热拔插
    udevadm settle #上面的命令是个异步调用过程,settle使得脚本暂停运行,直到内核完成热拔插过程
    exec /bin/sh #启动交互式sh

    完成以上操作后在init同层目录下运行打包命令用以制作initrd.img

    $find .|cpio -o -H newc|gzip -3 > ../initrd.img  
    $sudo cp ../initrd.img /boot 

    最后,定制结束后我们看下引导新内核的运行截图:

    系统引导到busybox生成的shell中,而不是先前单调的输出Hello world:


    运行命令,可以看到根文件系统的结构


    由于udev动态产生了设备节点,因此不需要再init脚本中预设大量可能的设备节点:



    展开全文
  • linux驱动的学习步骤:基础知识----》搭建环境----》编译烧写----》定制内核解压内核iTop4412_Kernel_3.0 , 驱动都在drivers目录下配置工具Menuconfig的用法如果修改了配置文件,那么.config 文件就会被修改,再次...

    linux驱动的学习步骤:基础知识----》搭建环境----》编译烧写----》定制内核

    解压内核iTop4412_Kernel_3.0   , 驱动都在drivers目录下

    10187

    10187

    10187

    配置工具Menuconfig的用法

    10187

    如果修改了配置文件,那么.config 文件就会被修改,再次编译时就会根据新的config文件来编译整个内核

    10187

    内核可以配置的内容如图所示:

    10187

    制作最小文件系统镜像

    制作文件系统时 需要工具‘Busybox’, 在busybox-1.21.1.tar.bz2的压缩包中

    1:解压busybox-1.21.1.tar.bz2,然后进入busybox-1.21.1, 输入make menuconfig出现Busybox操作界面(与linux内核变异配置一样)

    2:设置busybox的编译器为 ‘arm-none-linux-gnueabi-’

    3:配置busybox生成二进制文件的安装目录“../system”(放置在当前目录的上一级目录)

    4:busybox配置完成 进行编译 make

    5:将编译生成的二进制文件安装到上述指定的目录   make install

    6:在system中新建文件夹  mkdir dev etc lib mnt proc sys tmp var

    10187

    展开全文
  • 编译Linux内核并运行一个最小镜像

    千次阅读 2017-12-26 18:13:07
    需求公司的专用服务器使用自定义Linux内核,运行一个由busybox构成的最小镜像. 由于某些原因, 使用的内核来自其他人已经编译好的,并且也拿不到配置文件。 现在需要: 1. 添加某个专用驱动到内核中,并且添加一些...

    需求

    公司的专用服务器使用自定义Linux内核,运行一个由busybox构成的最小镜像. 由于某些原因, 使用的内核来自其他人已经编译好的,并且也拿不到配置文件。 现在需要:
    1. 添加某个专用驱动到内核中,并且添加一些脚本到新的系统运行镜像包initrd中
    2. 兼容以前的系统镜像,不能出现使用旧的内核搭配新镜像时无法启动的问题

    本文把用到的知识点记录下来,便于有相同需求的同学参考。
    系统内核称为bzImage或kernel , 系统镜像称为 initrd

    包含知识点

    1. Linux启动过程之initrd
    2. BootLoader 之 extLinux
    3. 编译Linux内核的方法
    4. 内核编译时如何选择系统自带的驱动
    5. 如何将私有驱动编译到内核中
    6. 启动内核时,出现 kernel Panic - not syncing 的解决办法
    7. 开机后键盘无法使用的问题解决
    8. 使用busybox制作initrd

    本文中只叙述某些关键点,具体细节可以参考每一节中给出的链接

    1. Linux启动过程之initrd

    1. 机器启动时,首先是 BIOS 运行 ,在磁盘的MBR中,找到BootLoader。
    2. BootLoader运行, BootLoader配置文件会指出系统启动的某些参数, 比如在哪里找到 kernel , 在哪里找到 initrd。
    3. 然后开始加载 kernel , 之后加载initrd 进入到 early user space状态。 initrd 有两种技术,旧的一种使用镜像文件,叫做 init ram disk , 新的一种使用ramfs归档文件,叫做 init ram filesystem ,可能是由于历史原因,ubuntu的系统镜像虽然是新的技术,但文件名仍然看起来像是旧的 intrd*.
    4. initrd启动后,如果是旧的技术ram disk,运行的第一个程序是镜像中的 /linuxrc 脚本 , 如果是新的ram filesytem 运行的第一个程序是 /init脚本 , 一般会在脚本的最后使用 switch_root命令切换根目录到实际的磁盘根目录中。
      由于我司服务器的特殊性, 只是把磁盘挂载为 /data 目录用来存储数据, 系统仍运行在 initrd 环境下,所以没有最后这一步。

    关于两种技术的区别, 请参考内核源码目录下 Documentation/initrd.txt 和 IBM: Linux2.6 内核的 Initrd 机制解析

    要制作支持initrd的内核 参考这个链接 CSDN:移植linux 内核支持ramdisk

    2. BootLoader 之 extLinux

    extLinux是一种启动引导,优点是支持多种启动介质,配置简单。

    一般用法是

    mkdir -p /boot/extlinux
    extlinux --install /boot/extlinux
    cat mbr.bin > /dev/XXX  ##mbr.bin 在extlinux的安装目录下,如果是系统自带的的则可能在  /usr/lib/EXTLINUX/  下, 如果没有,请自行搜索文件位置

    配置文件在安装目录的 extlinux/extlinux.conf

    配置文件中的参数会传给内核 ,通过指定特定的的参数, 可以用来调试内核问题。 系统启动后可以在 /proc/cmdline 中查看

    /root # cat /proc/cmdline 
    vga=0x305 loglevel=3 initrd=/rootfs BOOT_IMAGE=/bzImage 

    extlinux 官网用法介绍

    extlinux.confg 配置文件详解

    3. 编译Linux内核的方法

    Configuring a Linux Kernel

    上面的链接说明了如何编译一个内核

    一般系统的步骤为:

    make menuconfig   #该步骤可能会提示缺少 ncurses , apt install libncurses5-dev 即可
    #配置好选项, 关于如何配置,参考下一节
    make -j4         #开始编译,指定4个线程编译,根据配置的不同,这里可能花费几个小时
    make modules_install   #安装模块
    make install           #安装kernel,initrd 并自动更新引导  内核名称为vmlinuz*  
    

    由于公司的服务器使用busybox最小镜像,只需要编译内核,不需要生成initrd(后面第8节说明如何使用busybox生成initrd), 编译步骤为:

    make menuconfig 
    make -j4 
    make bzImage 

    将 bzImage 拷贝到服务器,然后在 extlinux.conf 中指定为 kernel选项的值即可。 或者 extlinux.conf 中kernel的值为一个符号链接, 这样只需要修改符号链接即可

    4. 内核编译时如何选择系统自带的驱动

    公司服务器硬件比较特殊, 如果直接使用默认的配置生成bzImage,开机后提示没有硬盘,同时键盘也无法使用,无法进入系统调试。

    通用的内核选项可以参考这个链接
    简书:Linux内核编译与管理

    如果编译的内核启动后提示找不到硬盘或者其他驱动问题,可参考这个链接:
    CSDN:制作最小linux内核

    如果要去除所有不必要的驱动和功能, 只保留必要的功能,也可参考上面的链接
    CSDN:制作最小linux内核 , 该文章主要用到命令 lspci -v , lsmod , modinfo

    键盘驱动问题在第7节中专门解决。

    5.如何将私有驱动编译到内核中

    在 linux 内核中增加程序需要完成以下三项工作:
    1. 将编写的源代码复制到 Linux 内核源代码的相应目录
    2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项
    3. 在目录的 Makefile 文件中增加对新源代码的编译条目

    参考这个链接
    CSDN:Linux内核开发之将驱动程序添加到内核

    6. 启动内核时,出现 kernel Panic的解决办法

    旧式 init ram disk initrd的块大小必须和内核编译时的值匹配才能启动
    如果你仔细阅读了第1节,应该不会出现这个 kernel panic。

    然而, 由于公司的服务器内核配置的块大小未知,并且新编译的内核要和以前的兼容,所以必须知道原来的块大小是多少. 大致流程为:
    1. 生成一个512k块大小的系统 , 并把原来的镜像文件拷贝到该镜像中
    2. 使用该镜像作为initrd启动
    3. 检查内核的出错信息并根据该信息修改块大小

    bash# dd if=/dev/zero of=../initrd.img bs=512k count=100
    bash# mkfs.ext2 -F -m0 ../initrd.img
    bash# mount -t ext2 -o loop ../initrd.img /mnt
    bash# cp -r * /mnt        #拷贝需要的文件到镜像
    bash# umount /mnt
    bash# gzip -9 ../initrd.img

    修改initrd为上面生成的压缩文件, 重新启动系统,出现 kernel panic

    Kernel panic - not syncing :VFS: Unable to mount root fs on unknown-block(2,0)
    Kernel Offset:0x0 from 0xffffffff81000000 (relocation randge :0xffffffff80000000-0x0xffffffff9fffffff)

    0xffffffff81000000 和 0xffffffff80000000 相差16M, ‭1677721字节.
    在extlinux.conf 文件中添加配置

    APPEND ramdisk_size=‭16777216‬

    重新启动成功。 因此块大小应该为 16M .

    删掉 APPEND ramdisk_size=‭16777216 根据第1节的方法, 修改内核配置参数

    #make menuconfig
    打开配置菜单,修改两个配置项,分别是:
    - General setup–>选择 Initial RAM filesystem and RAM disk…… 项
    - Device Drivers–>Block devices–>选择 RAM block device support 项
    - device driver->block device里的一个选项,Default Ramdisk 设置ramdisk的大小‭16777216‬

    保存退出, 重新编译即可

    7.开机后键盘无法使用的问题解决

    可能是主板的原因, 编译的内核启动后无法识别键盘, 再bootLoader能使用的键盘,在开机后反而无法使用.
    键盘驱动问题,请参考这个链接
    linux-usb
    该链接说明了 鼠标/键盘/手柄的驱动配置方法

    8. 使用busybox制作initrd

    步骤
    1. 下载 busybox 并解压
    2. 进入目录 make menuconfig ,并配置 Busybox Settings —> Build Options —> Build BusyBox as a static binary (no shared libs) —> yes
    3. make
    4. make install
    5. 需要的系统文件在 busyboxdir/_install/ 下 ,拷贝所有文件到镜像的挂载目录 , 如果使用 init ram disk , 修改 /linuxrc 脚本 为如下内容

    #! /bin/sh
    
    mount -n -t proc proc /proc
    #
    # disable console login
    grep -q console=null /proc/cmdline && sed -i s/^tty/#tty/ /etc/inittab
    #
    # this is a traditional mechanism for initrd
    # notify kernel remount /dev/ram0 as root
    echo 0x0100 > /proc/sys/kernel/real-root-dev
    umount -n /proc

    卸载镜像, 压缩镜像, 请参考第一节

    如果使用 ram filesystem , 删除 /linuxrc 添加 /init

    #!/bin/sh
    #init
    mount -t proc none /proc
    mount -t sysfs none /sys
    
    exec /bin/sh

    打包所有文件为 cpio文件并压缩

    find . | cpio --quiet -H newc -o | gzip -9 -n > /boot/initrd.img

    参考链接
    https://gitlab.eurecom.fr/snippets/23

    展开全文
  • 很全面的Linux嵌入式系统环境搭建说明文档,其中详细介绍了内核配置最小系统启动以及设备文件分析
  • Linux内核学习(3)最小系统制作 参考书籍:《深度探索Linux操作系统 系统构建和原理解析》 参考博文:https://blog.csdn.net/lixiangminghate/article/details/55224412 (一)配置内核方式介绍 1.按照芯片...
  • Linux内核编译概述

    2021-04-04 15:33:51
    Linux内核编译概述 Linux 2.6内核编译概述 Linux 2.6内核使用kbuild机制——使用make menuconfig将配置信息保存在.config文件中,当该文件被改变后再重新编译内核,以保证最小化的编译。 Linux 2.6 编译系统 主要...
  • 定制Linux内核

    千次阅读 2018-10-07 16:51:18
    linux驱动的学习步骤:基础知识----》搭建环境----》编译烧写----》定制内核 解压内核iTop4412_Kernel_3.0 , 驱动都在drivers目录下 配置工具Menuconfig的用法 如果修改了配置文件,那么.config 文件就...
  • 当我使用Gentoo作为guest虚拟机运行虚拟机时,我发现tick_periodic函数有相当大的开销....这是一个HZ的grep和相关的东西在我的内核配置文件.sharan013@sitmac4:~$cat /boot/config | egrep 'HZ|TIME'# CONFIG_RCU...
  • gcov是一个GCC使用的覆盖测试的工具,为了获得特定文件的覆盖结果,需要改变内核编译的目录和使用-o选项。 # cd /tmp/linux-out # gcov -o /sys/kernel/debug/gcov/tmp/linux-... 最小内核配置(如果相关的代码...
  • 当用户编译一个linux内核代码后,会产生几个文件:vmlinz、initrd.img, 以及System.map,如果配置过grub引导管理器程序,会在/boot目录下看到这几个文件。 vmlinuz vmlinuz是可引导的、压缩的内核文件。 该...
  • 当用户编译一个linux内核代码后,会产生几个文件:vmlinz、initrd.img, 以及System.map,如果配置过grub引导管理器程序,会在/boot目录下看到这几个文件。 vmlinuz vmlinuz是可引导的、压缩的内核文件。...
  • 1.要修改在arch/arm/configs下的文件xxx_defconfig 2.make xxx_defconfig 会生成....这样保存的defconfig文件,配置最小化。 ———————————————— 版权声明:本文为CSDN博主「j_j_g_a」的原创文章,遵循C
  • 准备好VMware Workstation Pro 14和CentOS-7,首先在虚拟机中安装Centos7,配置好静态网络,通过ping测试,保证网络,后面要更新操作。我安装的是桌面版,一开始是选择的最小安装,后面使用的时候有问题,建议安装...
  • busybox制做initrd.img和根文件系统(一)开发环境介绍1.使用win7_64的笔记本安装Virtualbox虚拟机...2.最小系统使用Linux内核版本选择4.15.0,内核配置使用x86_64默认配置(即便用命令make x86_64_defconfig)。busyb...
  • 对于操作系统教科书中是这样定义的;... 在Linux系统中,Linux内核有必要再区分一下这几个概念;  进程,从内核观点看,进程的目的就是担当分配系统资源(包括CPU时间、内存等)的实体;当一个进程创
  • PXE服务器用CentOS最小化安装即可,可以配置本地yum源来安装下面的服务。此教程是手动安装,没有用到kickstart文件。1.安装tftpserver和dhcpserver及syslinux。使用yum安装。yum install tftp-server dhcp syslinux ...
  • 升级我的内核版本时我正在更新配置 . 我希望对配置文件进行最小的更改,以便代码审阅者不会花费太多时间 .RETPOLINE有一个Kconfig条目如下:config RETPOLINEbool "Avoid speculative indirect branches in kernel...
  • 该构建为基于Freescale i.MX28处理器的MECT操作员面板下载,配置和安装LTIB映像构建环境和目标工具链。 制作说明 LTIB是作为非特权用户构建和安装的,但是它需要某些操作的root特权。 建立先决条件 正常运行的...
  • 拿到一个新的linux系统需要做的安全和内核优化,主要是为了提升系统安全和提升性能,满足后续的应用需要。这里简单记录一下拿到一个新的系统需要做的一些事情,仅此抛砖引玉,具体可根据自己实际情况进行设置。一、...
  • linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(修改配置文件) 一、修改内核文件: vim /etc/sysctl.conf 按一次 "i"进入编辑模式找到合适的位置#添加内容:fs.aio-max-nr = 1048576fs.file-max = 6815744...
  • 一、创建Linux内核目录框架 二、Linux源码修改 三、内核配置及编译 四、Linux内核启动 一、创建Linux内核目录框架 FL2440开发板由三星ARM9 S3C2440 做CPU,该CPU使用arm4t指令集的ARM920T核,工作主频最高...
  • linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(修改配置文件) 一、修改内核文件: vim /etc/sysctl.conf 按一次 "i"进入编辑模式 找到合适的位置 #添加内容: fs.aio-max-nr = 1048576 fs.file-max = ...
  • 拿到一个新的linux系统需要做的安全和内核优化,主要是为了提升系统安全和提升性能,满足后续的应用需要。这里简单记录一下拿到一个新的系统需要做的一些事情,仅此抛砖引玉,具体可根据自己实际情况进行设置。一、...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 299
精华内容 119
关键字:

linux内核最小配置

linux 订阅