分享
 
 
 

LPI102考试准备:内核-2

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

在本节中,学习如何:

定制当前的内核配置

构建新内核和适当的内核模块

安装新内核和任何模块

确保引导管理器能够找到新内核和相关联的文件

正如在前一节 运行时内核管理 中学到的,内核为系统硬件和文件系统提供了低层支持。现代的内核映像常常只包含基本功能,但是可以通过使用内核模块 来支持可能需要的附加功能。附加支持只在需要时装载,例如在插入或启用某一设备时。

模块化的代码成为内核的一部分,这样就可以动态地扩展内核的功能。如果在几分钟时间内没有使用某个已装载模块的功能,那么内核可以自愿地通过一个称为自动清理(autocleaning) 的过程,将它与内核的其余部分分离开并从内存中卸载。

如果没有内核模块,那么(作为单一二进制文件从磁盘装载的)正在运行的内核必须包含可能需要的所有功能。而且,每当需要向系统中添加功能时,都需要构建全新的内核。

但是,不能将所有东西 都放在模块中。装载的内核映像至少必须能够挂装根文件系统。但是,正如在教程 “LPI 101 考试准备(主题 102):Linux 安装与包管理” 中学到的,引导装载器可以装载初始 RAM 盘 (即 initrd),其中可以包含挂装根文件系统所需的模块。然而,内核映像至少必须包含对初始 RAM 盘中使用的 RAM 文件系统的支持。如果不这样,系统就无法引导。

系统本身自举之后,它挂装根文件系统,然后开始其他初始化过程。几秒之后,系统启动完成,可供用户使用了。但是,内核仍然等待执行用户进程的请求、调度系统资源以及执行其他任务。

模块化内核在具有大量 RAM 和硬盘空间的现代系统上工作得很好。但是,您可能会有一种新硬件,比如显卡或存储系统,发行版附带的内核不支持这种硬件。实际上,一些驱动程序包含专有代码,它们会污染 纯 Linux 内核,所以一些发行版不包含它们,即使驱动程序厂商的许可证条款允许发行商发行它们。在这种情况下,您至少需要构建新模块,甚至可能需要构建新内核。

Linux 可以用在许多环境中,从嵌入式系统(比如手机)到网络设备(比如路由器),到机顶盒,甚至更传统的计算环境。其中一些设备使用经过定制的内核,以便只支持系统希望支持的功能。例如,如果一个系统的用途是作为无盘防火墙,那么除了从其中装载它的只读文件系统之外,它不需要对任何文件系统的支持,但是它可能需要标准内核中不包含的高级网络硬件支持。同样,这就需要定制的内核。

源代码包

Linux 内核的最终源代码是 Linux Kernel Archives(参见 参考资料 中的链接)。除非您知道自己在做什么,否则应该使用来自 Linux 发行版的内核包,因为发行商可能已经添加了定制的补丁。如果您不熟悉如何获得和提取源代码包,那么请复习教程 “LPI 101 考试准备(主题 102):Linux 安装与包管理”。在进行可能改变系统的任何操作时,首先应该进行备份,这样如果出了错误,就可以恢复。

如果从公共的内核存档中下载源代码,那么会得到一个压缩的文件,需要使用 gzip 或 bzip2 将它解压,使用哪个程序取决于下载的内核源代码是 .gz 还是 .bz2 版本。下载服务器上的 pub/linux/kernel/ 目录中对于每个内核版本都有一个目录,比如 2.4、2.5 或 2.6。到编写本文时,2.6 内核最新的 bzip2 版本是 linux-2.6.15.tar.bz2。

在这个内核目录中,还会看到对应的 ChangeLog-2.6.15.6 文件(描述这个版本中的修改)和 patch-2.6.15.bz2(这是一个比较小的文件,可以用它将前一个源代码版本升级到 2.6.15)。还会注意到签名文件,可以使用它们确认下载的文件没有被有意或无意地损坏。

压缩的源代码在一般情况下在 /usr/src 中解压,并为内核版本创建一个新的子目录,比如 linux-2.6.15,其中包含构建内核所需要的文件树。如果已经有这样的目录,那么在解压新的内核源代码之前可能需要对它进行备份或重命名。这可以确保在需要时能够恢复原内核,而且在内核源代码树中没有不应该存在的文件。对于压缩文件,需要大约 40MB 的硬盘空间,展开的源代码需要大约 350MB 空间。

一些发行商(比如 Red Hat)现在将构建内核模块所需的内核头和源代码作为内核开发包发行。文档可能在单独的内核文档包中。对于构建模块(比如专有的厂商图形卡模块),这些内容已经足够了,但是对于重新构建定制的内核是不够的。您的发行版应该提供了关于如何重新构建内核以及如何获得源代码的信息。请检查发布说明等文档。

假设您使用 FTP 或 HTTP 从 download.fedora.redhat.com 的 pub/fedora/linux/core/updates/4/SRPMS/ 下载了 kernel-2.6.15-1.1833_FC4.src.rpm 源代码 RPM,并将这个文件放在 /root 目录中。注意,这里使用的版本号可能与您的系统不同,所以请确保获得与已安装的内核对应的源代码更新版本。现在,对于 Fedora,必须安装这个源代码 RPM,然后切换到 /usr/src/redhat/SPECS 目录,最后构建这个源代码 RPM,从而创建 Linux 内核源代码树,见清单 13。

清单 13. 为 Fedora Core 创建内核源代码树

[root@attic4 ~]# uname -r

2.6.15-1.1833_FC4

[root@attic4 ~]# rpm -Uvh kernel-2.6.15-1.1833_FC4.src.rpm

1:kernel ########################################### [100%]

[root@attic4 ~]# cd /usr/src/redhat/SPECS

[root@attic4 SPECS]# rpmbuild -bp --target $(arch) kernel-2.6.spec

Building target platforms: x86_64

Building for target x86_64

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.23188

+ umask 022

+ cd /usr/src/redhat/BUILD

+ LANG=C

+ export LANG

+ unset DISPLAY

+ '[' '!' -d kernel-2.6.15/vanilla ']'

+ cd /usr/src/redhat/BUILD

+ rm -rf kernel-2.6.15

+ /bin/mkdir -p kernel-2.6.15

+ cd kernel-2.6.15

+ /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/linux-2.6.15.tar.bz2

+ tar -xf -

...

+ echo '# x86_64'

+ cat .config

+ perl -p -i -e 's/^SUBLEVEL.*/SUBLEVEL = 15/' Makefile

+ perl -p -i -e 's/^EXTRAVERSION.*/EXTRAVERSION = -prep/' Makefile

+ find . -name '*.orig' -o -name '*~' -exec rm -f '{}' ';'

+ exit 0

Fedora 的 Linux 内核源代码现在位于 /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15 中。按照惯例,/linux-2.6.15 树常常被转移到 /usr/src 并符号链接到 /usr/src/linux,见清单 14。这并不是绝对必需的,但是参考资料常常假设内核源代码树位于 .usr./src/linux 中,因此这样做便于您理解这些资料。

清单 14. 将源代码树转移到 ./usr/src 中

[root@attic4 SPECS]# mv ../BUILD/kernel-2.6.15/linux-2.6.15 /usr/src

[root@attic4 SPECS]# cd /usr/src

[root@attic4 src]# ln -s linux-2.6.15 linux

[root@attic4 src]# ls -ld lin*

lrwxrwxrwx 1 root root 12 Mar 20 18:23 linux -> linux-2.6.15

drwxr-xr-x 20 root root 4096 Mar 20 18:13 linux-2.6.15

在尝试构建任何东西之前,查看 Documentation 目录中的 Changes 文件。除了其他东西之外,它还列出了构建内核所需的各种软件包的最低级别。确保安装了这些软件包。

在清单 13 所示的文件中可能有 Makefile 和 .config。make 文件包含几个任务的 make 目标,比如配置内核选项、构建内核及其模块以及安装模块并构建 RPM 或 deb 包。比较新的内核源代码允许使用 make help 获得关于每个目标的简短帮助。对于比较旧的系统,可能需要参考文档或研究 make 文件。清单 15 给出了 make help 的部分输出。

清单 15. 内核构建 make 文件的帮助

[ian@attic4 linux-2.6.15]$ make help

Cleaning targets:

clean - remove most generated files but keep the config

mrproper - remove all generated files + config + various backup files

Configuration targets:

config - Update current config utilising a line-oriented program

menuconfig - Update current config utilising a menu based program

xconfig - Update current config utilising a QT based front-end

gconfig - Update current config utilising a GTK based front-end

oldconfig - Update current config utilising a provided .config as base

randconfig - New config with random answer to all options

defconfig - New config with default answer to all options

allmodconfig - New config selecting modules when possible

allyesconfig - New config where all options are accepted with yes

allnoconfig - New minimal config

Other generic targets:

all - Build all targets marked with [*]

* vmlinux - Build the bare kernel

* modules - Build all modules

modules_install - Install all modules

dir/ - Build all files in dir and below

dir/file.[ois] - Build specified target only

...

配置

内核构建目录中的 .config 文件包含内核的配置信息,包括目标机器环境、要包含的特性,以及一个特性应该编译进内核中,还是构建为模块。创建 .config 文件是构建或重新构建内核的第一步。使用 make 文件中的配置目标之一创建这个文件。

主要的配置选项是:

config

config 目标使用一个命令行界面来获得许多问题的答案,从而构建或更新 .config 文件。由于出现了基于菜单的配置目标,这个命令行界面现在很少使用了。

menuconfig

menuconfig 目标使用一个基于 ncurses 和菜单的程序来创建或更新 .config 文件。您只需要回答要修改的条目的问题。这种方式已经取代了老式的 config 目标。可以在一个终端窗口中远程或本地地运行这个目标。

xconfig

xconfig 目标使用一个基于 QT 前端的图形菜单系统,就像是 KDE 桌面使用的系统。

gconfig

gconfig 目标使用一个基于 GTK 前端的图形菜单系统,就像是 GNOME 桌面使用的系统。

oldconfig

oldconfig 目标允许使用现有的 .config 文件来构建配置,比如可以使用从以前的构建或另一个系统中获得的 .config 文件。例如,如果您安装了上面描述的 Fedora 内核源代码,那么就可以将正在运行的系统的配置文件从 /lib/modules/$(uname -r)/build/.config 复制到 /usr/src/linux 中。构建它之后,如果需要的话,可以使用菜单配置目标之一来修改它。

图 1 展示了对于 2.4 系列内核运行 make menuconfig 时可能看到的情况。按 Enter 进入低层菜单,按 Esc 返回。大多数条目都有帮助。用 tab 键转到 < Help > 按钮并按 Enter,或者直接按 h。按 Esc 返回配置。

图 1. 在 2.4 内核上运行 make menuconfig

表 4 给出了用于在内核中包含特性的各种选项,包括内置在内核中或作为模块。当一个选项高亮显示时,按空格键在这个特性的可用选择之间切换。还可以按 y 来启用选项,按 n 来禁用它,或者按 m 来表示尽可能将它编译为模块。

表 4. menuconfig 的选项 选项 描述

[*] 特性将内置在内核中。

[ ] 特性将不包含在内核中。

<M> 特性将构建为内核模块。

< > 特性将不包含在内核中,而是能够构建为模块。

图 2 展示了对于 2.6 系列内核运行 make gconfig 时可能看到的情况。点击箭头来展开或折叠菜单项。帮助显示在一个比较低的面板中。

图 2. 在 2.6 内核上运行 make gconfig

下面描述了 2.6 内核的主要配置部分。在 2.4 和更早的内核中,不一定能够找到所有这些选项,但是这个列表能让您对配置选项的位置有大致了解。

Code maturity level options

这个部分包含一个选项,它决定是否可以用其余的选项将代码设置为试验性的。如果不选择这个选项,那么只能选择稳定性的选项。注意,您选择的功能在系统的当前代码级上可能工作,也可能不工作,这在调试时可能会有帮助。

General setup

这个部分给新内核设置一个识别字符串,还有几个内核属性的选项,这些选项不属于其他部分,但是必须指定。

Loadable module support

这个部分包含一个选项,它决定内核是否支持模块以及模块是否可以自动地装载和卸载。应该启用模块支持。

Block layer

这个部分包含对大于 2TB 的硬盘的支持,并允许选择硬盘调度的类型。

Processor type and features

这个部分包含 CPU 特有的配置选项。在这里选择内核将支持的处理器或处理器系列,以及是否启用对各种处理器特性的访问。如果您有多个 CPU 或超线程 CPU,那么一定要启用对称多处理支持。一般情况下,应该启用 MTRR 选项以便允许用 AGP 或 PCI 显卡提供更好的图形性能。

Power management options

这个部分包含几个电源管理选项。这些选项在笔记本电脑上尤其有用。除了控制电源状态之外,还有控制和监视温度或风扇状态等情况的选项。

Bus options (PCI etc.)

这个部分包含系统支持的总线的选项,比如 PCI、PCI Express 和 PC Card 总线。还可以在这里启用 /proc/pci 文件系统,但是一般应该使用 lspci。

Executable file formats / Emulations

这个部分包含支持各种二进制文件格式的选项。应该启用 ELF 二进制支持。还可以启用对 DOS 二进制的支持以便在 DOSEMU 下运行,以及包装器驱动的二进制,比如 Java&#8482;、Python、Emacs-Lisp 等等。最后,对于支持 32 位模拟的 64 位系统,可能需要启用 32 位二进制支持。

Networking

这个部分很大。在这里可以启用基本套接字和 TCP/IP 连网,以及报文过滤、桥接、路由以及对各种协议的支持,比如 IPV6、IPX、Appletalk 和 X.25。还可以在这里启用无线、红外线和业余无线电支持。

Device drivers

这个部分也很大。在这里可以启用对大多数硬件设备的支持,包括 IDE/ATAPI 或 SCSI 硬盘驱动器和闪存设备。为 IDE 设备启用 DMA;否则,它们就会采用比较慢的 PIO 模式。如果希望支持多个 RAID 或 LVM 这样的设备,那么在这里启用它。如果需要并行打印机支持,还可以在这里配置并行端口支持。还可以在这里配置范围广泛的网络设备来支持上面配置的网络协议。还可以在这里找到音频和视频捕捉设备、USB 和 IEEE 1384(Firewire)设备以及各种硬件监视设备的支持。在字符设备子部分中,可能需要启用并行打印支持和直接渲染支持。

Firmware drivers

这个部分包含几个与 BIOS 设置和更新相关的选项,比如在某些 Dell 系统上使用 Dell System Management 函数。

File systems

这个部分用于配置希望内核支持的文件系统,包括编译进内核或编译为模块。还可以在这里找到可移除介质(比如软盘和 CD 或 DVD 设备)的文件系统,以及对连网文件系统(比如 NFS、SMB 或 CIFS)的支持。还有各种分区和 Native Language Support 的支持。

Instrumentation support

这个部分允许启用试验性的分析支持,从而对系统的活动进行分析。

Kernel hacking

这个部分允许启用内核调试并选择要启用的特性。

Security options

这个部分允许配置几个安全性选项,并启用和配置 SELinux(Security Enhanced Linux)。

Cryptographic options

这个部分允许配置几个密码术算法,比如 MD4、DES 和 SHA256。

Library routines

这个部分允许决定特定的 CRC 算法应该编译进内核,还是构建为模块。

构建

既然您已经看到了配置内核的主要方面,就可以构建内核了。如果不确定构建树的状态,那么在配置新内核之前运行 make clean。要想获得更干净的目标,可以运行 make mrproper;这会删除 .config 文件以及构建过程使用的一些其他文件。如果这么做,然后要恢复一个备份的 .config 文件,那么在进行配置之前需要运行 make oldconfig。

如果您正在做实验,那么应该给新内核设置一个定制的名称,这样就可以很容易地识别它。设置的办法是,在 General setup 部分中设置一个局部版本值,并启用自动地将版本信息附加到版本字符串后面的选项,见图 3。

图 3. 配置定制的内核

为了简化,本教程后面的示例构建的内核只有图 3 中所示的两处修改。

从原则上说,构建内核并不需要根特权,但是安装新内核需要根特权。但是,如果正在使用发行版安装的包,那么可能必须作为根用户运行,因为设置的文件和目录权限要求这么做。可以在用户模式中进行实践:从 Linux 内核存档下载一个内核源代码压缩文件并在自己的主目录中解压,或者复制内核构建树并将权限改为自己的用户 id。

要开始构建 2.6 内核,应该输入 make。

要开始构建 2.4 内核,应该运行下面这三个命令:

make dep

make bzImage

make modules

第一个命令构建必要的依赖文件。第二个命令构建内核。最后一个命令构建模块。

在我的 AMD Athlon 3500+ 系统上运行 make 要花大约半小时从头开始完成构建。比较慢的系统可能要花两个小时才能完成这个任务,所以在等待时您可以休息一会儿或做点儿别的事情。在构建过程中,会看到清单 16 中这样的进度消息。

清单 16. 运行 make

[root@attic4 linux]# make

CHK include/linux/version.h

HOSTCC scripts/basic/fixdep

HOSTCC scripts/basic/split-include

HOSTCC scripts/basic/docproc

SPLIT include/linux/autoconf.h -> include/config/*

CC arch/x86_64/kernel/asm-offsets.s

GEN include/asm-x86_64/asm-offsets.h

...

LD [M] sound/usb/snd-usb-lib.ko

CC sound/usb/usx2y/snd-usb-usx2y.mod.o

LD [M] sound/usb/usx2y/snd-usb-usx2y.ko

安装

构建了内核之后,还需要执行两个步骤。首先,需要运行 make modules_install 将内核模块安装在 ./lib/modules 的一个新子目录中。

如果需要用于显卡或网络驱动程序的专有模块,比如我需要用于 nVidia 图形卡和 nForce 4 主板芯片组的模块,那么现在应该使用厂商提供的工具构建这些模块。

最后,需要运行 make install 将新内核和初始 RAM 盘安装在 /boot 中,并更新引导装载器的配置。清单 17 中演示了这些步骤。

清单 17. 安装内核和模块

[root@attic4 linux]# make modules_install

INSTALL arch/x86_64/crypto/aes-x86_64.ko

INSTALL arch/x86_64/kernel/cpufreq/acpi-cpufreq.ko

INSTALL arch/x86_64/kernel/microcode.ko

INSTALL arch/x86_64/oprofile/oprofile.ko

INSTALL crypto/aes.ko

INSTALL crypto/anubis.ko

INSTALL crypto/arc4.ko

...

[root@attic4 linux]# ls -lrt /lib/modules | tail -n 3

drwxr-xr-x 5 root root 4096 Mar 4 14:48 2.6.15-1.1831_FC4

drwxr-xr-x 5 root root 4096 Mar 20 18:52 2.6.15-1.1833_FC4

drwxr-xr-x 3 root root 4096 Mar 20 21:38 2.6.15-prep-Topic105

[root@attic4 linux]# sh /root/NFORCE-Linux-x86_64-1.0-0310-pkg1.run -a > -n -K -k 2.6.15-prep-Topic105

Verifying archive integrity...OK

Uncompressing NVIDIA nForce drivers for Linux-x86_64 1.0-0310...................

[root@attic4 linux]# sh /root/NVIDIA-Linux-x86_64-1.0-8178-pkg2.run -a > -n -K -k 2.6.15-prep-Topic105

Verifying archive integrity... OK

Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 1.0-8178.................

[root@attic4 linux]# make install

CHK include/linux/version.h

CHK include/linux/compile.h

CHK usr/initramfs_list

Kernel: arch/x86_64/boot/bzImage is ready (#2)

sh /usr/src/linux-2.6.15/arch/x86_64/boot/install.sh 2.6.15-prep-Topic105

arch/x86_64/boot/bzImage System.map "/boot"

[root@attic4 linux]# ls -lrt /boot | tail -n 6

-rw-r--r-- 1 root root 1743149 Mar 20 21:45 vmlinuz-2.6.15-prep-Topic105

lrwxrwxrwx 1 root root 28 Mar 20 21:45 vmlinuz -> vmlinuz-2.6.15-prep-Topic105

-rw-r--r-- 1 root root 980796 Mar 20 21:45 System.map-2.6.15-prep-Topic105

lrwxrwxrwx 1 root root 31 Mar 20 21:45 System.map -> System.map-2.6.15-prep-Topic105

-rw-r--r-- 1 root root 1318741 Mar 20 21:45 initrd-2.6.15-prep-Topic105.img

drwxr-xr-x 2 root root 4096 Mar 20 21:45 grub

初始 RAM 盘

注意,构建过程自动创建了必需的初始 RAM 盘(initrd)。如果需要手工创建初始 RAM 盘,可以使用 mkinitrd 命令。细节参见手册页。

引导装载器

如果一切正常,那么 make install 还应该会更新引导装载器的配置。清单 18 给出了我的引导装载器配置的部分内容。

清单 18. 更新的 GRUB 配置文件

default=1

timeout=10

splashimage=(hd0,5)/boot/grub/splash.xpm.gz

password --md5 $1$y.uQRs1W$Sqs30hDB3GtE957PoiDWO.

title Fedora Core (2.6.15-prep-Topic105)

root (hd0,11)

kernel /boot/vmlinuz-2.6.15-prep-Topic105 ro root=LABEL=FC4-64 rhgb quiet

initrd /boot/initrd-2.6.15-prep-Topic105.img

title Fedora Core -x86-64 (2.6.15-1.1833_FC4)

新构建的内核的条目放在顶部,但是默认的条目仍然是原来的默认值。如果使用 LILO,那么构建脚本中使用的 grubby 命令应该更新了 LILO 配置。如果配置由于某种原因没有正确地更新,请参考教程 “LPI 101 考试准备(主题 102):Linux 安装与包管理”,这个教程提供了关于设置引导装载器的完整说明。

最后要注意一点。您可能会奇怪,为什么示例配置添加了 -Topic105,但是创建的文件都是 -prep-Topic105。这是 Fedora 的一项安全措施,以防止意外地破坏当前使用的内核。这由主 make 文件中接近顶部的 EXTRAVERSION 变量控制,见清单 19。如果需要去掉这个措施,可以编辑这个文件。

清单 19. make 文件

[root@attic4 linux]# head -n 6 Makefile

VERSION = 2

PATCHLEVEL = 6

SUBLEVEL = 15

EXTRAVERSION = -prep

NAME=Sliding Snow Leopard

重新引导

如果一切正常,现在应该能够引导新系统了。需要选择新内核的配置条目,因为它还不是默认的。如果对新内核满意了,可以将它设置为默认的。在重新引导时,使用 uname 命令来检查系统的内核,见清单 20。

清单 20. 检查新系统

[ian@attic4 ~]$ uname -rv

2.6.15-prep-Topic105 #2 Mon Mar 20 21:13:20 EST 2006

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有