2020-01-05 20:48:46 eyeofeagle 阅读数 20

1, 内核升级,编译安装

只编译某子目录 cd 源码根目录: make path/to/dir
只编译某模块 cd 源码根目录: make path/to/xx.ko.xz
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.7.tar.xz
tar -xf linux-5.4.7.tar.xz -C /usr/src/
cd /usr/src
ln -sf linux-5.4.7 linux

#复制原系统配置文件到此根目录下
[root@c7 ~]# cd linux
[root@c7 linux]# ls 
arch   COPYING  Documentation  include  Kbuild   lib          Makefile         net      scripts   tools
block  CREDITS  drivers        init     Kconfig  LICENSES     mm               README   security  usr
certs  crypto   fs             ipc      kernel   MAINTAINERS  modules.builtin  samples  sound     virt
[root@c7 linux]# cp /boot/config-3.10.0-957.el7.x86_64 .config

#安装编译环境
[root@c7 linux]# yum groupinstall "Development and Creative Workstation"
[root@c7 linux]# yum groupinstall "Development Tool"

#开始编译
[root@c7 linux]# yum -y install  screen #开启屏幕会话,杜绝断网中断
[root@c7 linux]# make menuconfig #做必要修改,保存退出
[root@c7 linux]# screen -S make_kernel #####开启一个screen会话:
#------------------screen 会话 窗口 start------------
[root@c7 linux]# lscpu |grep "CPU(s)"
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3
[root@c7 linux]# make -j 4 && make modules_install && make install 
##按Ctrl a, d 退出会话,使其后台运行
#------------------screen 会话 窗口 end------------

[root@c7 linux]# screen -ls
There are screens on:
	20301.make_kernel	(Detached)
	
##连接一个screen会话:查看任务状态
[root@c7 linux]# screen -r 20301.make_kernel 

##安装成功后,centos7会在/etc/grub2/grub.cfg下生成一个menuentry的条目
[root@c7 ~]# cat  /boot/grub2/grub.cfg |grep  ^menuentry
menuentry 'CentOS Linux (5.4.7) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-bbfa535e-0ced-4bad-83d1-be2900ecd4c5' {
menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-bbfa535e-0ced-4bad-83d1-be2900ecd4c5' {
menuentry 'CentOS Linux (0-rescue-a7986f397aa74c2384dac379c3367818) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-a7986f397aa74c2384dac379c3367818-advanced-bbfa535e-0ced-4bad-83d1-be2900ecd4c5' {
[root@c7 ~]# 
[root@c7 ~]# sed -i  's/(\S*)/(5.4.7)/' /boot/grub2/grubenv 
[root@c7 ~]# cat  /boot/grub2/grubenv |grep -v "#"
saved_entry=CentOS Linux (5.4.7) 7 (Core)

在这里插入图片描述

2, 内核模块管理,内核参数

#1, 查看系统已装载的模块
[root@c7 ~]# lsmod |head -5
Module                  Size  Used by
ip6t_rpfilter          12595  1 
ipt_REJECT             12541  2 
nf_reject_ipv4         13373  1 ipt_REJECT
ip6t_REJECT            12625  2 

#2, 内核模块路径存储
[root@c7 ~]# uname -r
3.10.0-957.el7.x86_64
[root@c7 ~]# ls /lib/modules/`uname -r`/kernel
arch  crypto  drivers  fs  kernel  lib  mm  net  sound  virt

[root@c7 ~]# modinfo ip6t_rpfilter
filename:       /lib/modules/3.10.0-957.el7.x86_64/kernel/net/ipv6/netfilter/ip6t_rpfilter.ko.xz
description:    Xtables: IPv6 reverse path filter match
author:         Florian Westphal <fw@strlen.de>
license:        GPL
retpoline:      Y
rhelversion:    7.6
srcversion:     7F2EAB75EFD6D085D98EB70
depends:        
intree:         Y
vermagic:       3.10.0-957.el7.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        B7:0D:CF:0D:F2:D9:B7:F2:91:59:24:82:49:FD:6F:E8:7B:78:14:27
sig_hashalgo:   sha256

#3.1, 加载/卸载模块 ( modprobe: 能自动解决依赖)
[root@c7 ~]# ls /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/cifs/
cifs.ko.xz
[root@c7 ~]# lsmod |grep cifs
[root@c7 ~]# modprobe cifs #加载模块
[root@c7 ~]# lsmod |grep cifs
cifs                  703764  0 
dns_resolver           13140  1 cifs
[root@c7 ~]# modprobe -r cifs #卸载模块
[root@c7 ~]# lsmod |grep cifs


#3.2, 加载/卸载模块 ( insmode, rmmode) : 比如要装载cifs,需要解决依赖关系
[root@c7 ~]# modinfo cifs
filename:       /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/cifs/cifs.ko.xz
description:    VFS to access servers complying with the SNIA CIFS Specification e.g. Samba 
...
depends:        dns_resolver

[root@c7 ~]# modinfo dns_resolver
filename:       /lib/modules/3.10.0-957.el7.x86_64/kernel/net/dns_resolver/dns_resolver.ko.xz
depends:        
parm:           debug:DNS Resolver debugging mask (uint)

#先装载依赖的模块, 再装载自身(不能自动解决依赖)
[root@c7 ~]# insmod /lib/modules/3.10.0-957.el7.x86_64/kernel/net/dns_resolver/dns_resolver.ko.xz
[root@c7 ~]# insmod /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/cifs/cifs.ko.xz
[root@c7 ~]# lsmod  |grep cifs
cifs                  703764  0 
dns_resolver           13140  1 cifs

#卸载模块 
[root@c7 ~]# rmmod cifs
[root@c7 ~]# lsmod  |grep cifs
[root@c7 ~]# lsmod  |grep dns_resolver
dns_resolver           13140  0 
2019-07-19 09:52:52 ming2453755227 阅读数 295

前言
详细文档

  • 1 Linux环境搭建
  • 2 boost库编译
  • 3 支持websocket协议的c++项目程序
  • 4 Linux编译websocketpp项目(动态链接boost库)
# 指定cmake的版本
cmake_minimum_required(VERSION 2.6)
# 项目名称
set (TARGET_NAME echo_server)
# 包含头文件目录
set(WEBSOCKETPP_DIR /usr/wlm/software/websocketpp/websocketpp-master)
set(BOOST_INCLUDE_DIR /usr/local/boost/include)
set(BOOST_INCLUDE_SUB_DIR /usr/local/boost/include/boost)
include_directories(. ${WEBSOCKETPP_DIR} ${BOOST_INCLUDE_DIR} ${BOOST_INCLUDE_SUB_DIR})
# 源文件目录
aux_source_directory(. DIR_SRCS)
# 用于链接的动态库
set(BOOST_LIB_DIR /usr/local/boost/lib_so)
link_directories(${BOOST_LIB_DIR})
set(LIBRARYS -lboost_chrono -lboost_system -lboost_random)
编译可执行文件
add_executable(${TARGET_NAME} ${DIR_SRCS})
链接库
target_link_libraries(${TARGET_NAME} ${LIBRARYS})
  • 5 Linux编译websocketpp项目(静态链接boost库)
# 指定cmake的版本
cmake_minimum_required(VERSION 2.6)
# 项目名称
set (TARGET_NAME echo_server)
# 包含头文件目录
set(WEBSOCKETPP_DIR /usr/wlm/software/websocketpp/websocketpp-master)
set(BOOST_INCLUDE_DIR /usr/local/boost/include)
set(BOOST_INCLUDE_SUB_DIR /usr/local/boost/include/boost)
include_directories(. ${WEBSOCKETPP_DIR} ${BOOST_INCLUDE_DIR} ${BOOST_INCLUDE_SUB_DIR})
# 源文件目录
aux_source_directory(. DIR_SRCS)
# 用于连接的静态库
set(BOOST_LIB_DIR /usr/local/boost/lib_a)
set(LIBRARYS ${BOOST_LIB_DIR}/libboost_chrono.a ${BOOST_LIB_DIR}/libboost_system.a ${BOOST_LIB_DIR}/libboost_random.a)
编译可执行文件
add_executable(${TARGET_NAME} ${DIR_SRCS})
# 链接库
target_link_libraries(${TARGET_NAME} ${LIBRARYS} -lpthread -lrt)

Linux编译websocketpp解决方案的完整文档

2018-03-12 16:16:31 WY_stutdy 阅读数 2007
一、实验目的

学习重新编译Linux内核,理解、掌握Linux内核和发行版本的区别。

 

二、实验内容

Linux操作系统环境下重新编译内核。实验主要内容:

A. 查找并且下载一份内核源代码,本实验使用最新的Linux内核2.6.36

B. 配置内核。

C. 编译内核和模块。

D. 配置启动文件。

本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36);然后,配置GNU的启动引导工具grub,成功运行编译成功的内核。

 

三、主要仪器设备(必填)

Linux环境:utuntu10.10linux内核2.6.35

待编译内核:linux2.6.36

 

四、操作方法和实验步骤

1】下载内核源代码

http://os.zju.edu.cn/newlinux/files/jijiangmin网站上下载最新的Linux内核2.6.36

 

2】部署内核源代码

打开终端,更改用户权限为root。具体做法是在终端输入sudo su,然后按提示输入密码。判断是否是root用户是使用whoami命令,若输出为root则已经切换到root账户。

输入mv linux-2.6.36.tar.gz  /usr/src,目的是把下载的内核源代码文件移到/usr/src目录。

输入cd /usr/src切换到该目录下。

输入tar zxvf linux-2.6.36.tar.gz,目的是解压内核包,生成的源代码放在linux-2.6.36目录下。

输入cd linux-2.6.36,切换到该目录下。

输入cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config,目的是使用在boot目录下的原配置文件。

 

3】配置内核

配置内核的方法很多,主要有如下几种:

#make menuconfig  //基于ncurse库编制的图形工具界面

#make config  //基于文本命令行工具,不推荐使用

#make xconfig  //基于X11图形工具界面

#make gconfig  //基于gtk+的图形工具界面

由于对Linux还处在初学阶段,所以选择了简单的配置内核方法,即make menuconfig。在终端输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。

对每一个配置选项,用户有三种选择,它们分别代表的含义如下:

<*>[*]——将该功能编译进内核

[]——不将该功能编译进内核

[M]——将该功能编译成可以在需要时动态插入到内核中的代码

本实验在make menuconfig后,把ext2ext3文件系统编译进内核。如果用户是在虚拟机下编译的,那么一般要把SCSI设备编译进内核。不是在虚拟机下编译的也可以把它编译进去,不会有什么影响的。

 

4】编译内核

这步是时间最长的一个步骤,一般在3个小时左右。

编译内核只需在终端输入make,然后等待编译的完成。

 

5】编译和安装内核模块

输入make modules_install,这步很快能完成。

 

6】安装内核

输入make install

 

7】生成启动

依次输入:

sudo mkinitramfs -o /boot/initrd.img-2.6.36

sudo update-initramfs -c -k 2.6.36

sudo update-grub2  //自动修改系统引导配置,产生grub.cfg启动文件。

 

五、实验结果和分析

把内核源代码移动到目录/usr/src,如下图

 

在成功执行语句

sudo mkinitramfs -o /boot/initrd.img-2.6.36

sudo update-initramfs -c -k 2.6.36

后的boot目录,如下图

 

在成功执行语句

sudo update-grub2

grub.cfg文件中增加了新内核的启动项,如下图

 

在所有的实验步骤成功完成后,重新启动,可以发现在启动项中多了两项,分别为Linux2.6.36模式和Linux2.6.36 recovery模式,选择Linux2.6.36模式,进入新的内核,若在启动过程中没有跳出错误提示,表示已经成功了。

进入系统后,打开终端,输入uname -a,输出如下图,表明现在已经是2.6.36的内核了

 

 

六、讨论、心得

1、本次实验,共编译了两次内核,在第一次编译时,对内核的配置这块没有把ext2ext3文件系统编译进内核,导致了编译完的内核无法成功启动。在第二次编译中,经过仔细的对内核的配置,把ext2ext3已经SCSI编译进内核,终于成功了。这让我觉得内核编译后能否成功启动的关键是内核的配置。

2、编译后的每一个步骤执行后,可以通过查看相关目录是否生成了预期的文件来判断过程的正确与否。

3Linux通过在系统引导后从/boot 目录下读取内核映像到内存中来完成启动。

4initrd.imgLinux启动过程中很重要的一个文件,如果你编译内核时将一部分功能编译为可加载模块。如果系统的一些设备的驱动编译为可加载模,那么启动时如果没有指定INITRD=/path_to_initrd.img,那么系统启动或者会失败,或者启动后会有设备无法使用(像网卡或者其 它设备)。
如果没指定initrd.img或者指定的initrd.img中并没有包含正确的驱动模块,则系统启动时会挂起,并报告“kernel panic: VFS: Unable to mount root fs on 08:06”的错误。

5grub.cfg文件保存着系统引导配置信息,记录着系统的启动项。新编译后的内核信息必须包含到该文件中,这样在系统启动时才会出现新的启动项的选项。

 

参考了linuxsir和水母的linux版的精华区,本人不保留任何版权。
经过归纳整理,看看上面的就可以了,包括补丁如何打。具体的一些选项可以往下看,一些一看就懂的白痴选项,并没有选进来,因此适合对电脑软硬件都有所了解的人参考。
基本以2.6.5内核为例,虽然2.6的内核编译有更为方便的过程,但这里还是按照最经典的方式,这样最保险。一些过程说明经过了本人的精简,相关的疑问请自行用网络搜索答案,只保证本人看的懂;)一些设置按照自己的情况调整,不要完全照搬。对于编译内核造成的损失(比如LP跑了,再也不回来),本人不负任何责任:)仅供参考。
1.download linux-2.6.5.tar.gz
2.cp linux-2.6.5.tar.gz /usr/src
3.cd /usr/src
4.mv linux linux_old
5.tar xvzf linux-2.6.5.tar.gz
bzip2 -d linux-2.6.5.tar.bz2
tar -xvf linux-2.6.5.tar
或者tar jxvf linux-2.6.5.tar.bz2
6.cd /usr/include
rm -rf asm linux scsi
ln -s /usr/src/linux/include/asm-i386 asm
ln -s /usr/src/linux/include/linux linux
ln -s /usr/src/linux/include/scsi scsi
7.cd /usr/src/linux
make mrproper (检查有无不正确的.o文件和依赖关系,使用刚下载的完整的源程序包进行编译,所以本步可以省略。而如果你多次使用了这些源程序编译内核,那么最好要先运行一下这个命令。 )
8.make config 或
make menuconfig (推荐) 或
make xconfig
选择完返回MainMenu,选择save and exit,退出配置窗口并关闭超级用户终端。现在可以退出xwindows了,回到文本环境(这样做可以加快内核编译速度)执行最后操作
9.make dep
10.make zImage
若想做成启动盘的形式可 make zdisk,若kernel大于512K,应用make bzImage (推荐)
11.make modules make modules_install depmod -a
12.cp /usr/src/linux/arch/i386/boot/zImage /boot (用的是make zImage) 或cp /usr/src/linux/arch/i386/boot/bzImage /boot (用的是make bzImage)
13.修改lilo.conf 或grub.conf(添加)
image=/boot/zImage(或bzImage)
label=new
root=…
14. lilo & grub
lilo -v 使改动生效。建议保留旧内核的项目,避免编译失败。通常 grub 配置文件在下面三个地方(根据发行版的不同):
/etc/grub.conf
/boot/grub/menu.lst
/boot/grub/grub.conf
15. shutdown -r now
如果你的 kernel 支持内存镜像,就用 mkinitrd 命令制作一个镜像文件,然后拷贝到 /boot 路径下。要这么做,也要记得在 make menu 的时候记得选择内核镜像 ram image,并且不能安装为模块,否则 initrd 就不会运作。生成映像文件,否则有时系统启动时会找不到/根分区。
mkinitrd /boot/initrd-.2.4.20-8.img 2.4.20-8
initrd.img就是initrd-2.4.20-8.img文件的链接
#ln -s initrd-2.4.20-8.img initrd.img
有的时候 mkinitrd 失败,只要加上:–without-scsi-module 就可以通过了。
把旧内核源文件下的.config文件拷贝到新内核源文件下,
如cp /usr/src/linux-2.4.22/.config /usr/src/linux-2.6.5/
然后在新内核目录下运行make oldconfig,如果想改动什么,可以
make menuconfig,但是一定要先make oldconfig。然后就编译内核,很容易:make bzImage make modules make modules_install make install
然后到/boot 看看是不是已经有新内核文件了,再看/boot/grub/grub.conf是否已经加载了新内核。shutdown -r now
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.5(新内核的bzImage的位置也有可能在/usr/src/linux/i386/下)
cp /usr/src/linux/System.map /boot/System.map-2.6.5
make clean
没有 make clean 之前,如果增加了新的模块,可以直接 make menuconfig && make moduels && make modules_install,不需要全部重新来过。如果你以后还要利用这次编译的成果,也可以省略这一步,如果你想直接删除源代码目录,也可以省略这一步。
一些升级内核前的备份过程:
cd /boot/
mv System.map System.map.old
mv vmlinuz vmlinuz.old
cd /usr/src/
ln -s linux-2.6.5 linux
进入/usr/include目录下,将asm、scsi、linux三个目录改名 
[root@localhost /usr/include]# mv asm asm.OFF 
[root@localhost /usr/include]# mv scsi scsi.OFF 
[root@localhost /usr/include]# mv linux linux.OFF 
建立指向新内核的位置到第三步中被改名的原目录 
[root@localhost /usr/include]# ln -s /usr/src/linux/include/asm-i386 asm 
[root@localhost /usr/include]# ln -s /usr/src/linux/include/scsi scsi 
[root@localhost /usr/include]# ln -s /usr/src/linux/include/linux linux
检验 # ls /boot
如果看到了 vmlinuz-2.6.0 和 System.map-2.6.0 ,那么恭喜你,成功了!
如果你是用 make install 安装的,还会看到个 config-2.6.0 文件
cd /boot/
ln -s vmlinuz-2.6.5 vmlinuz
ln -s System.map-2.6.5 System.map
(上面的两步的作用是保护真正的内核镜像不受损坏)
vmlinuz是压缩的内核二进制可执行文件
#du -sh vmlinuz-2.6.5 用来查看新的内核有多大
如果你的Kernel 配置支持Modules的话,解决那些问题是比较简单的
只要编译那些.o文件就可以啦.
比如我的声卡经常Irq 和 IO 不对, 我就到 /usr/src/linux/drivers/sound目录下
gcc -o configure configure.c
./configure
选好IO,IRQ 等等,
make
cp sound.o /lib/modules/2.0.34/misc
rmmod sound
insmod sound init_trace=1
测试一下.直到成功为止.比在 /usr/src/linux 下, make menuconfig ;
make dep;make clean;make zImage;…. 好多了.
怎么给内核打补丁?
# cd /usr/src/linux
# bzip2 -dc patch-xxx.bz2 | patch
PATCH文件拷贝到/usr/src下: 
#patch -p0 < patch-2.2.16
#gzip -cd patch-2.4.x-pre2-ac1.gz|patch -p1 -s -N -E -d 源码目录
可以使用这种方式来安装任何补丁,而不用管它的文件名了
用lsmod看当前装入的module, insmod/rmmod增删module. 对于fs,network方面的module, kernel是可以自动动态装载的(通过kerneld, 要用时自动insmod) 而对于与硬件相关的module(如网卡,SCSI卡等), 则需自己手工加入, 或用RedHat Control Panel中的kernelcfg来选择module(写于/etc/conf.modules(?), 那样则boot kernel时会自动加入
自己定制编译的内核运行更快(具有更少的代码) 
系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中) 
不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞 
将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些 
查看swap有没有打开(用free指令)。此外,最好不要超频,不然很有可能会发生signal 11的错误,使得编到一半的核心停了下来
1. Code maturity level options 
代码成熟等级。此处只有一项:prompt for development and/or incomplete code/drivers,如果你要试验现在仍处于实验阶段的功能,比如khttpd、IPv6等,就必须把该项选择为Y了;否则可以把它选择为N。 
2. Loadable module support 
Enable loadable module support:除非你准备把所有需要的内容都编译到内核里面,否则该项应该是必选的。 
Set version inFORMation on all module symbols:可以不选它。 
Kernel module loader:让内核在启动时有自己装入必需模块的能力,建议选上。 
3. Processor type and features 
High Memory Support:大容量内存的支持。可以支持到4G、64G,一般可以不选。
Math emulation:协处理器仿真。协处理器是在386时代的宠儿,现在早已不用了。 
MTTR (memory type range register)support——选择该选项,系统将生成/proc/mtrr文件对MTRR进行管理,供X server使用。同时用来启动pentinum pro和pentinum II 的特殊功能,如果你用的不是这类CPU就选N,否则也仅仅是使内核变大而已。
Symmetric multi-processing support:对称多处理支持。除非你富到有多个CPU,否则就不用选了。 
4. General setup 
一般使用缺省设置就可以了。
Networking support:网络支持。必须,没有网卡也建议你选上。 
PCI support:PCI支持。如果使用了PCI的卡,当然必选。 
PCI access mode:PCI存取模式。可供选择的有BIOS、Direct和Any,选Any吧。 
Support for hot-pluggabel devices:热插拔设备支持。
PCMCIA/CardBus support:PCMCIA/CardBus支持。
System V IPC 
BSD Process Accounting 
Sysctl support:以上三项是有关进程处理/IPC调用的,主要就是System V和BSD两种风格。如果你不是使用BSD,就按照缺省吧。 
Power Management support:电源管理支持。 
Advanced Power Management BIOS support:高级电源管理BIOS支持。 
5. Memory Technology Device(MTD) 
MTD设备支持。可不选。 
6. Parallel port support 
并口支持。如果不打算使用串口,就别选了。 
7. Plug and Play configuration 
还是选上吧,可以拔下鼠标之类的体验一下Linux下即插即用的感觉。 
8. Block devices 
Normal PC floppy disk support:普通PC软盘支持。这个应该必选。 
Mulex DAC960/DAC1100 PCI RAID Controller support:RAID镜像用的。 
Network block device support:网络块设备支持。如果想访问网上邻居的东西,就选上。 
10. Telephony Support 
Linux下可以支持电话卡,这样你就可以在IP上使用普通的电话提供语音服务了。记住,电话卡可和modem没有任何关系哦。 
11. ATA/IDE/MFM/RLL support 
这个是有关各种接口的硬盘/光驱/磁带/软盘支持的,内容太多了,使用缺省的选项吧,如果你使用了比较特殊的设备,比如PCMCIA等,就到里面自己找相应的选项吧。 
12. SCSI support 
13. Fusion MPT device support 
14. I2O device support 
需要I2O接口适配器支持,在智能Input/Output(I2O)体系接口中使用。 
15. Network device support 
网络设备支持。编译到内核里面好了,不选M了,选Y。
16. Amateur Radio support 
配置业余无线广播。 
17. IrDA(infrared)support 
红外线支持。 
18. ISDN subsystem 
如果你使用ISDN上网,这个就必不可少了。 
19. Old CD-ROM drivers(not SCSI、not IDE) 
做的可真周到,原来那些非SCSI/IDE口的光驱谁还在用啊,自己选吧,用IDE的CD-ROM不用选。 
20. Character devices 
字符设备。这个内容又太多了,先使用缺省设置,需要的话自己就修改。把大类介绍一下吧: 
I2C support:I2C是Philips极力推动的微控制应用中使用的低速串行总线协议。如果你要选择下面的Video For Linux,该项必选。 
Mice:鼠标。现在可以支持总线、串口、PS/2、C&T 82C710 mouse port、PC110 digitizer pad,自己根据需要选择。 
Watchdog Cards:虽然称为Cards,这个可以用纯软件来实现,当然也有硬件的。如果你把这个选中,那么就会在你的/dev下创建一个名为watchdog的文件,它可以记录你的系统的运行情况,一直到系统重新启动的1分钟左右。有了这个文件,你就可以恢复系统到重启前的状态了。 
21. File systems 
22. Console drivers 
控制台驱动。一般使用VGA text console就可以了,标准的80*25的文本控制台。 
23. Sound 
声卡驱动。如果你能在列表中找到声卡驱动那自然最好,否则就试试OSS了。 
24. USB supprot 
25. Kernel hacking 
配置了这个,即使在系统崩溃时,你也可以进行一定的工作了。普通用户是用不着这个功能的。 配置完后,存盘退出,当然你也可以把现在的配置文件保存起来,这样下次再配置的时候就省力气了。 接下来是编译。 
#make dep 
#make clean 
#make bzImage或make zImage 
#make modules 
#make modules_install 
#depmod -a 
make dep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要;第二命令make clean完成删除前面步骤留下的文件,以避免出现一些错误;在回答Enable loadable module support (CONFIG_MODULES)时选了”Yes”才是必要的,make modules和make modules_install分别生成相应的模块和把模块拷贝到需要的目录中。严格说来,depmod -a命令和编译过程并没有关系,它是生成模块间的依赖关系,这样你启动新内核之后,使用modprobe命令加载模块时就能正确地定位模块。 
#cp /usr/src/linux/System.map /boot/System.map-2.4.18 
#cp /usr/src/linux/arch/i386/bzImage /boot/vmlinuz-2.4.18 
#cd /boot;rm -f System.map vmlinuz 
#ln -s vmlinuz-2.4.18 vmlinuz 
#ln -s System.map-2.4.18 System.map 
如果用LILO,修改/etc/lilo.conf,添加以下项: 
image=/boot/vmlinuz-2.4.18 
label=linux240 
read-only 
root=/dev/hda2 
其中root=/dev/hda2一行要根据需要自行加以修改。 
#/sbin/lilo -v 
#shutdown -r now 
用Grub启动管理器,则添加如下几项即可。 
title Red Hat Linux (2.4.18) 
root (hd0,0) 
kernel /vmlinuz-2.4.18 ro root=/dev/hda2 
装过显卡驱动,比如Nvidia的话,你可以这样办
rpm -e NVIDIA_GLX_XXX(XXX为你的显卡驱动对应的版本号,比如我的是NVIDIA_GLX-1.0-3123)
rpm -e NVIDIA_kernel_XXXX(同上)
把以前安装的驱动删去。
rpmbuild –rebuild NVIDIA_kernel_XXXX,重新编译你的显卡驱动。编译好的放在/usr/src/redhat/RPMS/i386/下
然后安装就是了、、、
rpm -Uvh NVIDIA_kernel_XXXX.i386.rpm
rpm -Uvh NVIDIA_GLX_XXXX.i386.rpm
搞定,重起。
将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。
核心在保护空间运行,但模块并不是。这么说,并不经常使用我的设备,把它编译成只支持ext2,ide和elf。而一直使用的网卡,把其它的编译成模块:如a.out, java, floppy, iso9960, msdos, minix, vfat,smb,nfs,smcultra(ethernetcard),serial,printer,sound,ppp,等等。它们许多只是在这或那用上那么几分钟。在需要用的时候才用insmod这个指令加入核心,不用的时候也能rmmod把它从核心移除,或是用lsmod察看目前所载入的模块。这里面有三项:
#Set version information on all module symbols——通常,我们更新核心版本之后,模块耍重新的编译。这个选项使您不必更新编译模块而能使用以前的模块。可以不选它。但如果您选y,则按照它的说明,您必须有genksyms这个程序(可用whereis指令查看有无此程序)。
#Kernel module loader——让内核在启动时有自己装入必需模块的能力,建议选上。注意:在开机就会 mount 上来的 partition 的 FS 、device driver 记得要 compiler 进 kernel,不能把它弄成 modules。请不要夸张到为了完全模组化而忘了把ext2fs和IDE dirver compiler 进 kernel 里。
#System V IPC 如果将来想编译dosemu(DOS模拟器),则这个选项一定要选,它是一个让各个程序(process)同步且能彼此交换数据的函数库和一些系统的调用,没它,很多的程序将会无法执行。
#Sysctl support——除非你的内存少的可怜,否则你应该启动这个功能,启用该选项后内核会大8K,但能让你直接改变内核的参数而不必重新开机。
#Kernel support for A.OUT binaries ——a.out的执行文件是比较古老的可执行码,用在比较早期的UNIX系统上。Linux最初也是使用这种码来执行程序,一直到ELF格式的可执行码出来后,有愈来俞多的程序码随着ELF格式的优点而变成了ELF的可执码。将来势必完全取代a.out格式的可执行码。但目前由于沿有许多的程序还没有取代过来,所以只好选择Y,等将来有一天,全部的程序都变成了ELF的天下时,那时再disable掉。
#Kernel support for Linux/Intel ELF binaries ——由上所述,这个当然y哩,因为目前gcc-2.7.0以上的都有支持ELF了,如果没有选择这一项,可能会使用相当多的程序因此无法执行。为大多机器制作一张紧急启动盘,最好在386下编译,而386并不能运行在Pentium下编译的核心。不能同时把 a.out 和 ELF 支援编译成 modules,否则当你为了能够使用 insmod 而用 insmod 来载入 a.out/ELF modules 时会有 Catch/22 状况发生。如果你的系统主要是 ELF 而你偶尔会需要用到a.out,你可以把 a.out 支援编译为modules,否则你最好把它直接放入 kernel 之中。如果你还没进入 ELF 的世纪,在 compiler kernel 时可以直接把 ELF 支援去掉。
##Advanced Power Management BIOS support——高级电源管理BIOS支持。这通常是用在笔记本电脑上的东西,如果您有APM的BIOS,支持省电的设备的(有电池的那种),那么您可以选上这项,一般人这一项是选n,以避免一些可能会发生的问题。后有8个选项。
#CMD640 chipset bugfix/support—— 很多 486和 586的主机板都是用 CMD640的芯片,它是Neptune芯片和 SIS芯片的结合。不过,这种芯片有它的缺点,在许多的情形下,它会造成数据的流失和错误。如果您选了这一项,则Linux核心会为您小心的寻找这些 错误并修正它。而且,它会打开对二个IDE界面的支持。不过,在它的说明文件中提到,如果您的主机板没有PCI界面只有VESA总线界面却希望有这项功能的话,则您必须传一些 参数给核心(ideo=cmd640_vlb)。如果不确定上面所说的,选择Y。
#CMD640 enhanced support——一般来说,对于硬盘的存取速度来说,有所谓的 PIO MODES值设定,现今的 IDE界面及 BIOS应该都能侦测到正确的硬盘PIO MODE值了。此值愈高表示硬盘的存取的速度愈快。可是,有些主机板的B10S还是旧式的,不能抓到比较高的 PIO MODE值,如此一来,便不能发挥整台硬盘的效率。这个设定告诉读者说:如果您的IDE界面是CMD640为基础*1*7和586的主机板都在使用它。可以查查主机板的说明书或是 IDE接口卡的说明书做确定。文件上提到,选择这个将会降低一些速度,但是数据能百分之百的正确。
#Intel 82371 PIIX(Triton I/II) DMA support——对于586的Pentium电脑来说,有相当多的主机板都是用Intel的Triton芯片,使用这种芯片的最大好处是支持直接内存存取DMA,而节省您的CPU时间。必须您的硬盘和主机板有同时支持 DMA的 IDE界面的芯片,直接与它们做沟通而节省了大量的 CPU时间。
#Loopback device support——大部分的人这一个选项都选N,因为没有必要。但是如果你要mount iso文件的话,你得选上Y。这个选项的意思是说,可以将一个文件挂成一个文件系统。如果要烧光盘片的,那么您很有可能在把一个文件烧进去之前,看看这个文件是否符合IS09660的文件系统的内容,是否符合您的需求。而且,可以对这个文件系统加以保护。不过,如果您想做到这点的话,您必须有最新的mount程序,版本是在2.5X版以上的。而且如果您希望对这个文件系统加上保护,则您必须有des.1.tar.gz这个程序。注意:此处与网络无关。 
#Multlnle devices driver support——这个选项可以让把整个硬盘分区变成一个单独的区块设备,您必须有md035.tgz这个程序。而且在做这件事之前请将您的硬盘备份,因为它尚在测试阶段。一般人对这个选项是选N。
#Packet socket —— 选择“Y”,一些应用程序将使用Packet协议直接同网络设备通讯,而不通过内核中的其它中介协议。
#Kernel/User Network link driver——这个是在测试中的程序码,一般人不需要用。依它的说明,它允许在核心、模块或程序间的某些部分间,彼此做双向的沟通。如果想使用arpd,则这个程序码就要加进核心里。
#TCP/IP networking——选择“Y”,内核将支持TCP/IP协议。这个选项无论如何请您选择Y,即使没有网络卡,或是没有连到网络上的设备,在linux上仍有所谓的lookback设备而且有些程序需要这个选项。在说明文件中提到,如果您没有打开这个设定,则X-window system可能会有问题(回为它也需要 TCP/IP)。
#Network firewalls——选择“Y”,内核将支持防火墙。等一下有个IP firewalling的选项也要选y;但下面的forwarding/gatewaying要选n,如此才能让它正常动作。大部分的人这个选项选N。
#Network alasing——允许有多个IP地址。
#IP:forwarding/gatewaying —— 和 Firewall相反,这个选项是用来疏导网络的。一个gateway(也就是router),要帮忙疏导两个网络间的数据传送。这台机器必须要有两张网络卡,连接两个个同的网络,做疏导网络的工作。如果选择了这个选项,则表示想让这台负责做router。那么,就必须有两张网络卡了。另外有一种情形是,如果您有MODEM(通过串列界面以 SLIP和 PPP协议)和网络卡,并用它们来连上Internet。这时您也一样可以执行IP-routing服务,也需把这个选项打开。
#IP:multicasting——所谓的multicasting是群组广播,它是用在视频会议上的协议,如果想送一个网络封包(网络的数据),同样的一份数据将送往十部机器上。您可以连续送十次给十台机器(点对点的传送),也可以同时送一次,然后让十台机器同时接收到。当然后者比前者好,由于视频会议要求是最好每个人都能同时收到同一份信息,所以如果您有类似的需要,这个选项就要打开。同时您还必须去找相关的软件。
#IP: accounting——如果您打开这个选项,您就可以在/proc/net下看到系统对于整个网络状况的纪录。所以一般的人这个选项都是选y。而且,如果您设计把这台Linux机器当router用,那么读者可以因为这个选项而获得许多有关于网络lP控制的信息和它的输送情形。
#IP:aliasing support——经由这个设定,您可以拥有数个IP地址。假设您已经有一个lP地址了,您还想再加入其他的IP地址,这时,您可以依下面的程序来做。
在 shell下键入:
#ifconfig eth0:0其他的IP地址(这个IP地址不能与其他机器重复)
# route-add-host其他的IP地址 dev eth0:0 
#Probe a11 LUNs on each SCSI device——通常这个选项大部分的人都不会选。我们举个例子来说,如果您的SCSI光驱是那种多片装的,就是一台光驱,但可以一次放好几片光盘片的那种。这种我们叫做Lun。 
#Dummy net driver support——如果有SLIP或PPP的传输协议,那么要把这一项打开。因为一来它不会让您的Linux核心增大。二来,对某些应用程序来说,它可以让我们模拟出来的TCP/IP环境更像TCP/IP环境。如果您没有SLIP或PPP协议,就不用打开了。
#EQL(serial line load balancing) support——如果有两个MODEM,两条电话线,而且用SLIP或PPP协议,可以用这个Driver以便让您的MODEM有两倍的速度。当然,在网络的另一端也要有同样的设备。
#PLIP(parallel port) support——依字面上看,它是一种利用打印机的接口(平行接口),然后利用点对点来模拟TCP/IP的环境。它和 SLIP/PPP全都属于点对点通讯,您可以把两台电脑利用打印机的连接接口串联起来,然后,加入此通讯协议。如此一来,这两部电脑就等于一个小小的网络了。不过,如果电脑有提供打印服务的话,这个选项最好不要打开,不然可能会有问题(因为都是用平行接口)。
#PPP(point-to-point)support——点对点协议,近年来,PPP协议已经慢慢的取代SLIP的规定了,原因是PPP协议可以获取相同的IP地址,而SLIP则一直在改变IP地址,在许多的方面,PPP都胜过SLIP协议。
#SLIP(serial line) support——这是MODEM族常用的一种通讯协议,必须通过一台Server(叫ISP)获取一个IP地址,然后利用这个IP地址,可以模拟以太网络,使用有关TCP/IP的程序。
# EISA, VLB, PCI and on board controllers ——选择网络卡,包括直接附在主机板上的那种。如果选择y,则底下会列出其他的网络卡让您做选择,这些卡对于一般人来说很少会去用到。所以大部分的人这项是选N的。 
#Pocket and portable adaptors——通常用在可携式的电脑上,这类型的网络卡(口袋型的),由于体积很小在安装和取下方面很方便,因此笔记本相关电脑上便常常采用这种网络卡。
#Token Ring driver support——Token Ring是 IBM电脑上的网络。它叫令牌环网络,和以太网络是很类似的东西。如果您希望使用的Token Ring网络卡以便连接到这种网络,那么选Y,一般人都选N。
12. Amateur Radio support 业余无线广播
可以用来启动无线网络的基本支持,目前的无线网络可以通过公众频率传输数据,如果你有此类设备就可以启用,具体请参考AX25和HAM HOWTO 文档。
#Standard/generic (dumb) serial support——-选择“y”,内核将支持串行口。标准序列接口的选定。如果您是用serial的鼠标(大部分的人都是用这个),或是MODEM的话,则这一项一定要选。大部分的人这一项都选y。
#Support for console on serial port——选择“y”,内核可将一个串行口用作系统控制台。
##I2C support——I2C是Philips极力推动的微控制应用中使用的低速串行总线协议。如果你要选择下面的Video For Linux,该项必选。
#Mice鼠标。现在可以支持总线、串口、PS/2、C&T 82C710 mouse port、PC110 digitizer pad——根据需要选择。非串行的鼠标,支持象PS/2。看一看你鼠标的键。许多双键鼠标是PS/2,即使它们的连接看起来象串行的.。
#Digiboard PC/Xx Support——这是一张叫 Digiboard PC/XX卡的 driver,这种卡上面有很多个 serial port的插槽(一般来说只有两个),可以用来连接很多个MODEM,在民间的BBS站很常用到,如果您有这样的东西,您必须选这项为y。有兴趣的读者可以读读Documentation/digiboard.txt的内容。
#Cyclades async mux support——同上,这也是一种能接很多个serial port插槽的卡的驱动程序。
#Stallion multlport serial support——同上,这也是其中一种卡。
#SDL RISCom/8 card support——这也是其中的一个支持muti-serial卡的driver。
#Parallel printer support——有打印机的或是使用到并行接口的人这一项一定要选。除非是用serial的打印机。还有如果您有使用PLIP,那么这项也请选上。
#Mouse support——大部分的人这一项并不用选y。因为大部分的人是用serial的鼠标,除非有些人是用一种附有接口卡的鼠标,这时这个选项才要选上,如果您选y,则底下会列出您的BUS鼠标所用的接口卡。
#support for user misc device modules——除非您有所谓的触摸式显示器或是光笔等东西,否则这一项选n。
#Watchdog Timer support——一般人不需要这个选项,如果您选上这个选项,则您要用mknod在/dev下建一个watchdog的文件。请看Documentation/watchlog.txt的解释。
#Enhanced Real Time Clock Support——关于系统上Clock的东西,您必须自己用mknod在/dev/下建立一个文件叫rtc。如此一来,在/proc/下将可以看到rtc的信息。有关于rtc的内容请看Documentation/rtc.txt。一般是选n。
#Kernel automounter support——选择“y”,内核将提供对automounter的支持,使系统在启动时自动 mount远程文件系统。
#Standard( minix )——新的套件不再建立 minix 文件系统,而且很多人不使用它,但是把它配置在核心里仍然是个好主意。某些″rescue-disk ″ 程序会用到它,而且仍然有许多磁片可能用 minix 文件系统,因为 minix 文件系统对于处理磁片方面是最好的。Minix文件系统通常用在磁盘上,有时会用到它。
#Extended fs —— 这是扩充文件系统的第一版,现在已经不再使用。
#Second extented fs——这是现在新发行的套件所广泛采用的文件系统,你可能会有其中一种。这个是linux文件系统,请务必选y。
#xiafs filesystem—–这个文件系统曾经一度很普遍,但是在写这份文件时,我已经不知道有任何人在使用它了。
#umsdos: UNIX like fs on top of std MSDOS FAT fs —— 如果把Linux装进DOS的一个目录下那么您则要选择这一项。不建议这样做,因为如此一来,就不能看到长文件名了。而且效率上,井不是很好。
#ums-dos——相当 slick 的文件系统,它能使 MS-DOS 文件系统拥有更多的特性,像是长档名等等。这对那些不使用 MS-DOS 的人(像我)并不是很有用。
#System V and Coherent——这是为 System V 以及 Coherent 的分割区而设的。如果希望支持System V或Xenix的相关UNIX系统的FS并读取它们的数据,那么才有必要选这个,否则一般来说这个选项是选n的。
#Mandatory lock support——有些很特殊的database应用软件会用到它,一般人这个选项是选n。而且,如果选y的话,必须有最新版的NFS软件,最新版的samba软件等。
#NCP filesystem support——NCP是一种网络的通讯协议,用在跑IPX协议上,它可以利用IPX协议让两台电脑之间的文件共享,并做沟通。如果您想挂上有关Novell的Netware文件系统,那么这个选项就选上去吧。
#/dev/dsp and/dev/audio support—— 这个选项通常是必要的。因此大部分的人选y,如果没有这选项,则很多的游戏将没有声音效果。
#MIDI interface support——支持MIDI界面。
#I/O base for SB Check from manual of the card——声卡的I/O地址。括号是常用的选项。
#Sound Blaster IRQ Check from manual of the card—–声卡的IRQ,通常是1或5。
#Sound Blaster DMA 0,1 for 3—–声卡的DMA,通常是1。
#Sound Blaster 16 bit DMA 5, 6 or 7(usel for 8 bitcards)(SB.DMA2)—–5
##Additional low level drivers——如有其他种类的声卡,则这项要选上去,以下会列出其他的声卡供选择。
kernel profiling support(v1.3)
这个选项可以开启内核做效率统计的功能,并且会提供其他在为
系统侦错时有用的信息。这些功能会需要付出一些代价并造成系
统执行得较为缓慢,除非你正在研究内核的某个问题,否则你应
该回答N。
21. Kernel hacking安全模式 
通俗的说,这是windows安全模式,找不到明确解释,就引用这个说法。>这是从 Linus的README里摘录的:″kernel hacking ″配置的细节通常会产生一个更大或是更慢的核心(或者是又大又慢),而且可能因为将一些常式配置成很活跃地去尝试中断一些不良的程序码以便找出核心里的问题,而使得核心变得比较不稳定。所以要产生一个核心″产品 ″的话,你在这
#shutdown -r now
不建议使用热启动或ctrl+Alt+del键。在一些情况下,文件系统不完全卸栽会损坏打开的文件。如果你没看见启动提示,你可以试用shift或ctrl键,这样启动提示就出现了。一旦出现,按tab看核心标签。输入标签和可选参数启动。在机器重启后出现LILO时按TAB键,输入linux2.6.5,新内核发挥作用了。
以太网的默认值是PCI的以太网卡,对ne2000的默认支持方式是build-in,即没有设成模块,所以如果你的网卡是ISA的,那么务必要选择其中的other ISA card,最好把PCI intel pro选项去掉,另外把ne2000 support选项改成module。

 
 
 





2019-03-31 14:06:41 zsf211 阅读数 91

Linux 编译和链接程序

使用编译器gcc g++
Linux可执行程序编译步骤
1、编译c/cpp文件 ->.o
2、链接
.o文件->可执行程序

1、编译c/cpp文件
编译命令

g++ -c main.cpp
g++ -c other.cpp

以上源文件编译不分顺序。
2、链接*.o文件

g++ main.o other.o -o Demo

使用脚本一起编译和链接

#!/usr/bin/env bash
echo "Script Compile && Link Demo"
# 编译
g++ -c ../main.cpp
g++ -c ../other.cpp
# 链接
g++ main.o other.o -o Demo

echo "Clear o document"
# 清空编译中间成果物
rm -rf main.o other.o

# 编译运行成果物
./Demo
2017-09-21 22:16:38 isatiscola 阅读数 113
yum  groupinstall  “Development Tools”
yum  -y  install  openssl-devel  bc  ncurses-devel  elfutils-libelf-devel

cd ~/linux-4.10
cp /boot/config#内核版本 .config
make menuconfig

make bzImage
make modules && make modules_install
make install

LINUX编译FreeType

阅读数 23

linux 编译线程的命令

博文 来自: zhangxiaonanwin

Linux 编译 FFMPEG

阅读数 212

linux简易编译命令

阅读数 210

linux安装protobuf;编译proto文件

博文 来自: u013219624
没有更多推荐了,返回首页