标签 随机数 下的文章

使用 urandom

使用 urandom!使用 urandom!使用 urandom

使用 urandom!使用 urandom!使用 urandom

但对于密码学密钥呢?

仍然使用 urandom

为什么不是 SecureRandom、OpenSSL、havaged 或者 c 语言实现呢?

这些是用户空间的 CSPRNG(伪随机数生成器)。你应该用内核的 CSPRNG,因为:

  • 内核可以访问原始设备熵。
  • 它可以确保不在应用程序之间共享相同的状态。
  • 一个好的内核 CSPRNG,像 FreeBSD 中的,也可以保证它播种之前不给你随机数据。

研究过去十年中的随机失败案例,你会看到一连串的用户空间的随机失败案例。Debian 的 OpenSSH 崩溃?用户空间随机!安卓的比特币钱包重复 ECDSA 随机 k 值?用户空间随机!可预测洗牌的赌博网站?用户空间随机!

用户空间的生成器几乎总是依赖于内核的生成器。即使它们不这样做,整个系统的安全性也会确保如此。但用户空间的 CSPRNG 不会增加防御深度;相反,它会产生两个单点故障。

手册页不是说使用 /dev/random 嘛?

这个稍后详述,保留你的意见。你应该忽略掉手册页。不要使用 /dev/random/dev/random/dev/urandom 之间的区别是 Unix 设计缺陷。手册页不想承认这一点,因此它产生了一个并不存在的安全顾虑。把 random(4) 中的密码学上的建议当作传说,继续你的生活吧。

但是如果我需要的是真随机值,而非伪随机值呢?

urandom 和 /dev/random 提供的是同一类型的随机。与流行的观念相反,/dev/random 不提供“真正的随机”。从密码学上来说,你通常不需要“真正的随机”。

urandom 和 /dev/random 都基于一个简单的想法。它们的设计与流密码的设计密切相关:一个小秘密被延伸到不可预测值的不确定流中。 这里的秘密是“熵”,而流是“输出”。

只在 Linux 上 /dev/random 和 urandom 仍然有意义上的不同。Linux 内核的 CSPRNG 定期进行密钥更新(通过收集更多的熵)。但是 /dev/random 也试图跟踪内核池中剩余的熵,并且如果它没有足够的剩余熵时,偶尔也会罢工。这种设计和我所说的一样蠢;这与基于“密钥流”中剩下多少“密钥”的 AES-CTR 设计类似。

如果你使用 /dev/random 而非 urandom,那么当 Linux 对自己的 RNG(随机数生成器)如何工作感到困惑时,你的程序将不可预测地(或者如果你是攻击者,非常可预测地)挂起。使用 /dev/random 会使你的程序不太稳定,但这不会让你在密码学上更安全。

这是个缺陷,对吗?

不是,但存在一个你可能想要了解的 Linux 内核 bug,即使这并不能改变你应该使用哪一个 RNG。

在 Linux 上,如果你的软件在引导时立即运行,或者这个操作系统你刚刚安装好,那么你的代码可能会与 RNG 发生竞争。这很糟糕,因为如果你赢了竞争,那么你可能会在一段时间内从 urandom 获得可预测的输出。这是 Linux 中的一个 bug,如果你正在为 Linux 嵌入式设备构建平台级代码,那你需要了解它。

在 Linux 上,这确实是 urandom(而不是 /dev/random)的问题。这也是 Linux 内核中的错误。 但它也容易在用户空间中修复:在引导时,明确地为 urandom 提供种子。长期以来,大多数 Linux 发行版都是这么做的。但不要切换到不同的 CSPRNG。

在其它操作系统上呢?

FreeBSD 和 OS X 消除了 urandom 和 /dev/random 之间的区别;这两个设备的行为是相同的。不幸的是,手册页在解释为什么这样做上干的很糟糕,并延续了 Linux 上 urandom 可怕的神话。

无论你使用 /dev/random 还是 urandom,FreeBSD 的内核加密 RNG 都不会停摆。 除非它没有被提供种子,在这种情况下,这两者都会停摆。与 Linux 不同,这种行为是有道理的。Linux 应该采用它。但是,如果你是一名应用程序开发人员,这对你几乎没有什么影响:Linux、FreeBSD、iOS,无论什么:使用 urandom 吧。

太长了,懒得看

直接使用 urandom 吧。

结语

ruby-trunk Feature #9569

现在,在尝试检测 /dev/urandom 之前,SecureRandom.random\_bytes 会尝试检测要使用的 OpenSSL。 我认为这应该反过来。在这两种情况下,你只需要将随机字节进行解压,所以 SecureRandom 可以跳过中间人(和第二个故障点),如果可用的话可以直接与 /dev/urandom 进行交互。

总结:

/dev/urandom 不适合用来直接生成会话密钥和频繁生成其他应用程序级随机数据。

GNU/Linux 上的 random(4) 手册所述......

感谢 Matthew Green、 Nate Lawson、 Sean Devlin、 Coda Hale 和 Alex Balducci 阅读了本文草稿。公正警告:Matthew 只是大多同意我的观点。


via: https://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers/

作者:Thomas & Erin Ptacek 译者:kimii 校对:wxy

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

本教程只针对 amd64/x86\_64 架构 Linux 内核版本大于等于 2.6.9 的系统。本文将解释如何安装 pandom,这是一个由 ncomputers.org 维护的定时抖动真随机数生成器。

简介

在现在的计算机状况下,比如说配置了固态硬盘(SSD)的个人电脑和虚拟专用服务器(VPS)的环境中,Linux 内核内置的真随机数发生器提供的吞吐量很低。

而出于各种不同的加密目的使得对真随机数的需求持续增长,从而使得这个低吞吐量问题在 Linux 实现中变得越来越严重。

在与上述相同的物理或者虚拟环境下,并假设没有其它进程以 root 身份向 /dev/random 进行写操作的话,64 ubits/64 bits 的 pandom 可以以 8 KiB/s 的速率生成随机数。

1 pandom 的安装

1.1 获得 root 权限

Pandom 必须以 root 身份来安装,所以在必要的时候请运行如下命令:

su -

1.2 安装编译所需的依赖

为了下载并安装 pandom,你需要 GNU as 汇编器、GNU make、GNU tar 和 GNU wget (最后两个工具通常已被安装)。随后你可以按照你的意愿卸载它们。

基于 Arch 的系统:

pacman -S binutils make

基于 Debian 的系统:

apt-get install binutils make

基于 Red Hat 的系统:

dnf install binutils make
yum install binutils make

基于 SUSE 的系统:

zypper install binutils make

1.3 下载并析出源码

下面的命令将使用 wgettar 从 ncomputers.org 下载 pandom 的源代码并将它们解压出来:

wget http://ncomputers.org/pandom.tar.gz
tar xf pandom.tar.gz
cd pandom/amd64-linux

1.4 在安装前进行测试 (推荐)

这个被推荐的测试将花费大约 8 分钟的时间,它将检查内核支持情况并生成一个名为 checkme 的文件(在下一节中将被分析)。

make check

1.5 确定系统的初始化程序

在安装 pandom 之前,你需要知道你的系统使用的是哪个初始化程序。假如下面命令的输出中包含 running,则意味着你的系统使用了 systemd,否则你的系统则可能使用了一个 init.d 的实现(例如 upstart、sysvinit)。

systemctl is-system-running
running

1.6 安装 pandom

一旦你知道了你的系统使用何种 Linux 实现,那么你就可以相应地安装 pandom 了。

使用基于 init.d 作为初始化程序(如: upstart、sysvinit)的系统:

假如你的系统使用了一个 init.d 的实现(如: upstart、sysvinit),请运行下面的命令来安装 pandom:

make install-init.d

以 systemd 作为初始化程序的系统:

假如你的系统使用 systemd,则请运行以下命令来安装 pandom:

make install-systemd

2 checkme 文件的分析

在使用 pandom 进行加密之前,强烈建议分析一下先前在安装过程中生成的 checkme 文件。通过分析我们便可以知道用 pandom 生成的数是否真的随机。本节将解释如何使用 ncomputers.org 的 shell 脚本 entropyarray 来测试由 pandom 产生的输出的熵及序列相关性。

:整个分析过程也可以在另一台电脑上完成,例如在一个笔记本电脑或台式机上。举个例子:假如你正在一个资源受到限制的 VPS 上安装 pandom 程序,或许你更倾向于将 checkme 复制到自己的个人电脑中,然后再进行分析。

2.1 获取 root 权限

entropyarray 程序也必须以 root 身份来安装,所以在必要时请运行如下命令:

su -

2.2 安装编译所需的依赖

为了下载并安装 entropyarray, 你需要 GNU g++ 编译器、GNU make、GNU tar 和 GNU wget。在随后你可以任意卸载这些依赖。

基于 Arch 的系统:

pacman -S gcc make

基于 Debian 的系统:

apt-get install g++ make

基于 Red Hat 的系统:

dnf install gcc-c++ make
yum install gcc-c++ make

基于 SUSE 的系统:

zypper install gcc-c++ make

2.3 下载并析出源码

以下命令将使用 wgettar 从 ncomputers.org 下载到 entropyarray 的源码并进行解压:

wget http://ncomputers.org/rearray.tar.gz
wget http://ncomputers.org/entropy.tar.gz
wget http://ncomputers.org/entropyarray.tar.gz

tar xf entropy.tar.gz
tar xf rearray.tar.gz
tar xf entropyarray.tar.gz

2.4 安装 entropyarray

:如果在编译过程中报有关 -std=c++11 的错误,则说明当前系统安装的 GNU g++ 版本不支持 ISO C++ 2011 标准,那么你可能需要在另一个支持该标准的系统中编译 ncomputers.org/entropy 和 ncomputers.org/rearray (例如在一个你喜爱的较新的 Linux 发行版本中来编译)。接着使用 make install 来安装编译好的二进制文件,再接着你可能想继续运行 entropyarray 程序,或者跳过运行该程序这一步骤,然而我还是建议在使用 pandom 来达到加密目地之前先分析一下 checkme 文件。

cd rearray; make install; cd ..
cd entropy; make install; cd ..
cd entropyarray; make install; cd ..

2.5 分析 checkme 文件

:64 ubits / 64 bits 的 pandom 实现所生成的结果中熵应该高于 15.977max 字段低于 70。假如你的结果与之相差巨大,或许你应该按照下面第 5 节介绍的那样增加你的 pandom 实现的不可预测性。假如你跳过了生成 checkme 文件的那一步,你也可以使用其他的工具来进行测试,例如 伪随机数序列测试

entropyarray checkme

entropyarray in /tmp/tmp.mbCopmzqsg
15.977339
min:12
med:32
max:56
15.977368
min:11
med:32
max:58
15.977489
min:11
med:32
max:59
15.977077
min:12
med:32
max:60
15.977439
min:8
med:32
max:59
15.977374
min:13
med:32
max:60
15.977312
min:12
med:32
max:67

2.6 卸载 entropyarray (可选)

假如你打算不再使用 entropyarray,那么你可以按照你自己的需求卸载它:

cd entropyarray; make uninstall; cd ..
cd entropy; make uninstall; cd ..
cd rearray; make uninstall; cd ..

3 使用 debian 的软件仓库来进行安装

假如你想在你基于 debian 的系统中让 pandom 保持更新,则你可以使用 ncomputers.org 的 debian 软件仓库来安装或者重新安装它。

3.1 获取 root 权限

以下的 debian 软件包必须以 root 身份来安装,所以在必要时请运行下面这个命令:

su -

3.2 安装密钥

下面的 debian 软件包中包含 ncomputers.org debian 软件仓库的公匙密钥:

wget http://ncomputers.org/debian/keyring.deb
dpkg -i keyring.deb
rm keyring.deb

3.3 安装软件源列表

下面这些 debian 软件包含有 ncomputers.org debian 软件仓库的软件源列表,这些软件源列表对应最新的 debian 发行版本(截至 2017 年)。

:你也可以将下面的以 # 注释的行加入 /etc/apt/sources.list 文件中,而不是为你的 debian 发行版本安装对应的 debian 软件包。但假如这些源在将来改变了,你就需要手动更新它们。

Wheezy:

#deb http://ncomputers.org/debian wheezy main
wget http://ncomputers.org/debian/wheezy.deb
dpkg -i wheezy.deb
rm wheezy.deb

Jessie:

#deb http://ncomputers.org/debian jessie main
wget http://ncomputers.org/debian/jessie.deb
dpkg -i jessie.deb
rm jessie.deb

Stretch:

#deb http://ncomputers.org/debian stretch main
wget http://ncomputers.org/debian/stretch.deb
dpkg -i stretch.deb
rm stretch.deb

3.4 升级软件源列表

一旦密钥和软件源列表安装完成,则可以使用下面的命令来更新:

apt-get update

3.5 测试 pandom

测试完毕后,你可以随意卸载下面的软件包。

:假如你已经在你的 Linux 中测试了 pandom , 则你可以跳过这一步。

apt-get install pandom-test
pandom-test

generating checkme file, please wait around 8 minutes ...
entropyarray in /tmp/tmp.5SkiYsYG3h
15.977366
min:12
med:32
max:57
15.977367
min:13
med:32
max:57
15.977328
min:12
med:32
max:61
15.977431
min:12
med:32
max:59
15.977437
min:11
med:32
max:57
15.977298
min:11
med:32
max:59
15.977196
min:10
med:32
max:57

3.6 安装 pandom

apt-get install pandom

4 管理 pandom

在 pandom 安装完成后,你可能想对它进行管理。

4.1 性能测试

pandom 提供大约 8 kB/s 的随机数生成速率,但它的性能可能根据环境而有所差异。

dd if=/dev/random of=/dev/null bs=8 count=512

512+0 records in
512+0 records out
4096 bytes (4.1 kB, 4.0 KiB) copied, 0.451253 s, 9.1 kB/s

4.2 熵和序列相关性检验

除了 ncomputers.org/entropyarray,还存在更多的测试,例如 Ilja Gerhardt 的 NIST 测试套件

entropyarray /dev/random 1M

4.3 系统服务

pandom 还可以以系统服务的形式运行。

基于 init.d 的初始化系统(如 upstart、sysvinit):

/etc/init.d/random status
/etc/init.d/random start
/etc/init.d/random stop
/etc/init.d/random restart

以 systemd 作为初始化程序的系统:

systemctl status random
systemctl start random
systemctl stop random
systemctl restart random

5 增强不可预测性或者性能

假如你想增加你编译的 pandom 程序的不可预测性或者性能,你可以尝试增加或删减 CPU 时间测量选项。

5.1 编辑源文件

请按照自己的意愿,在源文件 test.stRNG.s 中增加或者移除 measurement blocks 字段。

#measurement block
mov $35,%rax
syscall
rdtsc
[...]

#measurement block
mov $35,%rax
syscall
rdtsc
[...]

5.2 测试不可预测性

我们总是建议在使用个人定制的 pandom 实现来用于加密目地之前,先进行一些测试。

make check

5.3 安装定制的 pandom

假如你对测试的结果很满意,你就可以使用下面的命令来安装你的 pandom 实现。

make install

更多额外信息及更新详见 http://ncomputers.org/pandom

(题图:Pixabay,CC0)


via: https://www.howtoforge.com/tutorial/how-to-install-pandom-a-true-random-number-generator/

作者:Oliver 译者:FSSlc 校对:wxy

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

我们时不时给你带来关于Linux的提示与技巧。和这个系列保持一致,这里有8个我们从读者收到最有趣的提示和技巧。我们希望你喜欢它。请继续读下去。。。

以它们的大小列出文件

如果你想要一个基于它们大小排序的文件列表,你可以使用下面的命令。

它会以递减顺序排列文件。

# ls -l | grep ^- | sort -nr -k 5 | more

如果你想要递归地做相同的事,你可以使用下面的第二个命令。

# ls -lR | grep ^- | sort -nr -k 5 | more

—Sumedh Gajbhiye, [email protected]

重置奇怪的终端

如果感觉你的bash终端错误地显示垃圾的提示字符信息,并无论你输入任何命令都显示非ASCII字符-下面的命令可以让事情回到正轨。

在终端盲打输入(译注:因为你其实看不到你输入的这些字符的正确显示,不过尽管输入好了!)下面的命令并按回车:

# reset

如果那个不能修复这个问题,试一下下面的:

# stty sane

—Sudheer Divakaran, [email protected]

记录并回放终端会话

下面是一个简单的贴士来记录并回放终端回放。它通过使用命令script和scriptreplay。

这在使用终端制作教程时非常方便。

要开始记录你的终端会话,使用下面的命令:

$ script -t 2> timing.log -a output.session

接着输入:

$ ls
$touch test
.....

$ exit

这里,script命令取两个文件作为参数timing.log(它记录了每个命令执行的时间信息)和output.session(存储了命令的输出)。

现在,要回访记录的会话,使用下面所示的scriptplay。

$ scriptreplay timing.log output.session

注:timing.log和output.session可以被任何想要在自己的终端上重放会话的人使用。

—Abhishek Singh, [email protected]

使用shell脚本生成随机数

有时当你想要用shell脚本编程时,可能需要生成一个随机数来用于脚本。

这里是获得一个3位随机数的代码。

var=$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d” “ | cut -c 3-5);

这回存储随机生成的数字在名为var的变量中。

—Arpan Chavda, [email protected]

以root用户运行Linux上的软件

作为一名root用户,为了让某些不能在root身份运行的软件运行(译注:典型的是google chrome),你需要在软件的二进制文件中改变geteuid调用为getppid。

这个技术在操作系统中非常有用,比如backtrack,这里的大多数安装工作都以root用户完成。

比如:为了以root用户运行Google Chrome,使用下面的命令:

# hexedit /opt/google/chome/chrome

接着按下Ctrl+S并在16进制转储文件中搜寻geteuid字符串。用字符串getppid代替。按下Ctrl+X来保存并退出编辑器。

现在浏览器就可以以root用户运行了。

# google-chrome

—Mayank Bhanderi, [email protected]

用gzip压缩优化你的站点

压缩是一种简单、有效的方法来节约带宽和加速你的站点。在压缩的帮助下,多数站点的主页面会从100KB变成10KB。

为了在Apache Web服务器中启用这个特性,你需要在httpd.conf中包含deflate\_module,并且在Apache配置文件中加入下面的行 (/etc/httpd/conf/httpd.conf)来压缩text、html、 javascript、 css 和 xml 文件:

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

—Munish Kumar, [email protected]

在登陆时检查服务器负载信息

这里有一个贴士来在你登陆服务器的时候检查服务器平均负载。创建一个sload.sh的文本文件,内容如下:

#!/bin/bash
gh=$(uptime | awk -F, ‘{print $3}’)
echo -e “Server$gh\n”

现在,为了在登陆时检查服务器负载,通过/root/.bashrc调用sload.sh脚本。

记住如下设置脚本权限:

# chmod 755 /root/sload.sh

要调用sload.sh脚本,如下在/root/.bashrc后追加

/root/sload.sh

或者你还可以这样追加sload.sh的内容到.bashrc中。

$echo “/root/sload.sh” >> /root/.bashrc

当你完成上面的步骤后,你可以登出并再次登陆来查看服务器负载。

—Ranjith Kumar T, [email protected]

在特定时间开始你的任务

你可以使用下面的命令来在特定时间调度你的作业:

# at 2015

> >vlc /music/rockstar.mp3

这个命令会在2015小时后使用vlc播放器播放rockstar.mp3。你可以在at命令后跟上-l选项来检查挂起的作业:

# at -l

更多at命令的信息可以在man页找到。

—Manas Pradhan, [email protected]


via: http://www.efytimes.com/e1/fullnews.asp?edid=127250

译者:geekpi 校对:wxy

本文由 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中国 荣誉推出