> For the complete documentation index, see [llms.txt](https://inityun.gitbook.io/niao-ge-de-linux-si-fang-cai-1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://inityun.gitbook.io/niao-ge-de-linux-si-fang-cai-1/chapter_24/24.2-he-xin-bian-yi-de-qian-chu-li-yu-he-xin-gong-neng-xuan-ze.md).

# 24.2 核心编译的前处理与核心功能选择

什么？核心编译还要进行前处理？没错啦！事实上，核心的目的在管理硬件与提供系统核心功能，因此你必须要先找到你的系统硬件， 并且规划你的主机未来的任务，这样才能够编译出适合你这部主机的核心！所以，整个核心编译的重要工作就是在“挑选你想要的功能”。 下面鸟哥就以自己的一部主机软/硬件环境来说明，解释一下如何处理核心编译啰！

## 24.2.1 硬件环境检视与核心功能要求

鸟哥的一部主机硬件环境如下 （在虚拟机中，通过 /proc/cpuinfo 及 lspci 观察）：

* CPU：Intel（R） Xeon（R） CPU E5-2650
* 主板芯片组： KVM 虚拟化仿真的主版 （Intel 440FX 相容）
* 显卡： Red Hat, Inc. QXL paravirtual graphic card
* 内存： 2.0GB 内存
* 硬盘： KVM Virtio 界面磁盘 40G （非 IDE/SATA/SAS 喔！）
* 网卡： Red Hat, Inc Virtio network device

硬件大致如上，至于这部主机的需求，是希望做为未来在鸟哥上课时，可以通过虚拟化功能来处理学生的练习用虚拟机。 这部主机也是鸟哥用来放置学校上课教材的机器，因此，这部主机的 I/O 需求须要好一点，未来还需要打开防火墙、 WWW 服务器功能、FTP 服务器功能等，基本上，用途就是一部小型的服务器环境啰。大致上需要这样的功能啦！

## 24.2.2 保持干净源代码： make mrproper

了解了硬件相关的数据后，我们还得要处理一下核心源代码下面的残留文件才行！假设我们是第一次编译， 但是我们不清楚到下面载下来的源代码当中有没有保留目标文件 （\*.o） 以及相关的配置文件存在， 此时我们可以通过下面的方式来处理掉这些“编译过程的目标文件以及配置文件”：

```shell
[root@study ~]# cd /usr/src/kernels/linux-3.10.89/
[root@study linux-3.10.89]# make mrproper
```

请注意，这个动作会将你以前进行过的核心功能选择文件也删除掉， 所以几乎只有第一次执行核心编译前才进行这个动作，其余的时刻，你想要删除前一次编译过程的残留数据， 只要下达：

```shell
[root@study linux-3.10.89]# make clean
```

因为 make clean 仅会删除类似目标文件之类的编译过程产生的中间文件，而不会删除配置文件！ 很重要的！千万不要搞乱了喔！好了，既然我们是第一次进行编译，因此，请下达“make mrproper”吧！

## 24.2.3 开始挑选核心功能： make XXconfig

不知道你有没有发现 /boot/ 下面存在一个名为 config-xxx 的文件？那个文件其实就是核心功能列表文件！ 我们下面要进行的动作，其实就是作出该文件！而我们后续小节所要进行的编译动作，其实也就是通过这个文件来处理的！ 核心功能的挑选，最后会在 /usr/src/kernels/linux-3.10.89/ 下面产生一个名为 .config 的隐藏文件， 这个文件就是 /boot/config-xxx 的文件啦！那么这个文件如何创建呢？你可以通过非常多的方法来创建这个文件！ 常见的方法有：

* make menuconfig 最常使用的，是文字模式下面可以显示类似图形接口的方式，不需要启动 X Window 就能够挑选核心功能菜单！
* make oldconfig 通过使用已存在的 ./.config 文件内容，使用该文件内的设置值为默认值，只将新版本核心内的新功能选项列出让使用者选择， 可以简化核心功能的挑选过程！对于作为升级核心源代码后的功能挑选来说，是非常好用的一个项目！
* make xconfig 通过以 Qt 为图形接口基础功能的图形化接口显示，需要具有 X window 的支持。例如 KDE 就是通过 Qt 来设计的 X Window，因此你如果在 KDE 画面中，可以使用此一项目。
* make gconfig 通过以 Gtk 为图形接口基础功能的图形化接口显示，需要具有 X window 的支持。例如 GNOME 就是通过 Gtk 来设计的 X Window，因此你如果在 GNOME 画面中，可以使用此一项目。
* make config 最旧式的功能挑选方法，每个项目都以条列式一条一条的列出让你选择，如果设置错误只能够再次选择，很不人性化啊！

大致的功能选择有上述的方法，更多的方式可以参考核心目录下的 README 文件。鸟哥个人比较偏好 make menuconfig 这个项目啦！如果你喜欢使用图形接口， 然后使用鼠标去挑选所需要的功能时，也能使用 make xconfig 或 make gconfig ，不过需要有相关的图形接口支持！ 如果你是升级核心源代码并且需要重新编译，那么使用 make oldconfig 会比较适当！

* 通过既有的设置来处理核心项目与功能的选择

如果你跟鸟哥一样懒，那可以这样思考一下。既然我们的 CentOS 7 已经有提供它的核心设置值，我们也只是想要修改一些小细节而已， 那么能不能以 CentOS 7 的核心功能为底，然后来细部微调其它的设置呢？当然可以啊！你只要这样做即可：

```shell
[root@study linux-3.10.89]# cp /boot/config-3.10.0-229.11.1.el7.x86_64 .config
# 上面那个版本请依据你自己的环境来填写～
```

接下来要开始调整啰！那么如何选择呢？以 make menuconfig 来说，出现的画面会有点像这样：

**Tips** 注意，你可能会被要求安装好多软件，请自行使用 yum 来安装喔！这里不再介绍了！ 另外：“不要再使用 make mrproper ”喔！因为我们已经复制了 .config 啊！使用 make mrproper 会将 .config 删除喔！

![make menuconfig 核心功能挑选菜单示意图](/files/vN9mf1uic37aznZ1r4kL)\
\&#xNAN;*图24.2.1、make menuconfig 核心功能挑选菜单示意图*

看到上面的图示之后，你会发现画面主要分为两大部分，一个是大框框内的反白光柱，另一个则是下面的小框框， 里面有 select, exit 与 help 三个选项的内容。这几个元件的大致用法如下：

* “左右方向键”：可以移动最下面的 \<Select>, \<Exit>, \<Help>项目；
* “上下方向键”：可以移动上面大框框部分的反白光柱，若该行有箭头 （--->） 则表示该行内部还有其他细项需要来设置的意思；
* 选定项目：以“上下键”选择好想要设置的项目之后，并以“左右键”选择 \<Select> 之后， 按下“ Enter ”就可以进入该项目去作更进一步的细部设置啰；
* 可挑选之功能：在细部项目的设置当中，如果前面有 \[ ] 或 < > 符号时，该项目才可以选择， 而选择可以使用“空白键”来选择；
* 若为 \[*] <*> 则表示编译进核心；若为 \<M> 则表示编译成模块！ 尽量在不知道该项目为何时，且有模块可以选，那么就可以直接选择为模块啰！
* 当在细项目选择 \<Exit> 后，并按下 Enter ，那么就可以离开该细部项目啰！

基本上建议只要“上下左右的方向键、空白键、Enter”这六个按键就好了！不要使用 Esc ，否则一不小心就有可能按错的！另外，关于整个核心功能的选择上面，建议你可以这样思考：

* “肯定”核心一定要的功能，直接编译进核心内；
* “可能在未来会用到”的功能，那么尽量编译成为模块；
* “不知道那个东西要干嘛的，看 help 也看不懂”的话，那么就保留默认值，或者将他编译成为模块；

总之，尽量保持核心小而美，剩下的功能就编译成为模块，尤其是“需要考虑到未来扩充性”， 像鸟哥之前认为螃蟹卡就够我用的了，结果，后来竟然网站流量大增，鸟哥只好改换 3Com 的网卡。 不过，我的核心却没有相关的模块可以使用～因为.....鸟哥自己编译的核心忘记加入这个模块了。 最后，只好重新编译一次核心的模块，呵呵！真是惨痛的教训啊！

## 24.2.4 核心功能细项选择

由上面的图示当中，我们知道核心的可以选择的项目有很多啊！光是第一面，就有 17 个项目，每个项目内还有不同的细项！哇！真是很麻烦啊～每个项目其实都可能有 \<Help> 的说明，所以，如果看到不懂的项目，务必要使用 Help 查阅查阅！ 好了，下面我们就一个一个项目来看看如何选择吧！

**Tips** 在下面的案例中，因为鸟哥使用的是 CentOS 7.1 的核心配置文件来进行默认的设置， 所以基本上许多默认的设置都不用重新调整。下面只列出几个鸟哥认为比较重要的设置项目。其他更详细的核心功能项目，还请自行参考 help 的说明喔！

* General setup

与 Linux 最相关的程序互动、核心版本说明、是否使用发展中程序码等信息都在这里设置的。 这里的项目主要都是针对核心与程序之间的相关性来设计的，基本上，保留默认值即可！ 不要随便取消下面的任何一个项目，因为可能会造成某些程序无法被同时执行的困境喔！ 不过下面有非常多新的功能，如果你有不清楚的地方，可以按 \<Help> 进入查阅，里面会有一些建议！ 你可以依据 Help 的建议来选择新功能的启动与否！

```shell
（vbird）  Local version - append to kernel release
[*] Automatically append version information to the version string
    # 我希望我的核心版本成为 3.10.89.vbird ，那这里可以就这样设置！
    Kernel compression mode （Bzip2）  --->
    # 建议选择成为 Bzip2 即可，因为压缩比较佳！
.....（其他保留默认值）.....

<M> Kernel .config support
[ ]   Enable access to .config through /proc/config.gz （NEW）
    # 让 .config 这个核心功能列表可以写入实际的核心文件中！所以就不需要保留 .config 文件啰！
（20） Kernel log buffer size （16 => 64KB, 17 => 128KB）
    # CentOS 7 增加了核心的登录文件容量！占用了 2 的 20 次方，大概用了 1MB 的容量！
.....（其他保留默认值）.....

[*] Initial RAM filesystem and RAM disk （initramfs/initrd） support
（）    Initramfs source file（s）
    # 这是一定要的！因为要支持开机时载入 initail RAM disk 嘛！
[  ] Optimize for size  
    # 减低核心的文件大小，其实 gcc 参数使用 -Os 而不是 -O2。不过我们不是嵌入式系统，不太需要！
[ ] Configure standard kernel features （expert users）  --->
[ ] Embedded system
    # 上面两个在决定是否支持嵌入式系统呢？我们这里是台式机，所以这个不用选择了！
.....（其他保留默认值）.....
```

* loadable module + block layer

要让你的核心能够支持动态的核心模块，那么下面的第一个设置就得要启动才行！至于第二个 block layer 则默认是启动的， 你也可以进入该项目的细项设置，选择其中你认为需要的功能即可！

```shell
[*] Enable loadable module support  ---> <==下面为细项
  --- Enable loadable module support
  [*]   Forced module loading
  [*]   Module unloading
  [*]     Forced module unloading  # 其实鸟哥认为这个项目可能可以选择的！免得常常无法卸载模块！
  [*]   Module versioning support
  [*]   Source checksum for all modules
  [*]   Module signature verification
  [  ]     Require modules to be validly signed
  [*]     Automatically sign all modules
        Which hash algorithm should modules be signed with? # 可以选择 SHA256 即可！
================================================================================
  -*- Enable the block layer  --->  <==看吧！默认就是已经选择了！下面为细项
  -*-   Block layer SG support v4
  -*-   Block layer SG support v4 helper lib
  [*]   Block layer data integrity support
  [*]   Block layer bio throttling support
        Partition Types  --->  # 至少下面的数个项目要选择！
  [*]     Macintosh partition map support
  [*]     PC BIOS （MSDOS partition tables） support
  [*]     Windows Logical Disk Manager （Dynamic Disk） support
  [*]     SGI partition support
  [*]     EFI GUID Partition support
.....（其他保留默认值）.....

        IO Schedulers  --->  # 磁盘伫列的处理方式
  <*>     Deadline I/O scheduler      # 鸟哥非常建议将此项目设置为核心功能！
  <*>     CFQ I/O scheduler 
  [*]       CFQ Group Scheduling support
          Default I/O scheduler （Deadline）  --->  # 相当建议改为Deadline
```

* CPU 的类型与功能选择

进入“Processor type and features”后，请挑选你主机的实际 CPU 形式。鸟哥这里使用的是 Intel E5 的 CPU， 而且鸟哥的主机还有启动 KVM 这个虚拟化的服务 （在一部主机上面同时启动多个操作系统），因此，所以下面的选择是这样的：

```shell
.....（其他保留默认值）.....
  [*] Linux guest support  --->     # 提供 Linux 虚拟化功能
  [*]   Enable paravirtualization code   # 至少下面这几样一定要有选择才好！
  [*]     Paravirtualization layer for spinlocks
  [*]     Xen guest support
  [*]   KVM Guest support （including kvmclock）
  [*]   Paravirtual steal time accounting
.....（其他保留默认值）.....

      Processor family （Generic-x86-64）  --->  # 除非你是旧系统，否则就用他！
  [*] Enable Maximum number of SMP Processors and NUMA Nodes
  [*] Multi-core scheduler support
      Preemption Model （No Forced Preemption （Server）  --->  # 调整成 server 喔！原本是 desktop
.....（其他保留默认值）.....

      Timer frequency （300 HZ）  --->  # server 设置成 300 即可！
    # 这个项目则与核心针对某个事件立即回应的速度有关。Server 用途可以调整到
    # 300Hz 即可，如果是桌面电脑使用，需要调整高一点，例如 1000Hz 较佳！
.....（其他保留默认值）.....
```

* 电源管理功能

如果选择了“Power management and ACPI options”之后，就会进入系统的电源管理机制中。 其实电源管理机制还需要搭配主板以及 CPU 的相关省电功能，才能够实际达到省电的效率啦！ 不论是 Server 还是 Desktop 的使用，在目前电力不足的情况下，能省电就加以省电吧！

```shell
.....（其他保留默认值）.....
  [*] ACPI （Advanced Configuration and Power Interface） Support  --->
    # 对嵌入式系统来说，由于可能会增加核心容量故需要考虑考虑。至于 desktop/server 当然就选择啊
    # 至于内容细项大致保持默认值即可
    CPU Frequency scaling  --->
    # 决定 CPU 频率的一个重要项目，基本上的项目是 ondemand 与 performance 两者！
    <M>   CPU frequency translation statistics
    [*]     CPU frequency translation statistics details
          Default CPUFreq governor （ondemand）  --->  # 现在大家都建议用这个！
    -*-   'performance' governor
    <*>   'powersave' governor
    <*>   'userspace' governor for userspace frequency scaling
    -*-   'ondemand' cpufreq policy governor
    <*>   'conservative' cpufreq governor
          x86 CPU frequency scaling drivers  --->
          # 这个子项目内全部都是省电机制，能编成模块的全部选择！要加入核心的都加入就对了！
```

* 一些总线 （bus） 的选项

这个“Bus options （PCI etc.）”项目则与总线有关啦！分为最常见的 PCI 与 PCI-express 的支持，还有笔记本电脑常见的 PCMCIA 插卡啊！要记住的是，那个 PCI-E 的接口务必要选取！不然你的新显卡可能会捉不到！

```shell
[*] PCI support
[*]   Support mmconfig PCI config space access
[*]   PCI Express support
<*>     PCI Express Hotplug driver
.....（其他在 PCI Express 下面的项目大多保留默认值）.....
-*- Message Signaled Interrupts （MSI and MSI-X）
<*> PCI Stub driver   # 如果要玩虚拟化，这个部份建议编进核心！
.....（其他保留默认值）.....
```

* 编译后可执行文件的格式

选择“Executable file formats / Emulations”会见到如下选项。 下面的选项必须要勾选才行喔！因为是给 Linux 核心运行可执行文件之用的数据。通常是与编译行为有关啦！

```shell
-*- Kernel support for ELF binaries
[*] Write ELF core dumps with partial segments
<*> Kernel support for scripts starting with #!
<M> Kernel support for MISC binaries
[*] IA32 Emulation
<M>   IA32 a.out support
[*]   x32 ABI for 64-bit mode
# 因为我们的 CentOS 已经是纯 64 位的环境！所以个人建议这里还是要选择仿真 32 位的功能！
# 不然若有些比较旧的软件，恐怕会无法被你的系统所执行喔！
```

* 核心的网络功能

这个“Networking support”项目是相当重要的选项，因为他还包含了防火墙相关的项目！就是未来在服务器篇会谈到的防火墙 iptables 这个数据啊！所以，千万注意了！在这个设置项目当中，很多东西其实我们在基础篇还没有讲到， 因为大部分的参数都与网络、防火墙有关！由于防火墙是在启动网络之后再设置即可，所以绝大部分的内容都可以被编译成为模块，而且也建议你编成模块！有用到再载入到核心即可啊！

```shell
--- Networking support
      Networking options  --->
      # 就是这个光啊！里面的数据全部都是重要的防火墙项目！尽量编成模块啰！
      # 至于不晓得功能的部分，就尽量保留默认值即可！
      # 下面的数据中，鸟哥只有列出原本没有选择，后来建议选择的部份
      [*] Network packet filtering framework （Netfilter）  --->
      # 这个就是我们一直讲的防火墙部分！里面细项几乎全选择成为模块！
          --- Network packet filtering framework （Netfilter）
                Core Netfilter Configuration  --->
                <M> Transparent proxying support
================================================================================
      [*] QoS and/or fair queueing  ---> <==内容同样全为模块！
          Network testing  ---> <==保留成模块默认值
================================================================================
# 下面的则是一些特殊的网络设备，例如红外线啊、蓝牙啊！
# 如果不清楚的话，就使用模块吧！除非你真的知道不要该项目！
<M>   Bluetooth subsystem support  --->
      # 这个是蓝牙支持，同样的，里面除了必选之外，其他通通挑选成为模块！
[*]   Wireless  --->
      # 这个则是无线网络设备，里面保留默认值，但可编成模块的就选模块
<M>   WiMAX Wireless Broadband support  --->
      # 新一代的无线网络，也请勾选成为模块！
<M>  NFC subsystem support  --->
      # 跟卡片比较有关的芯片支持，建议编译成模块，内部数据也是编译成模块为佳！
```

* 各项设备的驱动程序

进入“Device Drivers”这个是所有硬件设备的驱动程序库！哇！光是看到里面这么多内容，鸟哥头都昏了～ 不过，为了你自己的主机好，建议你还是得要一个项目一个项目的去挑选挑选才行～ 这里面的数据就与你主机的硬件有绝对的关系了！

在这里面真的很重要，因为很多数据都与你的硬件有关。核心推出时的默认值是比较符合一般状态的， 所以很多数据其实保留默认值就可以编的很不错了！不过，也因为较符合一般状态， 所以核心额外的编译进来很多跟你的主机系统不符合的数据，例如网卡设备～ 你可以针对你的主板与相关硬件来进行编译。不过，还是要记得有“未来扩充性”的考虑！ 之前鸟哥不是谈过吗，我的网卡由螃蟹卡换成 3Com 时，核心捉不到～ 因为...鸟哥并没有将 3Com 的网卡编译成为模块啊！ @\_@

```shell
# 大部分都保留默认值，鸟哥只是就比较重要的部份拿出来做说明而已！
    <M> Serial ATA and Parallel ATA drivers  --->  # 就是 SATA/IDE 磁盘！大多数选择为模块！
    [*] Multiple devices driver support （RAID and LVM）  ---> # 就是 LVM 与 RAID ！要选要选！
    -*- Network device support  ---> # 网络方面的设备，网卡与相关媒体啦！
        -*-   Network core driver support
        <M>     Bonding driver support             # 与网卡整合有关的项目！要选！
        <M>     Ethernet team driver support  ---> # 与 bonding 差不多的功能！要选！
        <M>     Virtio network driver              # 虚拟化的网卡驱动程序！要选！
        -*-   Ethernet driver support  --->        # 以太网卡！里面的一堆 10G 卡要选！
              <M>     Chelsio 10Gb Ethernet support
              <M>     Intel（R） PRO/10GbE support
        <M>   PPP （point-to-point protocol） support# 与拨接有关的协定！
              USB Network Adapters  --->           # 当然全部编译为模块！
        [*]   Wireless LAN  --->                   # 无线网卡也相当重要！里面全部变成模块！
================================================================================
    [ ] GPIO Support  --->           # 若有需要使用类似树莓派、香蕉派才需要这东西！
    <M> Multimedia support  --->     # 多媒体设备，如影像撷取、广播声卡等等
        Graphics support  --->       # 显卡！如果是作为桌上型使用，这里就重要了！
    <M> Sound card support  --->     # 声卡，同样的，桌面电脑使用时，比较重要！
    [*] USB support  --->            # 就是 USB！下面几个内部的细项要注意是勾选的！
        <*>     xHCI HCD （USB 3.0） support
        <*>     EHCI HCD （USB 2.0） support
        <*>     OHCI HCD support
        <*>     UHCI HCD （most Intel and VIA） support
    <M> InfiniBand support  --->     # 较高阶的网络设备，速度通常达到 40Gb 以上！
    <M> VFIO Non-Privileged userspace driver framework  ---> # 作为 VGA passthrought 用！
        [*]     VFIO PCI support for VGA devices
    [*] Virtualization drivers  ---> # 虚拟化的驱动程序！
        Virtio drivers  --->         # 在虚拟机里面很重要的驱动程序项目！
    [*] IOMMU Hardware Support  ---> # 同样的与虚拟化相关性较高！
```

至于“ Firmware Drivers ”的项目，请视你的需求来选择～基本上就保留设置值即可！所以鸟哥这里就不显示啰！

* 文件系统的支持

文件系统的支持也是很重要的一项核心功能！因为如果不支持某个文件系统，那么我们的 Linux kernel 就无法认识，当然也就无法使用啦！例如 Quota, NTFS 等等特殊的 filesystem 。 这部份也是有够麻烦～因为涉及核心是否能够支持某些文件系统，以及某些操作系统支持的 partition table 项目。在进行选择时，也务必要特别的小心在意喔！ 尤其是我们常常用到的网络操作系统 （NFS/Samba 等等），以及基础篇谈到的 Quota 等， 你都得要勾选啊！否则是无法被支持的。如果你有兴趣，也可以将 NTFS 的文件系统设置为可读写看看啰！

```shell
# 下面仅有列出比较重要及与默认值不同的项目而已喔！所以项目少很多！
    <M> Second extended fs support           # 默认已经不支持 ext2/ext3，这里我们将他加回来！
    <M> Ext3 journalling file system support
    [*]   Default to 'data=ordered' in ext3 （NEW）
    [*]   Ext3 extended attributes （NEW）
    [*]     Ext3 POSIX Access Control Lists
    <M> The Extended 4 （ext4） filesystem     # 一定要有的支持
    <M> Reiserfs support
    <M> XFS filesystem support               # 一定要有的支持！
    [*]   XFS Quota support
    [*]   XFS POSIX ACL support
    [*]   XFS Realtime subvolume support     # 增加这一项好了！
    <M> Btrfs filesystem support             # 最好有支持！
    [*] Quota support
    <*> Quota format vfsv0 and vfsv1 support
    <*> Kernel automounter version 4 support （also supports v3）
    <M> FUSE （Filesystem in Userspace） support
        DOS/FAT/NT Filesystems  --->
        <M> MSDOS fs support
        <M> VFAT （Windows-95） fs support
        （950） Default codepage for FAT       # 要改成这样喔！中文支持！
        （utf8） Default iocharset for FAT     # 要改成这样喔！中文支持！
        <M> NTFS file system support         # 建议加上 NTFS 喔！
        [*]   NTFS write support             # 让他可读写好了！
        Pseudo filesystems  --->             # 类似 /proc ，保留默认值
    -*- Miscellaneous filesystems  --->      # 其他文件系统的支持，保留默认值
    [*] Network File Systems  --->           # 网络文件系统！很重要！也要挑挑！
        <M>   NFS client support
        <M>   NFS server support
        [*]     NFS server support for NFS version 4
        <M>   CIFS support （advanced network filesystem, SMBFS successor）
        [*]       Extended statistics
        [*]   Provide CIFS client caching support
    -*- Native language support  --->        # 选择默认的语系
        （utf8） Default NLS Option
        <M>   Traditional Chinese charset （Big5）
```

* 核心骇客、信息安全、密码应用

再接下来有个“Kernel hacking”的项目，那是与核心开发者比较有关的部分，这部分建议保留默认值即可， 应该不需要去修改他！除非你想要进行核心方面的研究喔。然后下面有个“ Security Options ”，那是属于信息安全方面的设置， 包括 SELinux 这个细部权限强化模块也在这里编入核心的！这个部份只要记得 SELinux 作为默认值，且务必要将 NSA SELinux 编进核心即可， 其他的细部请保留默认值。

另外还有“ Cryptographic API ”这个密码应用程序接口工具选项，以前的默认加密机制为 MD5，近年来则改用了 SHA 这种机制。 不过，反正默认已经将所有的加密机制编译进来了，所以也是可以保留默认值啦！都不需要额外修改就是了！

* 虚拟化与函数库

虚拟化是近年来非常热门的一个议题，因为计算机的能力太强，所以时常闲置在那边， 此时，我们可以通过虚拟化技术在一部主机上面同时启动多个操作系统来运行，这就是所谓的虚拟化。 Linux 核心已经主动的纳入虚拟化功能喔！而 Linux 认可的虚拟化使用的机制为 KVM （Kernel base Virtual Machine）。 至于常用的核心函数库也可以全部编为模块啰！

```shell
[*] Virtualization  --->
    --- Virtualization
    <M>   Kernel-based Virtual Machine （KVM） support
    <M>     KVM for Intel processors support
    <M>     KVM for AMD processors support
    [*]     Audit KVM MMU
    [*]     KVM legacy PCI device assignment support   # 虽然已经有 VFIO，不过建议还是选起来！
    <M>   Host kernel accelerator for virtio net
================================================================================
Library routines  --->
    # 这部份全部保留默认值即可！
```

现在请回到如\[图24.2.1] 的画面中，在下方设置处移动到“Save”的选项，点选该项目， 在出现的窗口中确认文件名为 .config 之后，直接按下“OK”按钮，这样就将刚刚处理完毕的选项给记录下来了。 接下来可以选择离开菜单画面，准备让我们来进行编译的行为啰。

要请你注意的是，上面的数据主要是适用在鸟哥的个人机器上面的， 目前鸟哥比较习惯使用原本 distributions 提供的默认核心，因为他们也会主动的进行更新， 所以鸟哥就懒的自己重编核心了～ ^\_^

此外，因为鸟哥重视的地方在于“网络服务器与虚拟化服务器”上面，所以里头的设置少掉了相当多的个人桌上型 Linux 的硬件编译！所以，如果你想要编译出一个适合你的机器的核心， 那么可能还有相当多的地方需要来修正的！不论如何，请随时以 Help 那个选项来看一看内容吧！反正 Kernel 重编的概率不大！花多一点时间重新编译一次！ 然后将该编译完成的参数文件储存下来，未来就可以直接将该文件叫出来读入了！ 所以花多一点时间安装一次就好！那也是相当值得的！
