标签 教程 下的文章

本文为你提供了一个简单的小技巧,告诉你如何用你自己图片来替换登陆窗口的背景。Ubuntu的登陆窗口挺不错的,可能比大多数发行版的都要好,但是如果你想要使用一张你自己的图片,比如一张可以让你回忆起某个特定的地方或事情的图片,你就可以按照下面的步骤来更换上它。

有许多方法可以做到这一点,这篇博文介绍的只是其中一种。下面介绍的方法可以使用dconf-editor和lightdm用户身份来完成这样的效果。简单来说就是,切换到root用户,给予lightdm用户访问x-server的权限。然后使用lightdm用户身份,运行dconf-editor,然后做出修改。

在设置完自定义图片并且重启后,每次启动电脑时你就应该能看到你设置的图片。若设置的图片是一张你非常喜欢的并且能给你带给你很多回忆的图片,那么你每次启动电脑登陆到Ubuntu时一定非常开心。

这个手册假设你已经在你的电脑上安装了dconf-editor。若没有,你可以运行以下命令来安装dconf-editor

sudo apt-get install dconf-editor 

下一步,选择你要作为登陆背景的图片。然后,记下图片的位置以及图片的名字,运行以下命令切换到root用户。

sudo –i 

下一步,运行以下命令给予lightdm用户访问X-server的权限。Lightdm是一个管理登陆窗口背景的服务程序,因此假如你要更换登陆窗口的背景图片,你就要修改lightdm用户。

xhost +SI:localuser:lightdm 

下一步,运行以下命令切换到lightdm用户

su lightdm -s /bin/bash 

然后,运行以下命令开启dconf-editor

dconf-editor 

当工具打开后,浏览到 com->canonical->unity-greeter。然后改变背景值为自定义的图盘。你可能需要勾掉draw-grid。

重启电脑,尽情享受~


via: http://www.liberiangeek.net/2013/09/daily-ubuntu-tipschange-logon-screen-background/

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

译者:Linux-pdz 校对:Caroline

OK,我们还继续配置内核。还有更多功能等待着去配置。

下一个问题(Enable ELF core dumps (ELF\_CORE))询问的是内核是否可以生成内核转储文件。这会使内核变大4KB。所以我选择了"no"。

注意:内核转储文件(内存或者系统的转储)是程序崩溃前已记录的状态。内核转储是用来调试问题的。这个转储文件的格式是ELF(Executable and Linkable Format )。

下面可以启用PC扬声器(Enable PC-Speaker support (PCSPKR\_PLATFORM))。大多数计算机用户拥有并使用扬声器,所以这个启用它。

虽然下面的特性会增加内核的大小(Enable full-sized data structures for core (BASE\_FULL))(启用完全大小的内核数据结构),但性能也随之增加。所以我选择"yes"。

为了使内核可以运行基于glibc的程序,必须启用FUTEX(Enable futex support (FUTEX))。这个特性启用了快速用户空间互斥锁(Fast Userspace muTEXes)。

注意:glibc(GNU C Library)是由GNU实现的标准C库。

注意:FUTEX (fast userspace mutex)是用来防止两个线程访问同一个不能被多个线程使用的共享资源。

下一个问题(Enable eventpoll support (EPOLL))可以通过回答"no"来禁用epoll系统调用。然而,为了含有epoll系统调用,我选择了"yes"。epoll是一种I/O事件通知系统。

为了收到来自文件描述符的信号,我们启用signalfd系统调用(Enable signalfd() system call (SIGNALFD)。

如果启用这个特性(Enable timerfd() system call (TIMERFD)),它允许程序使用定时器事件获取文件描述符。

我们现在的配置必须启用eventfd系统调用(Enable eventfd() system call (EVENTFD))。它默认启用访问共享内存文件系统(Use full shmem filesystem (SHMEM)。共享内存文件系统是一种虚拟内存文件系统。

下一个问题是"Enable AIO support (AIO)"。这个特性启用了线程化程序使用的POSIX异步I/O。

注意:异步I/O用来处理输入/输出,它允许线程在传输完成前就完成处理。

如果你正在给一个嵌入式系统配置一个内核,那么问题“Embedded system (EMBEDDED)”可以选择"yes"。否则就像我一样选择"no"。

注意:嵌入式系统是运行在一个更大的电子系统的实时计算机。

现在,我们可以配置内核性能事件和计时器了。配置工具没有给开发者选择,直接启用了事件和计数器(Kernel performance events and counters (PERF\_EVENTS))(内核性能事件和计数器)。这是一个重要特性。

接下来,我们可以禁用另外一个调试特性(ebug: use vmalloc to back perf mmap() buffers (DEBUG\_PERF\_USE\_VMALLOC))。

如果启用了VM事件计数器,那么事件计数就会显示在/proc/vmstat(Enable VM event counters for /proc/vmstat (VM\_EVENT\_COUNTERS))。如果禁用了事件计数就不会显示,/proc/vmstat只会显示内存页计数。

为了更好地支持PCI芯片,(Enable PCI quirk workarounds (PCI\_QUIRKS))回答yes。这会启用对PCI芯片的怪异行为和bug的临时解决方案。

下面一个调试特性可以像我一样禁用掉(Enable SLUB debugging support (SLUB\_DEBUG))。这个特性会耗费很多空间并且会禁用用于调试内核的SLB sysfs。如果这个特性被禁用,那么/sys/slab就不会存在并且系统上也不再支持缓冲验证。

堆随机化是一个让利用堆漏洞更加困难的特性(Disable heap randomization (COMPAT\_BRK))。然而我们不应该去启用它,因为任何基于libc5的软件都无法工作在这个系统上!只有我们有特别的理由这么做或者如果你不会使用基于libc5的软件时才去启用它。我禁用了这个特性。当编译一个通用的内核时,开发这会希望禁用这个特性。

接下来必须选择一个SLAB分配器。SLAB分配器是一个没有碎片且有效率地将内核对象放置在内存中的内存管理系统。默认选择是"2"。

Choose SLAB allocator

  1. SLAB (SLAB)
  1. SLUB (Unqueued Allocator) (SLUB)
  1. SLOB (Simple Allocator) (SLOB)

choice[1-3?]: 2

为了支持扩展性能支持,(Profiling support (PROFILING))回答"yes"。

下一个问题让开发者选择是否启用OProfile系统。它可以禁用、启用或者添加为一个模块在需要时载入。我选择禁用这个特性。

Kprobes允许用户捕捉几乎任意的内核地址去启动一个回调函数。这是一个可以像我一样禁用的调试工具(Kprobes (KPROBES))。

这个优化特性可以启用(Optimize very unlikely/likely branches (JUMP\_LABEL))(优化非常近似/不近似的分支)。这使分支预判更加简单并可以减小开销。

配置工具启用了一个实验性特性"透明用户空间探针"(Transparent user-space probes (EXPERIMENTAL) (UPROBES))。不过不要担心,系统可以很好工作,并不是所有的实验性特性是不稳定或者坏的。

接下来,我们会被询问基于gcov的内核分析(Enable gcov-based kernel profiling (GCOV\_KERNEL))。这可以被禁用。

为了允许内核加载模块,需要启用可加载模块支持(Enable loadable module support (MODULES))。

内核一般只能加载有版本号的模块。如果想允许内核加载没有版本号的模块,就启用这个特性(Forced module loading (MODULE\_FORCE\_LOAD))(强制模块载入)。这么做是一个很糟糕的注意,所以我已经禁用了它,除非你有特定的需求需要这个特性。

如果启用了这个特性(Module unloading (MODULE\_UNLOAD)),Linux内核也能卸载模块,最好启用。如果内核判断你要卸载的模块不应该被卸载,那么用户则无法卸载模块。启用强制卸载也行,但是不建议(Forced module unloading (MODULE\_FORCE\_UNLOAD)。

为了使用不是为你的内核开发的或者并不适用你的版本号的模块,可以启用版本支持(Module versioning support (MODVERSIONS))。最好不要混用不同版本号的模块,所以我禁用了这个特性。

模块在它们的modinfo(模块信息)里有一个字段名为"srcverion"。这个字段允许开发者知道使用什么源码版本来编译模块。启用这个选项可以在编译模块的时候加入这个字段。这个并不必要,所以我禁用了它(Source checksum for all modules (MODULE\_SRCVERSION\_ALL))。如果启用了先前的选项,开发者可以将校验和加入到模块中(Source checksum for all modules (MODULE\_SRCVERSION\_ALL))。

为了启用模块签名验证(Module signature verification (MODULE\_SIG)),这个选项回答"yes"。因为这个并不必要,我选择了"no",否则内核在加载模块前会检查并验证签名。

为了启用块级支持(Enable the block layer (BLOCK)),像我一样选择"yes"。禁用这个将会使块设备无法使用并且无法启用某些文件系统。

下面,SG支持已经默认启用(Block layer SG support v4 (BLK\_DEV\_BSG))(块级SG支持V4版),并且辅助库也启用了(Block layer SG support v4 helper lib (BLK\_DEV\_BSGLIB))。

下面回答的问题是关于对块设备的数据完整性支持(Block layer data integrity support (BLK\_DEV\_INTEGRITY))。这个特性允许拥有更好的数据完整性来提供设备数据保护特性。许多设备不支持这个特性,所以我禁用了它。

如果启用了块级bio带宽限制(Block layer bio throttling support (BLK\_DEV\_THROTTLING))那就可以限制设备的IO速率。

为了启用外部分区方案的支持,这个问题就回答"yes"(Advanced partition selection (PARTITION\_ADVANCED))。我禁用了这个特性。

为了启用CSCAN(译注:循环扫描)和FIFO过期请求,那就启用最后期限IO调度器(Deadline I/O scheduler (IOSCHED\_DEADLINE))。

CFQ IO调度器在处理器之间平均地分配带宽。因此启用这个特性feature (CFQ I/O scheduler (IOSCHED\_CFQ))是个好主意。

下面,开发者可以启用或禁用CFQ组支持(CFQ Group Scheduling support (CFQ\_GROUP\_IOSCHED))。接下来,开发者可以选择默认的IO调度器,最好选择DEFAULT\_DEADLINE。

对于小于32位寻址的设备,下面的特性会分配16MB的寻址空间(DMA memory allocation support (ZONE\_DMA))。如果你不使用这些设备,那么这个是可以禁用的,所以我禁用了它。

对于有多个CPU的系统,最好启用SMP(Symmetric multi-processing support (SMP))。对于只有单个处理器的设备,内核会在禁用这个特性后执行得更快。我启用了这个特性。

对于支持x2apic的CPU,启用x2apic支持support (Support x2apic (X86\_X2APIC))。如果你的系统缺乏这个特性就像我一样禁用它。

接下来我们可以启用对那些缺乏合适的ACPI支持的旧式SMP系统的MPS表(Enable MPS table (X86\_MPPARSE))。一些拥有ACPI、DSDT、MADT支持的更新的系统不需要这个特性。我禁用了它。

下面的问题允许我们启用扩展x86平台的支持(Support for extended (non-PC) x86 platforms (X86\_EXTENDED\_PLATFORM))。只有在你需要一个通用内核或者内核运行在某个特定的需要扩展支持的处理器上时才启用它。我禁用了这个特性。

为了支持Intel低功耗子系统,就启用这个特性(Intel Low Power Subsystem Support (X86\_INTEL\_LPSS))。

单一深度WCHAN输出(Single-depth WCHAN output (SCHED\_OMIT\_FRAME\_POINTER))是用来计算电量(/proc//wchan),然而这会导致更多的功耗。

下面,我们启用虚拟客户系统支持(Paravirtualized guest support (PARAVIRT\_GUEST))。这允许一个Guest操作系统与主操作系统一起运行。我会禁用这个特性。

Memtest是一个在系统启动时检测内存的软件。Memtest可以配置为每次或者有时开机运行。Memtest并不必要,所以我禁用了它。

这里我们可以选择一个内核应该支持的处理器家族。我选择了5 – Generic-x86-64。这是一个64位的系统,x86是32系统。

下面我们能选择也支持x86(32位)处理器 (Supported processor vendors (PROCESSOR\_SELECT))。

为了发现机器异常,我们可以启用DMI扫描(Enable DMI scanning (DMI)),这可以检测异常。

要启用DMA访问系统上32位内存的3GB以上的内存,下一个问题(GART IOMMU support (GART\_IOMMU))我们回答"yes"。


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

译者:geekpi 校对:wxy

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

有些时候你可能想要记录一个终端会话,也许是为了保存一个复杂的命令行操作为将来使用的参考,或者是为了知识分享。你可能也希望记录的文件尺寸尽可能的小一点,并且希望当播放记录文件时可以做一个快速回放。在这个文章中我们将讨论两个命令行工具( ttyrecttyplay )来让你记录、保存和播放终端会话。

ttyrec & ttyplay

看名字就知道ttyrec命令是用来记录终端会话的,ttyplay是用来播放ttyrec记录的会话的。

这里是这些工具的man截图:

> ttyrec

> ttyplay

测试环境

  • 系统 – Ubuntu 13.04
  • Shell – Bash 4.2.45
  • 应用 – ttyrec 1.0.8-5 & ttyplay 1.0.8-5

简明教程

下面告诉你怎么用这些命令来记录和播放一个终端会话。

步骤-1

开始记录一个终端会话,只需要运行下面的命令:

$ ttyrec [文件名] 

参数 [文件名] (上面显示的命令)是一个选项,可以指定你想要的任何名字。这个记录文件将会用这个名字保存下来。如果你没有指定一个文件名,ttyrec就会用 ttyrecord 作为缺省文件名。

步骤-2

当你想要记录的时候你就可以运行这个命令,就开始记录会话了。ttyrec命令甚至可以记录命令行类似vi,nano,emacs,lynx等这些命令行工具的会话。

步骤-3

到你想要结束终端会话的时候,只需要运行 exit 命令,这个会话记录就会结束。记录文件将会保存在当前文件夹下。

你可以运行下面的命令播放这个文件:

$ ttyplay [文件名] 

参数 [文件名] 就是记录文件名,就是上面通过 ttyrec 命令给定参数的那个名字。如果没有指定文件名,那么缺省文件名就是 ttyrecord

当你运行ttyplay,回放会话记录就会开始。这里给出一些当你回放会话的时候你可以用的快捷键。

  • ‘+’或‘f’键可以加速到两倍正常播放速度。
  • ‘-’或‘s’键可以减慢到一般正常播放速度。
  • ‘0’可以暂停。
  • ‘1’可以回到正常播放速度。

这有一些其它ttyrec和ttyplay命令支持的选项:

> ttyrec

ttyplay

还有另一个小工具 ttytime 可以用来显示用ttyrec工具会话记录的时间。很容易使用并且只需要记录文件名作为命令行参数。

举一个例子:

$ ttytime record_file
 29 record_file 

这样你就可以看到ttytime命令显示会话记录文件record\_file的时间。

这有一个ttyrec和ttyplay命令的很有用的视频:

下载/安装/配置

这有一些关于这些工具的重要的链接:

你可以使用任何命令行下载管理器比如apt-get或者yum来下载ttyrec,ttyplay和ttytime。Ubuntu用户也可以通过Ubuntu软件中心下载安装这些工具。

优点

  • 轻量级并且易用
  • 可以记录多种流行的命令行工具比如vi,nano,lynx等
  • 没有学习曲线。

缺点

  • 不能在IRIX6.4下工作(译注:这还算事吗?)
  • 依赖终端尺寸
  • 大多数Linux发行版没有预装。

结论

如果你正在找一些Linux轻量级命令行工具用来记录播放终端会话,那么ttyrec和ttyplay是理想的工具。我真的喜欢使用它们带来的轻松。试一下这些工具,你不会失望的。

你使用过ttyrec,ttyplay或者其它的终端记录/播放 工具?分享你的经历给我们吧。


via: http://mylinuxbook.com/ttyrec-ttyplay-record-and-play-terminal-sessions-in-linux/

译者:flsf 校对:wxy

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

qBittorrent是一个由志愿者开发的自由开源的跨平台BT客户端软件,利用libtorrent-rasterbar库,由C++/Qt写成,是现在流行的BT客户端软件µtorrent的一个替代选择。最新的版本qBittorrent 3.1.0 已经在2013年10月份放出。

qBittorrent轻巧快速,支持unicode编码,而且提供一个完美整合的搜索引擎。它也支持UPnP端口转发和NAT-PMP、加密(兼容Vuze)、FAST扩展和PeX支持(兼容utorrent)。

qBittorrent v3.1.0 的特性

  • 精心雕琢的类µTorrent界面(译注:至少我觉得LOGO就很精致)
  • 完美整合的搜索引擎,并可扩展
  • 在众多著名BT网站中进行并发搜索
  • 对搜索请求进行预分类(例如,书籍,音乐,电影)
  • 支持各种Bittorrent扩展
  • 可通过web页面进行远程操作
  • Web界面很接近桌面客户端,采用AJAX操作
  • 可对trackers、peers 和 torrents进行高级控制
  • 连接排队和优选
  • Torrent内容筛选和优先级设置
  • 支持UPnP / NAT-PMP端口转发
  • 支持大约25中语言(支持Unicode)
  • 种子创建工具
  • 支持RSS过滤下载(例如正则表达式)
  • IP过滤(兼容eMule和PeerGuardian)
  • 兼容IPv6
  • 顺序下载(也可以叫做按数字顺序下载)
  • 支持各种平台: Linux,Mac OS X, Windows, OS/2, FreeBSD

安装qBittorrent

$ sudo add-apt-repository ppa:hydr0g3n/qbittorrent-stable 
$ sudo apt-get update && sudo apt-get install qbittorrent 

你也可以下载qbittorrent的源代码,然后编译后安装。


via: http://www.unixmen.com/install-qbittorrent-3-1-0-ubuntu-via-ppa/

译者:Linux-pdz 校对:wxy

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

Pmap 提供了进程的内存映射,pmap命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息。Pmap实际上是一个Sun OS上的命令,linux仅支持其有限的功能。但是它还是对查看完整的进程地址空间很有帮助。我们需要PID或者运行的进程的唯一进程ID来查看进程内存状态,我们可以通过/proc或者常规命令比如top或ps得到它。

语法或用法

#pmap PID 

或者

#pmap [options] PID 

在输出中它显示全部的地址,kbytes,mode还有mapping。

选项

  • -x extended显示扩展格式
  • -d device显示设备格式
  • -q quiet不显示header/footer行
  • -V 显示版本信息

单一进程内存状态

[root@info ~]# pmap 1013


1013: /usr/sbin/sshd
00110000 1480K r-x- /usr/lib/libcrypto.so.1.0.0
00282000 80K rw-- /usr/lib/libcrypto.so.1.0.0
00296000 12K rw-- [ anon ]
00299000 36K r-x- /lib/libkrb5support.so.0.1
002a2000 4K rw-- /lib/libkrb5support.so.0.1
002a3000 16K r-x- /lib/libplc4.so
002a7000 4K rw-- /lib/libplc4.so
002ab000 88K r-x- /lib/libaudit.so.1.0.0
002c1000 4K r-- /lib/libaudit.so.1.0.0
002c2000 4K rw-- /lib/libaudit.so.1.0.0
002c3000 216K r-x- /lib/libgssapi_krb5.so.2.2
002f9000 4K rw-- /lib/libgssapi_krb5.so.2.2
002fa000 808K r-x- /lib/libkrb5.so.3.3
003c4000 24K rw-- /lib/libkrb5.so.3.3
003ca000 152K r-x- /lib/libk5crypto.so.3.1
003f0000 4K rw-- /lib/libk5crypto.so.3.1
003f1000 92K r-x- /usr/lib/libnssutil3.so
00738000 4K r--- /lib/libresolv-2.12.so
00739000 4K rw-- /lib/libresolv-2.12.so
0073a000 8K rw-- [ anon ]
00825000 120K r-x- /lib/ld-2.12.so
00843000 4K r--- /lib/ld-2.12.so
00844000 4K rw-- /lib/ld-2.12.so
0090d000 32K r-x- /lib/libwrap.so.0.7.6
00915000 4K rw-- /lib/libwrap.so.0.7.6
00948000 484K r-x- /usr/sbin/sshd
009c1000 8K rw-- /usr/sbin/sshd
009c3000 20K rw-- [ anon ]
009e0000 92K r-x- /lib/libpthread-2.12.so
009f7000 4K r--- /lib/libpthread-2.12.so

total 8232K

多进程内存状态

我们可以检查多进程内存通过插入多个PID。加入多个PID中间使用空格分隔。

pmap 1013 1217 1118 

扩展进程内存

[root@info ~]# pmap -x 1013
1013: /usr/sbin/sshd
Address Kbytes RSS Dirty Mode Mapping
00110000 1480 92 0 r-x- libcrypto.so.1.0.0
00282000 80 80 80 rw-- libcrypto.so.1.0.0
00296000 12 8 4 rw-- [ anon ]
00299000 36 0 0 r-x- libkrb5support.so.0.1
002a2000 4 4 4 rw-- libkrb5support.so.0.1
002a3000 16 0 0 r-x- libplc4.so
002a7000 4 4 4 rw-- libplc4.so
002ab000 88 4 0 r-x- libaudit.so.1.0.0
002c1000 4 4 4 r--- libaudit.so.1.0.0
002c2000 4 4 4 rw-- libaudit.so.1.0.0
002c3000 216 4 0 r-x- libgssapi_krb5.so.2.2
002f9000 4 4 4 rw-- libgssapi_krb5.so.2.2
002fa000 808 4 0 r-x- libkrb5.so.3.3
003c4000 24 24 24 rw-- libkrb5.so.3.3
003ca000 152 4 0 r-x- libk5crypto.so.3.1
003f0000 4 4 4 rw-- libk5crypto.so.3.1
003f1000 92 0 0 r-x- libnssutil3.so
00408000 12 12 12 rw-- libnssutil3.so
0040b000 12 0 0 r-x- libplds4.so
0040e000 4 4 4 rw-- libplds4.so

--- --- --- --- ---
total kB 8232 - - -

这里的Address,Kbyte,Dirty,RSS,mode还有mapping的说明如下

扩展和设备格式区域

  • Address: 内存开始地址
  • Kbytes: 占用内存的字节数(KB)
  • RSS: 保留内存的字节数(KB)
  • Dirty: 脏页的字节数(包括共享和私有的)(KB)
  • Mode: 内存的权限:read、write、execute、shared、private (写时复制)
  • Mapping: 占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)
  • Offset: 文件偏移
  • Device: 设备名 (major:minor)

via: http://linoxide.com/linux-command/pmap-command/

译者:flsf 校对:wxy

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

这一部分我们讲配置内核IRQ子系统。中断请求(IRQ)是硬件发给处理器的一个信号,它暂时停止一个正在运行的程序并允许一个特殊的程序占用CPU运行。

这个目录中的第一个问题属于内核特性(Expose hardware/virtual IRQ mapping via debugfs (IRQ\_DOMAIN\_DEBUG))(通过debugfs来显示硬件/虚拟的IRQ映射),它询问是否可以使用虚拟的调试文件系统来映射硬件及Linux上对应的IRQ中断号。这个用作调试目的,大多数用户不需要用到,所以我选择了"no"。

下一个标题显示"Timers subsystem"(计时器子系统)。第一个有关定时器子系统的问题是“Tickless System (Dynamic Ticks) (NO\_HZ)”(无滴答系统)。我选择了“yes”,这会启用一个无滴答系统。这意味着定时器中断将会按需使用,定时器中断允许任务以特定的时间间隔执行。下一个问题(High Resolution Timer Support (HIGH\_RES\_TIMERS))问是否支持高精度定时器。并不是所有的硬件支持这个,通常地说,如果硬件很慢或很旧,那么选择"no",否则像我一样选择"yes"。

下一个标题"CPU/Task time and stats accounting"(CPU/任务用时与状态统计),这个是关于进程的追踪。第一个问题看上去像这样:

Cputime accounting (CPU用时统计)

  1. Simple tick based cputime accounting (TICK\_CPU\_ACCOUNTING) (简单基于滴答的用时统计)
  2. Full dynticks CPU time accounting (VIRT\_CPU\_ACCOUNTING\_GEN) (NEW) (全动态滴答的用时统计)
  3. Fine granularity task level IRQ time accounting (IRQ\_TIME\_ACCOUNTING) (细粒度的任务级IRQ用时统计)

TICKCPUACCOUNTING会在每个CPU滴答中检测/proc/stat。这是默认的选项,这个记账方法非常简单。

注意:CPU滴答是抽象测量CPU时间的方式。每个处理器、操作系统和安装的系统都不同,比如说,一个更强大的处理器会比老的处理器拥有更多的CPU滴答。如果你安装了一个Linux系统,然后接着在同一块磁盘上重新安装了它,你可能会得到一个更快或更慢的CPU滴答时间(至少一些计算机技术书上这么说)。通常来讲,一个更快的时钟速度意味着更多的CPU滴答。

如果启用了VIRT\_CPU\_ACCOUNTING\_GEN,任务和CPU时间统计将由监视内核-用户边界实现。这个选择的代价是会增加额外的开销。

IRQ\_TIME\_ACCOUNTING记账方式则通过检测IRQ状态间的时间戳工作,这个性能开销很小。

我选择了"1"并被询问有关BSD记账"BSD Process Accounting (BSD\_PROCESS\_ACCT)"(BSD进程记账)的问题。这个内核特性会记录每个进程不同的关闭信息。为了得到一个更小和更快的内核,我选择了"no".

下一组问题看上去就像下面这样。

  • Export task/process statistics through netlink (TASKSTATS) (通过netlink导出任务/进程统计数据)
  • Enable per-task delay accounting (TASK\_DELAY\_ACCT) (启用针对每个任务的延迟统计)
  • Enable extended accounting over taskstats (TASK\_XACCT) (启用taskstats的扩展统计)

TASKSTATS使内核可以通过网络套接字导出进程统计。网络套接字是内核和用户空间进程间IPC通信的一种形式。TASKDELAY*ACCT监视进程并注意资源访问的延迟。比如,TASKDELAY*ACCT可以看到X进程正在为了CPU时间而等待,如果TASK\_DELAY\_ACCT观察到进程已经等待了太长时间,这个进程接着就会被给予一些CPU时间。TASK\_XACCT会收集额外的统计数据,为了更小的内核负载我会禁用这个。

现在接下来的目录就会显示RCU子系统:读取-复制-更新子系统是一种低负载的同步机制,它允许程序查看到正在被修改/更新的文件。配置工具已经回答了第一个问题。

RCU Implementation (RCU 实现方式)

  1. Tree-based hierarchical RCU (TREE\_RCU) (树形分层结构的RCU)

choice[1]: 1

这里就选择“1”。除了TREE\_RCU,还有classic RCU(更老的实现)。下一个问题(Consider userspace as in RCU extended quiescent state (RCU\_USER\_QS) [N/y/?])(是否在用户空间记录扩展的quiescent状态)问RCU是否可以在CPU运行在用户空间时设置一个特殊的quiescent状态。这个选项通常被禁用,因为这会增加太多消耗。下面是另一个RCU问题(Tree-based hierarchical RCU fanout value (RCU\_FANOUT) [64])(树形分层结构的RCU端点数),问的是关于端点数。下一个问题(Tree-based hierarchical RCU leaf-level fanout value (RCU\_FANOUT\_LEAF) [16])(树形分层结构的RCU叶级端点数),是另外一个关于端点数的问题,但它只处理叶级。还有另外一个RCU问题(Disable tree-based hierarchical RCU auto-balancing (RCU\_FANOUT\_EXACT) [N/y/?])(是否禁用树形分层结构的RCU的自动平衡),询问是否禁用RCU自动平衡树,而采用上述的端点数。

接下来,配置脚本将会询问"Accelerate last non-dyntick-idle CPU's grace periods (RCU\_FAST\_NO\_HZ)"(加速最后的非dyntick-idle CPU的RCU宽限期)。在这之后会显示"Offload RCU callback processing from boot-selected CPUs (RCU\_NOCB\_CPU)"(从选择引导的CPU里面卸载RCU回调)。(译注:此处作者没做解释。前一个能够节省电力,但是降低了性能;后一个用于调试。)

下一个问题非常重要(Kernel .config support (IKCONFIG))(内核的.config支持)。开发人员可以选择保存由这个配置工具生成的设置到一个文件中。这个文件可以放在内核中,也可在一个模块中,或者完全不保存。这个文件可以被想要编译一个完全跟某人相同内核的开发者使用。这个文件还可以帮助开发人员使用一个更新的编译器重新编译一个内核。举例来说,开发人员配置并编译了一个内核,然而编译器有一些bug,但开发人员仍然需要一个使用这些设置的内核。而值得庆幸的是,开发人员可以升级他们的编译器,并使用设置文件来节省他们重新配置内核的时间。开发人员也可以在另一台计算机上保存源代码和配置文件并编译内核。至于另一个目的,开发人员可以加载该文件,并根据需要调整设置。我选择保存配置文件在一个模块中,这个问题 "Enable access to .config through /proc/config.gz (IKCONFIG\_PROC)"(启用通过/proc/config.gz来访问.config的功能)是询问这个文件是否是可以通过这次方式访问的,我选择了"yes"。

下一个问题是内核使用多大的log缓冲区(Kernel log buffer size (16 => 64KB, 17 => 128KB) (LOG\_BUF\_SHIFT) [17])(内核日志缓冲区大小)。小的缓冲区意味着它无法像更大的缓冲区那样保持日志更长的时间。这个选择取决于开发者想要日志保持的时间,我选择的是"12"。

接着,出现了另外一个问题。该问题询问关于是否启用NUMA(非一致性内存访问)的内存/任务的均衡(Automatically enable NUMA aware memory/task placement (NUMA\_BALANCING\_DEFAULT\_ENABLED))(自动启用NUMA的内存/任务均衡)。如果在NUMA的机器上设置了该选项,那么NUMA自动平衡就会启用。在NUMA下,处理器可以比非本地内存(内存分配给另外一个处理器或在处理器之间共享的内存)更快地访问它的本地内存。如果上面启用了(我启用了),那么最好对这个问题"Memory placement aware NUMA scheduler (NUMA\_BALANCING)"(由NUMA调度器进行内存分配)回答"yes",这是一个NUMA调度器。

在新的标题"Control Group support"(Cgroup支持)下,因为先前的选择,"Control Group support (CGROUPS)"(Cgroup支持)被自动地回答了"yes"。

以下设定(Example debug cgroup subsystem (CGROUP\_DEBUG))(导出Cgroup子系统的调试信息)是启用一个用于调试cgroup框架的一个简单cgroup子系统。下一个选项(Freezer cgroup subsystem (CGROUP\_FREEZER))(冻结Cgroup子系统)可以让程序员可以冻结或解冻cgroup内的任务。

注意:cgroup是一组进程。

下面我们要求回答"Device controller for cgroups (CGROUP\_DEVICE)"(Cgroup的设备控制器)。cgroup(控制组)是一种用来控制资源使用的特性。回答"yes"可以允许设备cgroup的白名单可以使用open和mknod系统调用(用来创建文件系统节点的系统调用)。

下一个问题(Cpuset support (CPUSETS))(CPU分组支持)询问的是内核是否可以创建和管理CPU分组。这允许管理员可以在一个系统上动态分配各组内存节点,并分配任务在这些内存上运行。这通常用于SMP和NUMA系统中。我这个问题回答的是"no"。

注意:请记住,如果我没有指定我选的是什么,那么我选的就是默认选项。

启用cgroup统计子系统(Simple CPU accounting cgroup subsystem (CGROUP\_CPUACCT))(Cgroup子系统的简单CPU统计)会生成一个资源控制器来监控在一个cgroup组内的独立任务的CPU使用情况。我选择了"no"。

资源计数器(Resource counters (RESOURCE\_COUNTERS))使控制器的独立资源统计功能能够统计cgroup。我选择了"no"。

下一个问题(Enable perf\_event per-cpu per-container group (cgroup) monitoring (CGROUP\_PERF))(启用每个CPU、每个容器组的pref\_event监控)允许开发者扩展每个CPU的模式,使它可以只监控运行在特定CPU上的一个特别的cgroup组的线程。

下一章节是"Group CPU Scheduler"(CPU分组调度器)。前两个已经回答的问题包括:

Group CPU scheduler (CGROUPSCHED)(CPU分组调度器) Group scheduling for SCHEDOTHER (FAIR*GROUP*SCHED)(SCHED\_OTHER分组调度)

第一个已回答的问题(CPU bandwidth provisioning for FAIR\_GROUP\_SCHED (CFS\_BANDWIDTH))(CPU带宽分配)询问的是内核是否允许用户设置在公平组调度器内执行的任务的CPU带宽限制。没有限制的组会被认为不受约束,并会没有限制地运行。

注意:并不是所有内核选项都在这里。我这里提到的组只是为了便于阅读,并挑出那些新的和大的部分。并不需要了解所有的分组。分组有助于使用图形工具配置内核,这样开发者可以在搜索特定的设置时,直接通过分组菜单找到。

开发者可以通过回答"Group scheduling for SCHED\_RR/FIFO (RT\_GROUP\_SCHED)"(SCHED\_RR/FIFO分组调度)这个问题为"yes"来让用户可以分配CPU带宽到任务组中。

下一个问题是"Block IO controller (BLK\_CGROUP)"(阻塞IO控制器)。任务组可以被识别,并且它们的磁盘带宽是由使用块IO控制器实现的CFQ IO调度器分配的。BIO在块级的限制逻辑使用块IO控制器来提供设备上的IO速率上限。

这里有一个调试问题(Enable Block IO controller debugging (DEBUGBLKCGROUP) [N/y/?])(启用阻塞IO控制器的调试)询问是否启用块IO控制器的调试。为了制作一个精简的内核,最好禁用这个特性。

为了启用内核中的检查点和还原特性。这个问题“Checkpoint/restore support (CHECKPOINT\_RESTORE)”(检查点及还原支持)可以选择“yes”,不过为了更低的负载这里我选择了“n”。启用这个特性会增加辅助的进程控制代码来设置进程的代码段、数据段和堆的大小,并增加了一些额外的程序入口。

下面我们就要配置命名空间的支持了。命名空间是一组标识符的容器。比如,/usr/lib/python3/dist-packages/re.py就是一个标识符,/usr/lib/python3/dist-packages/就是一个命名空间。而re.py是这个命名空间下的本地名称。

第一个命名空间问题(Namespaces support (NAMESPACES))询问的是是否启用命名空间。这允许可以使用相同的PID但在不同的命名空间内(译注:原文为" This will allow the same PIDs (Process ID) to be used but indifferent namespaces",这里indiffernt根据上下文应该是少了空格),否则PID永远不会重复。

下一个问题(UTS namespace (UTS\_NS))询问是否可以让UTS命名空间内的任务可以在uname()系统调用中看到不同的信息。uname()系统调用提供查看机器和操作系统的信息。

启用IPC命名空间(IPC namespace (IPC\_NS))将允许在这个命名空间内的任务与其他命名空间内相对应IPC ID的对象协同工作。

PID命名空间(PID Namespaces (PID\_NS))就是进程ID命名空间。这可以使不同的进程在不同的PID命名空间使用相同的PID。这是一个容器的构建块。

接下来,启用网络命名空间(Network namespace (NET\_NS))可以使用户创建一个拥有多个实例的网络栈。

当启用后,自动进程分组调度(SCHED\_AUTOGROUP)会填充并创建任务组来优化桌面程序的调度。它将把占用大量资源的应用程序放在它们自己的任务组,这有助于性能提升。

这里是一个调试特性,除非你有特别的需求否则应该禁用它。这个问题(Enable deprecated sysfs features to support old userspace tools (SYSFS\_DEPRECATED))(启用不推荐的sysfs功能来支持旧式的用户空间工具)询问是否启用sysfs,这是调试内核时用的虚拟文件系统。

接下来,因为当前的配置需要它,所以"Kernel->user space relay support (formerly relayfs) (RELAY)"(内核->用户空间的中继支持,即relayfs)已经被设成"yes"了。最好启用initrd支持(Initial RAM filesystem and RAM disk (initramfs/initrd) support (BLK\_DEV\_INITRD))(初始化内存文件系统和内存盘(initramfs/initrd))。

用户会被问及哪里放置initramfs源文件。如果没有需要,请留空。

接下来,开发人员会被询问关于初始虚拟磁盘(Linux的内核映像文件)所支持的压缩格式。你可以启用所有支持的压缩格式。

  • Support initial ramdisks compressed using gzip (RD\_GZIP)
  • Support initial ramdisks compressed using bzip2 (RD\_BZIP2)
  • Support initial ramdisks compressed using LZMA (RD\_LZMA)
  • Support initial ramdisks compressed using XZ (RD\_XZ)
  • Support initial ramdisks compressed using LZO (RD\_LZO)

这里设置了内核的编译内核编译选项(Optimize for size (CC\_OPTIMIZE\_FOR\_SIZE))(优化大小)。开发者可以让编译器在编译时优化代码。我选择了"yes"。

用户想要配置更多的内核特性,那么下个问题就回答"yes"(Configure standard kernel features (expert users) (EXPERT))(配置标准内核特性(专家级用户))。

要启用过时的16位UID系统调用封装器,这个问题设成"yes"(Enable 16-bit UID system calls (UID16))。系统调用就会使用16位UID。

推荐启用"sysctl syscall"(Sysctl syscall support (SYSCTL\_SYSCALL))支持。这使/proc/sys成为二进制路径的接口。

接下来的两个问题已经被预先回答了"yes",它们是"Load all symbols for debugging/ksymoops (KALLSYMS)"(载入所以的调试符号)和"“Include all symbols in kallsyms (KALLSYMS\_ALL)"(包括所有的kallsyms符号)。这些都是启用调试标志。

下一步,开发者应该启用printk支持( (Enable support for printk (PRINTK))),这会输出内核消息到内核日志中。这在内核出错时是很重要的。编译一个"哑巴"内核并不是一个好主意。然而,如果我们启用了这个支持,就会被一些开发者看到这些出错,要么就不要启用。

除非有必要,开发者可以禁用bug支持(BUG() support (BUG))。禁用这项将会不支持WARN信息和BUG信息。这会减小内核的体积。


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

译者:geekpi 校对:wxy

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