自编译内核

大多数发行版都有默认的编译好的内核,并且这种内核模块较全,通用性还是很高的。 这些发行版内核往往会比Linux内核主线慢上一些(例如Debian稳定分支)。 需要用一些特别新的内核API依赖或者内核裁剪爱好者才会自己编译内核。 但是Gentoo作为一个全编译的发行版,并不提供二进制内核。

学习内核编译对理解Linux内核工作方式还是很有帮助的。

选择Kernel分支

一般不推荐Kernel的主线分支,它往往不够稳定。 我使用了Gentoo推荐的gentoo-sources的稳定版本。

另一个选项是带有pax补丁的hardened-sources硬化内核。 但是由于pax开发者闭源了该项目,gentoo已经停止支持了。 但是仍然有爱好者对Kernel主线进行pax移植。

https://github.com/copperhead/linux-hardened

配置内核

make menuconfig

通过该命令进入控制台菜单对内核进行配置。

主要可以参考金步国先生的内核配置文档翻译和文末的配置。

http://www.jinbuguo.com/kernel/longterm-linux-kernel-options.html

编译内核

make mrproper                   # 清理编译文件
make vmlinux modules            # 编译内核镜像
make install modules_install    # 安装内核

注意安装内核前要挂载好/boot分区。

使用genkernel工具

genkernel可以快速编译安装内核和内核初始系统。

使用前可修改配置文件/etc/genkernel.conf

OLDCONFIG="yes"             # 加载旧内配置文件
MENUCONFIG="yes"            # 编译前手动修改

CLEAN="no"                  # 关闭自动清理,可以加快二次编译速度
MRPROPER="no"

SAVE_CONFIG="yes"           # 开启自动备份

LVM="yes"                   # 开启内核lvm支持
LUKS="yes"                  # 开启内核Luks加密支持

之后genkernel将自动加载配置

genkernel --kernel-config=<config.file> --install all

启动内核

现在主流的主板都支持EFI启动模式。 在这种模式下Linux一般通过grub或者内核直接启动。 但是内核直接启动需要将内核启动参数直接编译进内核,所以一般还是以grub为主。

由于需要内核支持lvm和luks,所以修改grub配置文件/etc/default/grub

GRUB_CMDLINE_LINUX="crypt_root=UUID=xxxx dolvm" # 指定加密跟分区id和启动lvm
grub-mkconfig -o /boot/grub/grub.cfg    # 编译配置文件
grub-install --bootloader-id=gentoo --efi-directory /boot/grub/grub.cfg 
                                        # 安装efi启动镜像

需要注意的是EFI模式需要ESP启动分区,基于fat16/32格式。常挂载在/boot/efi

内核选项

  • Processor type and features

    • MTRR support
      • intel显卡依赖
  • Power management and ACPI options

    • 电源管理
    • Run-time PM core functionality (Remove)
      • 运行时电源管理接口
    • Device power management core functionality
      • USB电源管理集成在此
    • ACPI (Advanced Configuration and Power Interface) Support
      • Processor
        • 处理器ACPI支持
      • CPU Frequency scaling
        • CPU频率调整
  • Networking suuport

    • 内核网络支持,基本只需要下列两项
      • Networking options
        • Packet socket
          • 用于包管理、捕获工具
          • Packet: sockets monitoring interface
            • 监控用
        • Unix domain sockets
          • Unix套接字工具,系统需要,必选
          • UNIX: socket monitoring interface
            • 监控用
        • TCP/IP networking
          • 基本的TCP/IP网络支持,网络必选
          • IP: multicasting
            • 多播支持,基本无用。不选
          • IP: advanced router
            • 高级路由,可选
              • IP: policy routing
                • 路由策略
              • IP: equal cost multipath
                • 均衡负载
              • IP: verbose route monitoring
          • IP: tunneling
            • IP隧道支持
          • IP: TCP syncookie support
            • 用于对抗syn DoS
          • INET: socket monitoring interface
            • socket监控
            • UDP: socket monitoring interface
              • UDP监控
          • TCP: advanced congesting control
            • 高级拥塞控制
          • The IPv6 protocol
        • Network packet filtering framework (Netfilter)
          • 包过滤框架,防火墙需要
        • NETLINK: socket monitoring interface
          • 包监控
      • Wireless
  • Device Drivers

    • Block devices
      • Loopback device support
        • docker依赖此项
    • SCSI device support
      • SCSI disk support
        • USB硬盘依赖此项
    • Input device support
      • Event interface
        • libinput,鼠标依赖此项
      • Mice
        • PS/2 mouse
          • 鼠标支持
          • Elantech PS/2 protocol extension
            • Elan鼠标协议扩展,部分触摸板依赖此项
    • Graphics support
      • /dev/agpgart
        • intel必须开启子选项
      • Direct Rendering Manager
        • Enable legacy fbdev support for you modesetting driver
          • 控制台显示需要
      • Nouveau (NVIDIA) cards
        • 开源NVIDIA驱动,性能很差
      • Intel 8xx/9xx/G3x/G4x/HD Graphics
        • Intel集成显卡驱动
      • Frame buffer Devices
        • Support for frame buffer devices
          • Nvidia、OpenGL常用,必须的
        • EFI-based Framebuffer Support
          • Nvidia可能使用
    • Sound card support
      • Advanced Linux Sound Architecture
        • HD-Audio
          • HD Audio PCI
            • 即Intel CPU集成声卡
        • Pre-allocated buffer size for HD-audio driver
          • 推荐PulseAudio设置为2048
        • USB sound devices
          • USB Audio/MIDI driver
            • USB 耳机
    • USB support
      • Support for Host-side USB
        • 模块核心
        • USB runtime power management (autosuspend) and wakeup (Remove in 3.10)
          • USB 运行时电源管理
      • PCI based USB host interface
        • 必须
      • Enable USB persist by default
        • 持久化USB
      • USB Monitor
        • 似乎用于USB监控,wireshark啥的
      • xHCI HCD support (USB3.0)
      • EHCI HCD support (USB2.0)
      • USB Mass Storage support
        • usb存储设备
    • HID support
      • 人机接口,鼠标键盘啥的
      • Generic HID driver
      • USB HID support
        • USB HID transport layer
  • Kernel hacking

    • Filter access to /dev/mem
      • 禁止用户空间读写/dev/mem