标签 Linux 下的文章

在比较文件的时候,通常会用基于GUI的软件。很少有人真正会为了这个目的使用命令行工具。虽然说使用命令行来比较文件/目录并不像一件小事儿那样容易,但是如果你是一个Linux使用者,那么我想你应该知道如何通过命令行比较文件,因为一旦使用了它,你会认为它绝对是一个快速的方法。

在本篇中,我们将通过一些实例来学习如何使用diff命令。

Linux diff 命令

让我们通过一些实际的例子理解diff命令。

假设我们有两个文件(file1 和 file2):

$ cat file1
Hi,
Hello,
How are you?
I am fine,
Thank you.


$ cat file2
Hello,
Hi,
How are you?
I am fine.

你可以看见两个文件有些小的不同。现在,让我们看看diff命令如何找出两者的不同的。

像这样运行diff命令:

$ diff file1 file2
1d0
< Hi, 
2a2 
> Hi,
4,5c4
< I am fine,
< Thank you.
--- 
> I am fine.

你可以看见diff后面跟了两个文件的名字作为命令行的参数,并且它在输出中生成了差异比较。输出并不容易理解。理由是,这是被计算机使用的而不是为了人类。尽管如此,让我们一步步解码输出:

注意 – 在下面的文本中,file1和file2将被当作旧文件和新文件。

1d0
< Hi,

这里,1d0这一行意味着旧文件的第一行应该被删除(d)以使两个文件的第一行同步。旧文件中需要被删除的行以'<'标记。

2a2
> Hi,

这里,2a2行意味着新文件中的第二行应该加到旧文件的第二行后。要添加的行显示在输出的下一行用'>'标记。

4,5c4
< I am fine,
< Thank you.
---
> I am fine.

这里,4,5c4这一行意味着在旧文件中的4到5行现在已被改变并且需要用新文件中的第4行代替。添加和删除的行分别用'>'和'<'表示。

那么,来总结一下,

  • 首先diff命令的第一个参数被视为旧文件而第二个参数被视为新文件。
  • 像1d0、2a2、4,5c4这种表达式可以用语法解码为 旧文件的行号或者行的范围[新文件的行号或者行的范围]。这里的'行为'可以是追加,删除或者改变替换。
  • '<'代表删除的行,而'>'代表添加的行。

除了文件外,diff命令还可以比较两个目录。让我们通过一个例子学习。

这里是'new\_dir'目录包含的内容:

$ ls new_dir/
file file2 frnd frnd1.cpp log1.txt log3.txt log5.txt
file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt

这是'origdir'目录含有的内容:(译注:原文为and here are the contents of a directory named ‘olddir’ ,其中'old\_dir'应为笔误。)

$ ls orig_dir/
file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt test
file2 frnd frnd1.cpp log1.txt log3.txt log5.txt

下面是diff命令执行后的输出:

$ diff new_dir/ orig_dir/
Only in new_dir/: file
Only in orig_dir/: test

你可以看到当diff命令被用来比较这两个目录时,很容易就会显示两个文件中缺失的文件。

下面是一些在命令行下常用的选项:

1. 用 -i 忽略大小写

如果两个文件含有相同的文本但是大小写不同,diff命令仍会默认报告它不同。

比如:

$ cat file1
HI

$ cat file2
hi

$ diff file1 file2
1c1
< HI
---
> hi

你可以看见diff命令在输出中报告了大小写不同。

要去除这个默认行为,使用-i选项。

以下是个例子:

$ diff -i file1 file2
$

这样你可以看到没有生成输出,这是当两个文件相同时的默认行为。

2. 用 -s 选项报告两个文件相同

在例子1的后面,我们看到如果文件相同diff不会生成报告。虽然这个默认行为不错但是它仍可能会造成很大疑惑,特别对于新手而言。因此,如果你像样diff命令明确地报告两个文件不同,那么就使用-s命令选项。

来举个例子:

$ diff -is file1 file2
Files file1 and file2 are identical

你可以看到我加了-s选项在后面的例子中,这次diff命令会明确地报告两个文件是相同的。

3. 使用 -b 忽略空格

另外一个常用的是diff报告文件存在不同数量的空格。

举例说明:

$ cat file1
Hi, how are you?

$ cat file2
Hi, how are  you?

观察这两个文件唯一的不同是file2中'are'和'you'之间额外的空格。现在,当使用diff命令比较两个文件时,输出如下:

$ diff file1 file2
1c1
< Hi, how are you?
---
> Hi, how are  you?

因此你可以看到diff命令报告了不同。但是如果你想要忽略这些空格,使用 -b 选项。

$ diff -b file1 file2
$

这样你可以看到由于-b选项,diff命令报告这两个文件是相同的。

diff命令还提供了更多的命令行选项。阅读man page来获取完整的列表。


via: http://linoxide.com/linux-command/linux-diff-command-examples/

译者:geekpi 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

大多数情况下,你无需担心你的电脑温度。除非制造上的缺陷,否则硬件设计一般不会使其超过最高工作温度。但即使没有任何硬件故障,各种各样的软件问题也会导致硬件过热,例如,显卡驱动的严重bug,风扇控制程序的错误配置,CPU调频守护进程的故障,等等。

严重的过热可能会对硬件造成永久性的伤害,所以应当时刻小心系统上的任何过热问题。因此,如果有合适的温度监控系统,能在系统温度突然急速上升时,第一时间向用户发出警报,岂不美哉?

本教程,我将描述如何在Linux下监控系统温度

在Linux下有许多用户级工具可以检查和监控各种系统组件的温度。

例如lm-sensors,它可以从硬件嵌入式传感器获取信息,以达到监测温度、电压、湿度和风扇的作用;还有hddtemp,它可以通过读取S.M.A.R.T.参数来测量温度;今天我们要介绍的是psensor,这是一款前端图形化界面温度监测工具,能够可视化显示CPU、Nvidia/ATI/AMD各家显卡以及硬盘等多个硬件设备的温度。

接下来,我将描述如何设置psensor来监控CPUs和硬盘的温度。

在Linux 桌面系统中安装 psensor

使用psensor可视化显示系统温度,需要基于其他工具诸如lm-sensors和hddtemp等获得的数据。因此你需要在安装psensor的同时,一并安装这两款工具。

在Debian或Ubuntu下安装psensor:

$ sudo apt-get install lm-sensors hddtemp psensor

在Ubuntu下还可以通过PPA仓库安装最新版本的psensor:

$ sudo add-apt-repository ppa:jfi/ppa
$ sudo apt-get update
$ sudo apt-get install lm-sensors hddtemp psensor

在Fedora下安装psensor:

$ sudo yum install lm_sensors hddtemp
$ sudo yum install gcc gtk3-devel GConf2-devel lm_sensors-devel cppcheck libatasmart-devel libcurl-devel json-c-devel libmicrohttpd-devel help2man libnotify-devel libgtop2-devel make
$ wget http://wpitchoune.net/psensor/files/psensor-0.8.0.3.tar.gz
$ tar xvfvz psensor-0.8.0.3.tar.gz
$ cd psensor-0.8.0.3
$ ./configure
$ make
$ sudo make install 

这里注意,由于需要GTK3库的支持,psensor无法与搭载GNOME2桌面的CentOs或RHEL 6兼容。

在Linux中配置 psensor

在启动 psensor之前,你需要先配置lm\_sensors和hddtemp。

lm\_sensors 配置

运行以下命令,配置lm\_sensors,每一项都选择YES。

$ sudo sensors-detect 

这个命令将会探查和检测你硬件中嵌入的传感器(包括CPUs、储存控制器、I/O芯片),然后自动决定系统中哪个驱动模块需要载入并监测其温度。

一旦传感器检测完成,你需要把检测到的驱动模块添加到/etc配置中,这样它们才可以在开机时自动加载。

img

在Debian或Ubuntu下,检测到的驱动模块将会被添加到/etc/modules。在Fedora下,驱动信息会添加到/etc/sysconfig/lm\_sersors。

接下来,继续加载必要的模块,如下:

Ubuntu:

$ sudo service module-init-tools start 

Debian:

$ sudo /etc/init.d/kmod start

Fedora

$ sudo service lm_sensors start 

hddtemp 配置

你还需要启动hddtemp,监控硬盘驱动器的温度。

运行下列命令,作为一个守护进程启动hddtemp。记得把“/dev/sda”替换成你系统上的硬盘驱动器。

$ sudo hddtemp -d /dev/sda 

用 psensor 监控系统温度

要启动psensor监测温度,只需简单运行:

$ psensor 

psensor窗口将显示一个可用的传感器列表,并将传感器中读出的温度可视化显示出来。你可以选择性地启用或禁用任意一个传感器。

另外,你可以为每个传感器设置警报级别,这样当传感器温度超过某一阈值时,你就能得到通知了。

img

psensor默认使用的温度单位是“摄氏度”,最新的版本(0.7-0.8)支持在摄氏与华氏之间转换温度单位,如果你用的版本比较旧(例如0.6.x)并且不支持温度单位转换,Ubuntu用户可以通过PPA仓库来安装最新版的psensor,Debian用户则可以通过源代码来安装。


via: http://xmodulo.com/2013/11/monitor-system-temperature-linux.html

译者:Luoxcat 校对:Mr小眼儿

本文由 LCTT 原创翻译,Linux中国 荣誉推出

欢迎来到下一篇关于内核配置文章!还有大量的选项需要配置。这篇文章将主要讨论PCI和ACPI。

这里我们可以启用由ACPI控制的扩展坞和可移动驱动器槽的支持(Dock)。记住,ACPI(Advanced Configuration and Power Management Interface)是一个电源管理系统。扩展坞是一种其他的设备通过额外的接口插入的设备。扩展坞可以容纳许多不同的端口和连接器。一个ACPI控制的扩展坞是指其电源管理是通过ACPI进行的。驱动器槽是一套可以增加硬盘的设备,这也可以由ACPI管理。

下面,我们允许ACPI用来管理空闲的CPU(Processor)。这会让处理器在空闲时进入ACPI C2或者C3状态。这可以节省电源并降低CPU芯片的温度。处理器只在100%没有占用时才进入空闲状态。没有程序必须请求一个特定时间的CPU资源。

CPU电源有四个状态 - C0、C1、C2和C3。C0是操作激活状态。C1(Halt)是一个不执行指令激活状态,但是可以立刻执行指令。C2(Stop-Clock)是一种断电状态。C3(Sleep)是一种比C2更彻底的断电状态。在C3状态中,现在缓存不再被同步或者管理,直到CPU离开这个状态。第五个状态称作C1E(Enhanced Halt State),他拥有低功耗。

如果启用了IPMI驱动,那么ACPI可以访问BMC控制器(IPMI)。基板管理控制器(BMC)是一种管理软件和硬件间连接的微控制器。智能平台管理接口(IPMI)是一种框架,通过直接的硬件层面而不是登录shell或者操作系统层面来管理计算机。

ACPI v4.0进程聚合器允许内核应用一个CPU配置到所有系统中的处理器中(Processor Aggregator)。截止到ACPI v4.0,只有idle状态可以用这个方式配置。

接下来,可以启用ACPI热区(Thermal Zone)。多数硬件支持这个特性。这允许风扇的电源由ACPI管理。

如果启用这个选项,自定义DSDT可以链接到内核。在这个设置中,开发者必须在文件中包含完整的路径名。系统差异表(DSDT)是一个包含了系统支持的电源事件信息的文件。它不需要输入路径名,这些表存在于固件中。内核会帮你处理这些。这个主要的目的是用于如果开发者需要使用不同于设备内置的表时用到。

任意ACPI表都可以通过initrd来覆盖(ACPI tables override via initrd)。ACPI表是指示如何控制并与硬件交互的基础规则和指令。

像内核的其他部分一样,ACPI系统也可以生成调试信息(Debug Statements)。像其他调试特性一样,你或许希望禁用它并省下50KB。

启用下面的特性会为系统检测到的每个PCI插槽(PCI slot detection driver)创建文件(/sys/bus/pci/slots/)。一个PCI插槽是在PCI主板上的一个端口,它允许用户接上其他的PC设备。PCI是主板的一种类型。PCI是指组件互相通信的方式。有些应用程序可能需要这些文件。

电源管理定时器是另外一种电源管理系统(Power Management Timer Support)。这是许多系统追踪时间的方式。这个只需要很少的能源。处理器的空闲、电压/频率调节和节流都不会影响这个定时器。大量的系统需要使用这个特性。

下面,可以启用ACPI模块和容器设备驱动(Container and Module Devices)。这会启用处理器、内存和节点的热插拔支持。它需要NUMA系统。

下面的驱动提供对ACPI内存的热插拔支持(Memory Hotplug)。有些设备甚至启用这个驱动也不支持热插拔。如果驱动以模块形式加入,那么模块将会被acpi\_memhotplug调用。

注意:对于内核某个特定的功能,硬件、BIOS和固件在必须支持时会有问题。有些系统的BIOS是不控制硬件的。这种类型的BIOS通常不会限制特性。如果内核确实有一个特定的功能,硬件必须有能力完成这样的任务。

智能电源管理驱动提供访问电池的状态和信息(Smart Battery System)。

下面,我们有一个"Hardware Error Device"驱动。设备通过SCI报告硬件错误。通常上,大多数的错误会是已纠正的错误。

下面的是ACPI调试特性(Allow ACPI methods to be inserted/replaced at run time)。这允许ACPI AML方式不通过重启系统管理。 AML代表的是ACPI机器语言(ACPI Machine Language)。AML代码可以通过请求重启来改变和测试。

APEI是ACPI的错误接口(ACPI Platform Error Interface (APEI))。APEI从芯片给操作系统报告错误。这个错误接口同样提供错误注射的能力。

当"SFI (Simple Firmware Interface) Support" 启用后,硬件固件可以发送消息给操作系统。固件与操作系统间的通信通过内存中的静态表。SFI-only的计算机的内核工作需要这个特性。

想要改变处理器的时钟速度和运行时,就启用这个特性(CPU Frequency scaling)。CPU频率调整意味着改变处理器的时钟速度。这个驱动可以用于降低时钟频率以节能。

下面是另外一个电源管理子系统(CPU idle PM support)。当处理器不在活跃状态时,它最好处在有效的空闲方式来减少电源消耗和减少CPU损耗。减少电源消耗同样可以降低内部元件的发热。

Linux内核提供了很多CPU空闲驱动。在多处理器系统上,一些用户可能有一个理由在每个CPU上使用不同的驱动(Support multiple cpuidle drivers)。启用这个驱动可以允许用户给每个处理器设置不同的驱动。

对于Intel处理器,内核有一个特别为管理这类CPU芯片空闲的驱动(Cpuidle Driver for Intel Processors)。

当内存芯片空闲时,这些同样可以处于低功耗状态(Intel chipset idle memory power saving driver)。这个驱动是特别支持IO AT的Intel设备的。

不同的计算机使用不同类型的主板(PCI support)。其中一种类型是PCI。这个驱动允许内核运行在PCI主板上。

下面,我们可以启用/禁用 "Support mmconfig PCI config space access"。

接下来,我们有一个选择启用/禁用主桥窗口驱动(Support mmconfig PCI config space access)。警告:这个驱动还没有完成(至少在3.9.4中是这样)。

像上面提到的主板,还有另一种类型的主板。写一个选项是提供"PCI Express (PCIe) support"的驱动。PCIe是一种改进并且更快速的PCI。

在这之后,下面的驱动应该被启用以支持PCIe主板上的热插拔(PCI Express Hotplug driver)。

接着,我们可以启用/禁用PCIe主板报错(Root Port Advanced Error Reporting)。这就是PCIe AER驱动。

下一个特性允许用户使用PCIe EREC(PCI Express ECRC settings control)覆盖BIOS和固件设置。下一个选项,这是对PCIe的错误注射(PCIe AER error injector support)。

下面的设置提供了操作系统控制PCI的活跃状态和时钟电源管理(PCI Express ASPM control)。通常上,固件会控制ASPM,但是这个特性允许操作系统采取控制。

如前面一样,像内核的许多组件一样,这里提供了ASPM的调试支持(Debug PCI Express ASPM)。

下面,在这个菜单选择"Default ASPM policy"。

在这选项之后,下一个是关于允许设备驱动启消息信号中断(Message Signaled Interrupts (MSI))。通常上最好允许设备给CPU发送中断。

为了在系统日志中加入大量的调试信息,启用"PCI Debugging"。

下一个选项允许PCI核心检测是否有必要启用PCI资源重分配(Enable PCI resource re-allocation detection)。

当在Linux上托管一个虚拟操作系统时,它有时可以用于为虚拟系统保留PCI设备(PCI Stub driver)。在系统虚拟化下,一个操作系统可能在另一个系统的内部或者并行。有时它们会竞争资源。可以为客户机保留设备可以减小竞争和增加性能。

下面的驱动允许超传输设备(hypertransport devices)使用中断(Interrupts on hypertransport devices)。HyperTransport是一种系统/协议总线用于处理器之间的高速通信。

下一个驱动用于PCI虚拟化,它允许虚拟设备间共享它们的物理资源(PCI IOV support)。

PCI页面请求接口(PRI)使在IOMMU(输入/输出内存管理单元)之后的PCI设备能够从页错误中恢复(PCI PRI support)。页错误不是一种错误;它指的是软件尝试访问不在物理内存上的数据的事件。

再次说明,你会在之后的文章中看到更多的需要配置Linux内核特性。


via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-6.4457/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

当对服务器的性能好奇时,我第一个想到的是"top"命令。top不是最好的,它不是一个长期的快照,但是它提供了服务器的一个不错的时间点快照,并且试着提供了告诉"现在在发生什么?"。不幸地,如果你没有深入了解不同显示域的意义,top的输出很容易被误解。

我不会完整解读top命令的man page,当你和时间和意愿时,它一直在那等着你。我想要做的是指出一些我如何得到系统的快速概况的几个要点,并希望得到我接下来该怎么做的指示。top是我在故障排除时的第一站,但这很少会是我唯一的一站。

top命令我第一个看的是平均负载(load average),它在右上角的屏幕上。平均负载的计算是基于统计搜集到的数量,但是通常可以认为是CPU被请求工作的数量。如果你的机器有一个单核CPU,那么平均负载是1就意味着机器满载的,并且有足够的能力在采样时间内完成任务。同样地,如果平均负载是2,那对单核的CPU是超载的,并需要2个可用内核才能在同样的采样时间内完成的要求的任务。随着8、16、32核的发售,我会在判断平均负载的时候就要注意一下。比如我需要去检测时,我会在top里按了数字"1",这会列出所有CPU核列表,这样我就可以得到一个快速计数用于比较负载。

我检查的第二项是上面列出来的内容的第9列,标记着"%CPU"那个。对这一列的解释是很模糊的:

任务所分享的上次屏幕刷新后的CPU运行时间,以全部的CPU时间百分比表示。在一个真正的SMP(多处理器)环境中,如果'Irix mode'是关闭的,top会在'Solaris mode'下运行,这里一个任务的cpu使用率将除以全部的CPU数量。你可以用'I'(大写字母I)这个交互命令触发Irix或Solaris模式。

一点也不清楚,是么?这里要记住的主要意思是,如果单个进程由于某个原因或者其他因素占用率升高,那么他很有可能会以%CPU很高的数字显示在top的第一行。

我下一个注意到的区域是"Cpu(s):"这一行,在头部信息的中间。特别地,我对%us、sy%、%id、和%wa感兴趣,它们分别是用户进程、系统进程、空闲时间和CPU用于等待I/O流执行的时间比例。这个百分比应该接近于0,高于5%时需要密切关注。

最后,我想要看看系统up时间,这显示在左上角。如果我对一台服务器有疑问,并且这台服务器最近重启过,这里可能会发现一些什么,或许是一个守护进程没有启动。

这些检查只需要几秒。如果我只是观察,我可能让top运行几分钟并观察进程、CPU和负载,但是通常地我很快地进入和退出top。top是给你一个系统健康概况的那些奇妙系统管理员工具之一,并允许你快速诊断潜在的问题。


via: http://ostatic.com/blog/deciphering-top

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

如果在Linux桌面系统中你经常使用一个程序,你可能想去创建一个“桌面快捷方式”,以便于你在桌面只要点击一下快捷方式就可以启动它。虽然不少带有图形界面的程序会在安装时自动在桌面上创建快捷方式,还有一些图形界面程序或者命令行程序可能需要你手动创建快捷方式。

在这个教程里,我将告诉你如何在不同的Linux桌面上添加桌面快捷方式。(译注:其实除了作者所述的这些方法外,各种桌面上也还有更简便的方法,大家可以评论分享自己的经验)

一个桌面快捷方式是由内含该APP元信息(例如,app的名字,启动命令或者图标位置等)的.desktop文件所表示的。桌面快捷方式文件放置于/usr/share/applications或者~/.local/share/applications处。前一个目录存储的桌面快捷方式每个用户都可以使用,而后一个目录则含有仅仅为特定用户创建的快捷方式。

使用命令行创建桌面快捷方式

要为特定程序或命令创建桌面快捷方式,你可以使用任意文本编辑器创建一个.desktop文件,然后把它放到/usr/share/applications或者~/.local/share/applications处。一个典型的.desktop文件如下图所示。

[Desktop Entry]
Encoding=UTF-8
Version=1.0                                     #version of an app.
Name[en_US]=yEd                                 #name of an app.
GenericName=GUI Port Scanner                    #longer name of an app.
Exec=java -jar /opt/yed-3.11.1/yed.jar          #command used to launch an app.
Terminal=false                                  #whether an app requires to be run in a terminal
Icon[en_US]=/opt/yed-3.11.1/icons/yicon32.png   #location of icon file.
Type=Application                                #type
Categories=Application;Network;Security;        #categories in which this app should be listed.
Comment[en_US]=yEd Graph Editor                 #comment which appears as a tooltip.

除了手动创建.desktop文件之外,依据你的系统所采用的桌面环境的不同有不同的创建应用快捷方式的方法,接下来的教程我将为你讲解。

在GNOME桌面下创建快捷方式

在GNOME桌面环境下,你可以使用gnome-desktop-item-edit轻松创建创建一个桌面快捷方式。

$ gonme-desktop-item-edit ~/.local/share/applications --create-new 

在这个例子中,gnome-desktop-item-edit会在目录~/.local/share/applications中自动创建一个桌面启动器文件。若是想自定义快捷方式图标或者其它信息,你可以手动编辑.desktop文件。

如果在你的系统上,gnome-desktop-item-edit不可用(例如,在Ubuntu上),你可以依照下面方式安装:

$ sudo apt-get install --no-install-recommends gnome-panel 

在KDE桌面创建快捷方式

kickoff是KDE桌面默认的应用启动器。可以直接在kickoff里添加新的应用启动快捷方式。

首先右击位于你桌面左下角处的kickoff图标,然后选择菜单“编辑应用”。

在你要创建快捷方式的合适分类处(例如, "Utilities")右击,点击位于顶部的“新条目”按钮,键入应用的名字。

最后,填上使用快捷方式启动app时所需的元信息即可。

在xfce桌面上创建快捷方式

假如你使用xfce桌面,在桌面空白处右击,选择“创建启动器”按钮。然后填上快捷方式的详细信息就可以了。

在Cinnamon桌面上创建快捷方式

假如使用的是Linux Mint的Cinnamon桌面,你可以在桌面空白处右击鼠标,选择菜单“创建启动器”而创建一个应用启动器。

在LXDE桌面上创建快捷方式

在LXDE桌面,你只需在桌面空白处右击一下鼠标,然后选择“创建新快捷方式”就可以咯。


via: http://xmodulo.com/2013/11/create-desktop-shortcut-launcher-linux.html

译者:Linux-pdz 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux内核拥有许多可以配置的特性,接下来我们还有许多要配置。

下一个可以配置的特性是x86的随机数生成器(x86 architectural random number generator (ARCH\_RANDOM))。记住,我们现在配置的是针对AMD64系统的内核代码。这个随机数生成器使用Intel x86的RDRAND指令。这并不通用,所以为了一个更轻量的内核我禁用了它。

接着,我们可以启用或者禁用"Supervisor Mode Access Prevention (X86\_SMAP)"。这是Intel处理器使用的安全特性。SMAP在一些条件下只允许内核访问用户空间。这个有助于保护用户空间。如果启用,这里有一点性能和内核大小的开销,但是开销很小。由于我是用的是AMD系统,所以我禁用了这个特性。

开发者可以启用"EFI runtime service support (EFI)"。只有在有EFI固件的系统上启用它。拥有这个特性,内核可以使用的EFI服务。EFI是一个操作系统和硬件如何交流的规范,所以EFI固件是使用这个规范的硬件代码。因为我没有EFI固件,所以我禁用了它。

这是一个应该被启用的有用的安全方式(Enable seccomp to safely compute untrusted bytecode (SECCOMP))。这个安全特性在使用非可信的字节码的数值计算(执行大量计算的软件)中使用。字节码(可移植代码)是一种被解释器有效读取的代码。字节码不是源代码,但它也不是汇编或者二进制代码。非可信的代码是一种可能导致系统/数据损坏的代码。可能会破坏系统或者毁坏数据的非可信的代码通过seccomp被隔离在独立的地址空间中。这是通过文件描述符传输的方法。通常上,最好启用这个安全特性,即使会有一些性能开销,除非你在制作一个需要榨干性能的内核。

这里是另外一个安全特性(Enable -fstack-protector buffer overflow detection (CC\_STACKPROTECTOR))。缓冲溢出是数据被写在超出了它的内存界限而进入了邻近的内存中。这是一个安全威胁。一些恶意软件使用缓冲区溢出来破坏系统。启用这个会使用GCC选项 "-fstack-protector"。GCC是一个Linux编译器,在你配置完成后用它来编译内核。这个编译器参数会在返回地址前在栈上加入一个canary值(特殊的安全代码)。这个值会在返回前被验证。当内存溢出发生时,canary值会得到覆盖消息。这时,会导致内核崩溃。如许多人知道的那样,内核错误意味着系统将要崩溃,但是这比系统被入侵或者数据永久损害的好。发生内核错误,系统会重启,但是如果缓冲溢出则可能导致系统被入侵。一个简单的重启无法修复破坏(译注:但也不会更坏)。你必须用GCC 4.2或者更高版本支持这个参数的GCC来编译内核。

提示:要知道你使用的版本号,在命令行内键入"gcc --version"。

在这之后,我们可以配置定时器频率。配置工具建议使用250Hz,所以我们使用这个值。

Timer frequency

  1. 100 HZ (HZ\_100)
  1. 250 HZ (HZ\_250)
  1. 300 HZ (HZ\_300)
  2. 1000 HZ (HZ\_1000)

choice[1-4?]: 2

使用1000Hz通常来讲对许多系统而言太快了。定时器频率决定着定时器中断被使用的频率。这有助于在时间线上的系统操作。程序并不是随机地执行一条命令,相反它们会等到定时器中断结束。这保持着有组织和结构的处理。频率为100Hz的定时器中断之间的时间是10ms,250Hz是4ms,1000Hz是1ms。现在许多开发者会马上想到1000Hz是最好的。好吧,这取决于你对开销的要求。一个更大的定时器频率意味着更多的能源消耗和更多的能源被利用(在定时器上),产生更多的热量。更多的热量意味着硬件损耗的更快。

注意:如果某个特定的特性对你并不重要或者你不确定该选择什么,就使用配置工具选择的默认值。比如,就我现在正在配置的内核而言,使用哪个定时器对我并不重要。总的来说,如果你没有特别的原因去选择任何一个选项时,就使用默认值。

下面这个有趣的系统调用可能会对一些用户有用(kexec system call (KEXEC))。kexec调用会关闭当前内核去启动另外一个或者重启当前内核。硬件并不会关闭,并且这个调用可以无需固件的帮助工作。bootloader是不执行的(bootloader是启动操作系统的软件) 。这个重启发生在操作系统级别上而不是硬件上。使用这个系统调用会快于执行一个标准的关机或者重启,这会保持硬件在加电状态。这个系统调用并不能工作在所有系统上。为了更高性能,启用这个热启动功能。

为了使用kexec,对重启后要使用的内核使用如下命令替换""。同样,使用之前我们讲过的内核参数替换"" (我会在以后的文章中更深入的讨论。)

kexec -l --append="” 

特别地,我这里输入:

kexec -l /boot/vmlinuz-3.8.0-27-generic –append="root=/dev/sda1" 

注意:硬件有时不需要重置,所以这不依赖于kexec。

下面,我们有一个适用于kexec的调试特性(kernel crash dumps (CRASH\_DUMP))。当kexec被调用时,一个崩溃信息(crash dump)会生成。除非你有必要调试kexec,否则这个并不必要。我禁用了这个特性。

再者,我们有另外一个kexec特性(kexec jump (KEXEC\_JUMP))。kexec跳允许用户在原始内核和kexec启动的内核之间切换。

最好对内核启动地址使用默认值(Physical address where the kernel is loaded (PHYSICAL\_START) [0x1000000])。

下一个内核选项(Build a relocatable kernel (RELOCATABLE))允许内核放在内存的任何地方。内核文件会增大10%,但是超出部分会在执行时从内存移除。许多人也许想知道这为什么很重要。在2.6.20内核前,救援内核(rescue kernel)必须被配置和编译运行在不同的内存地址上。当这个特性发明后,开发者不必再编译两个内核。救援内核不会在第一个已加载的内核的地方加载,因为该块内存已被占用或者发生了错误。(如果你正在使用救援内核,那么明显第一个内核发生了错误)

下面这个特性应该在可以增加CPU数量的系统中启用,除非你有特别的理由不去这么做(Support for hot-pluggable CPUs (HOTPLUG\_CPU))。配置工具会自动启用这个特性。在这个特性下,你可以在一个拥有很多处理器的系统上激活/停用一个CPU,这并不是说在系统中插入新的CPU,所有的CPU必须已经安装在系统中。

下面的选项会让我们选择设置上面的特性是否默认启用(Set default setting of cpu0*hotpluggable (BOOTPARAM*HOTPLUG\_CPU0))。为了性能最好禁用这个特性直到需要的时候。

接着的这个调试特性允许开发者调试CPU热插拔特性(Debug CPU0 hotplug (DEBUG\_HOTPLUG\_CPU0))。我禁用了它。

为了兼容旧版本的glibc(

如果系统内核被用于一个缺乏完整功能的bootloader上,那么启用这个特性(Built-in kernel command line (CMDLINE\_BOOL))。这允许用户在内核自身上使用一条命令行(译注:及其参数),那么管理员可以修复内核问题。如果bootloader已经有了一条命令行(像grub),那么这个特性不必启用。

现在我们可以配置ACPI和电源了。首先,我们被要求选择系统是否可以挂起到内存(Suspend to RAM and standby (SUSPEND))。高级配置和电源接口(ACPI)是一种对于设备配置和电源管理的开放标准。挂起系统会将数据放在内存上,同时硬件进入一种低功耗的状态。系统不会完全关机。如果用户需要计算机进入一个低功耗的状态,但是希望保留当前已打开程序时是非常有用的。关闭一个系统会完全关闭系统电源并且清理内存。

下面,我们可以启用睡眠(Hibernation (aka 'suspend to disk') (HIBERNATION))。睡眠就像挂起模式,但是内存中所有数据被保存到硬盘上,并且设备完全关闭。这允许用户在电源恢复后继续使用他们已打开的程序。

这里,我们可以设置默认的恢复分区(Default resume partition (PM\_STD\_PARTITION))。很少有开发者和管理员需要这个特性。当系统从睡眠中恢复时,他会加载默认的恢复分区。

在这之后,我们可以启用"Opportunistic sleep (PM\_AUTOSLEEP)"。这会让内核在没有活跃的唤醒调用被调用时进入挂起或者睡眠状态。这意味着空闲的系统将会进入挂起模式以节省电源。我启用了这个特性。

接下来,是询问关于"User space wakeup sources interface (PM\_WAKELOCKS)"。启用这个特性将会允许唤醒源对象被激活、停用,并通过基于sysfs接口由用户空间创建。唤醒源对象会追踪唤醒事件源。

sysfs是位于/sys/的虚拟文件系统。这个虚拟文件系统包含了关于设备的信息。当进入/sys/时,它似乎是硬盘的一部分,但是这个并不是一个真正的挂载点。这些文件实际存在于内存中。这与/proc/是同一个概念。

注意:"/sysfs/"是一个文件夹,而"/sysfs"则可以是一个根目录下名为"sysfs"的文件。许多Linux用户会混淆这两种命名约定。

如果启用了上面的选项,那么你可以设置"Maximum number of user space wakeup sources (0 = no limit) (PM\_WAKELOCKS\_LIMIT)"。最好选择默认,那么你就可以启用垃圾收集器(Garbage collector for user space wakeup sources (PM\_WAKELOCKS\_GC))。垃圾收集是一种内存管理方式。

注意: 在需要更多内存的系统中,通常最好在大多数情况下尽可能启用垃圾收集。不然内存会消耗得更快且杂乱。

下一个电源选项关于IO设备(Run-time PM core functionality (PM\_RUNTIME))。这个选项允许IO硬件在运行时进入低功耗状态。硬件必须支持这个才行,不是所有硬件都支持。

与其他许多内核组件一样,如果启用了(Power Management Debug Support),电源管理代码同样有调试支持。我禁用了这个选项。

注意: 注意这些我引用/显示的配置工具上的选项或问题不再显示选项代码(括号间所有的大写字母)。这是因为我没有使用基于ncurses的配置工具(make menuconfig)而是使用默认工具去得到选项、设置和问题。记住,"make config"缺乏保存当前进度的能力。

在这之后,配置工具会启用"ACPI (Advanced Configuration and Power Interface) Support"。最好允许这个电源管理规范。通常配置工具会启用这个特性。

为了允许向后兼容,启用"Deprecated /proc/acpi files"。新的实现使用更新的在/sys下的实现。我禁用了这个选项。一个相似的问题询问关于"Deprecated power /proc/acpi directories"。通常上,如果你禁用了这些文件,你不再需要这些文件夹,所以我禁用了他们。一些旧的程序可能会使用这些文件和文件夹。如果你在给旧的的Linux系统上编译一个新的内核,最好启用这个选项。

下面,我们有另外一个文件接口可以启用或者禁用(EC read/write access through)。这会在/sys/kernek/debug/ec下创建一个嵌入式控制器接口。嵌入式控制器通常在笔记本中读取传感器,内核代码通过系统的BIOS表提供的ACPI代码访问嵌入式控制器。

这里有另外一个可以启用或者禁用的向后兼容特性 (Deprecated /proc/acpi/event support)。acpi守护进程可能会读取/proc/api/event来管理ACPI生成的驱动。不同于这个接口,守护进程使用netlink事件或者输入层来得到送给用户空间的事件,acpi守护进程管理ACPI事件。

下一个选项允许开发者启用一个特性,它会通知内核现在使用的是交流电源(AC Adapter)还是电池。下一个选项从/proc/acpi/battery/ (Battery)中提供电池信息。

为了内核在电源/睡眠按钮按下或者盖子合上时不同表现,启用这个“按钮”选项(Button)。这些事件在/proc/acpi/event/中控制。比如这样的行为,如果在用户账户的电源选项启用了挂起,当笔记本电脑的盖子关闭后系统将会挂起。

下一个ACPI扩展是针对显卡的(Video)。

ACPI风扇控制可以被启用/禁用(Fan)。最好启用ACPI风扇管理,这有助于节能。

我们正在进一步配置内核中,但在接下来的文章中还有更多要做。


via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-5.4424/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出