使用 systemd 的系统关机或重启时,自动执行特定命令

Arch Linux 这种比较潮的系统,已经迁移到了 systemd 这个管理器。这篇文章介绍如何在系统关机或重启时,自动执行特定命令。当然开机时自动启动服务也是一样的道理。

Manpage of Systemd

systemd 是一种系统和服务管理程序,与 Ubuntu 下的 upstart 类似,都是用来替代原始 BSD 或 System V 风格的 init 程序,实现在开机、不同的启动级别以及关机和重启时,执行相应的命令,启动或停止相应的服务。

1. 首先,我们要创建自己的 .service 服务文件。创建 /etc/systemd/system/xiaodu.service 内容如下:(点击下载

[Unit]
Description=Xiaodu: Remove bbswitch before shutdown/reboot
DefaultDependencies=no
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/sbin/modprobe -r bbswitch

其中,ExecStart= 后面替换为自己要执行的命令。我这里是为了在关机或重启前,卸载 bbswitch 模块,以便正常关机。

2. 按照需求将该服务文件链接到特定的位置。例如需要在关机之前执行,则:

# ln -s /etc/systemd/system/xiaodu.service /usr/lib/systemd/system/shutdown.target.wants/

这里的 shutdown.target 指的是关机前需要执行,同样也会在重启之前执行。如果只需在重启之前执行,则需要链接到 reboot.target.wants (可能需要创建该文件夹)。

由于在编写 .service 文件的时候,没有写 [Install] 段落,因此不能直接通过 # systemctl enable xiaodu.service 来启用,只能手动链接。更多信息可以参考 systemd.service 的手册页。

3. 要测试是否生效,可以尝试“启动”该服务 # systemctl start xiaodu.service ,也可以直接关机或重启来检查。

Compiling Custom Linux Kernel With PAE And PF-Patch On Arch Linux

The x86 Linux kernel in the official Arch Linux repository oddly doesn’t have PAE enabled by default. So I decided to compile my own with PAE as well as -pf patch set.

WARNING: Compiling and installing your own kernel can / will take VERY LOOOONG and be DANGEROUS. There are pre-compiled PAE kernels available as well as -pf ones, if that’s only what you want. If you are a regular user who don’t want to take that risk, or even don’t know what Linux kernel is, just follow these links and enjoy your life.

So you still decided to do it manually, huh? Very brave and good choice. So let’s begin.

First let me introduce the kernel we’re going to compile. PAE (Physical Address Extension) makes it possible to use as many as 64GB of physical RAM with 32-bit kernel. PF patch set includes “-ck” patch set, BFS scheduler, BFQ I/O sched, TuxOnIce feature and UKSM patch (the last one comes from China).

1) Get PKGBUILD for “linux-pf” package from AUR. Use yaourt or download here then $ makepkg.

We can also (optionally) edit the PKGBUILD before really start using it. You can change the URL to download Linux kernel, for example to a local mirror. That’ll save you some time. Change the first line of “source” as you want and save.

2) Start compiling and building package.

 — 2.a Choosing base config:

        First you will be asked whether to use “your running kernel’s config”, “make localmodconfig” or “build an all-inclusive kernel like stock -ARCH“.

The second choice should be used with caution, because it means that you only compile the drivers you loaded now, and if you add a new device later (even a USB mouse you don’t use now), it will NOT get recognized and run by your custom kernel.

Here I recommend the last choice, though it’ll take longer than the second, it’s the best choice for most people.

— 2.b Manually config:

  Since the default config for “linux-pf” still comes with PAE (CONFIG_HIGHMEM64G) disabled, we need to alter that choice. Here we can use “make menuconfig” (you can also use GUI-based ones), and change “Process type and features” — “High Memory Support” to the 64G choice. (You can also manually modify “.config” file and change “CONFIG_HIGHMEM64G” to “y”.)

 — 2.c Wait for compiling.

If it’s not too late to say it now (which it definitely is, ha~ha), you can change “/etc/makepkg.conf” (before you start the whole thing) and make the compiling multithreaded (useful for systems with Dual/Quad core CPUs). Read the docs for how.

3) Install the compiled kernel.

There should be two packages, for kernel and its headers. After installiation, (backup your grub.cfg and) # mkinitcpio -p linux-pf , # grub-mkconfig -o /boot/grub/grub.cfg , then restart the computer to use the new kernel.


This is the first time I post here in English. Hope it is English anyway.

Linux 下 GNOME 声音设置里只有“假输出”

这几天换用 Arch Linux 之后遇到两次了,今天终于找到了解决方法。

在网上查了相关资料,在中文社区没有找到比较靠谱的解释。于是查了一下这个假输出,英文原文是 “Dummy Output”(在 Launchpad 的翻译站上找到的),换用英文 Google 后得到了以下解决方法(适用于 GNOME 3 / Unity 等桌面环境)。

Reference: http://forums.opensuse.org/english/get-technical-help-here/tumbleweed/465124-pulseaudio-only-dummy-output.html

遇到这个问题的原因是,我用 gnome-session-quit –logout 注销了,再进来就没有声音了,查看上面的声音设置,只有一个“假输出”(图是恢复后的了)。

解决方法就是——将你的用户加入 audio 组,并重启 pulseaudio。

sudo gpasswd -a $USER audio
sudo killall pulseaudio

顺便说一句:Infinality 补丁版的 FreeType 渲染效果太 TMD 好了!麻麻再也不用担心 Linux 上的字体丑了~

在 Linux 下配置罗技 V470 鼠标的滚轮横向按钮功能

由于罗技的 SetPoint 驱动没有 Linux 版,也就没办法自定义横向滚轮的功能。这里介绍一下如何通过 X.org 自带的配置功能来实现。

我想要实现的是横向滚轮后退和前进网页的功能,有些复杂的功能是不能通过修改配置实现的。测试环境:Ubuntu 12.10 x86,X.Org X Server 1.13.0 / X Protocol Version 11,鼠标设备是罗技 V470 蓝牙鼠标。当然,理论上这些配置也都适用于任何使用 X 的操作系统,以及任何使用标准 X.org 输入驱动的鼠标设备,也可以调整包括左右键、滚轮上下以及大部分自带按键。

1. 使用 xev 检查需要调整的键号。在 Xorg 下的终端中启动 xev,在弹出的白色框中,按下想要调整的鼠标按钮(我这里就是横向滚轮咯),会看到终端中出现类似下面的信息:

ButtonPress event, serial 41, synthetic NO, window 0x4400001,
    root 0xaf, subw 0x0, time 41339809, (78,81), root:(794,134),
    state 0x10, button 6, same_screen YES

ButtonRelease event, serial 41, synthetic NO, window 0x4400001,
    root 0xaf, subw 0x0, time 41339809, (78,81), root:(794,134),
    state 0x10, button 6, same_screen YES

ButtonPress event, serial 41, synthetic NO, window 0x4400001,
    root 0xaf, subw 0x0, time 41340743, (78,81), root:(794,134),
    state 0x10, button 7, same_screen YES

ButtonRelease event, serial 41, synthetic NO, window 0x4400001,
    root 0xaf, subw 0x0, time 41340743, (78,81), root:(794,134),
    state 0x10, button 7, same_screen YES

在按键过程中不要移动鼠标或按键盘(否则会产生很多事件),并记下上面的数据中 button 后面的数字,这就是你刚才按的键号。以上四个事件分别代表:按钮 6(滚轮左)按下、弹起、按钮 7(滚轮右)按下、弹起。

2. 使用 xinput 检查需要调整的设备名称。在连接鼠标的情况下,终端中运行 xinput 命令,即可获得类似下面的信息:

⎡ Virtual core pointer                     id=2  [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4  [slave  pointer  (2)]
⎜   ↳ Bluetooth Laser Travel Mouse             id=11 [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                 id=16 [slave  pointer  (2)]
⎣ Virtual core keyboard                    id=3  [master keyboard (2)]
...(以下省略)

从中很容易看出触摸板及鼠标的名称,复制下其中要调整的鼠标名称,我这里就是“Bluetooth Laser Travel Mouse”。

3. 修改 xorg.conf,调整鼠标的按键映射表(Button Mapping)。按照 X.org 的规范,用户配置文件应该放置在 /etc/X11/xorg.conf.d(如果没有请自行创建)文件夹下。在此创建一个配置文件 20-xiaodu-mouse.conf 并使用以下内容(点此下载):

Section "InputClass"
 Identifier "Xiaodu @ Du9L.com - Logitech Mouse Mapping"
 MatchProduct "Bluetooth Laser Travel Mouse"
 MatchDevicePath  "/dev/input/event*"
 Option "ButtonMapping" "1 2 3 4 5 8 9"
EndSection

其中,MatchProduct 后面是第二步获得的设备名称,而 Option “ButtonMapping” 后面就是我们要修改的映射表。一般用户可以直接搜索 “设备名称 + ButtonMapping” 获得自己的设备对应的值,这里讲一下该值的意义及手动修改的方法。

首先,默认的映射为 1 2 3 4 5 … 32 -> 1 2 3 4 5 … 32 的一一对应,即按下 Button 1 时触发 Button 1 的功能,以此类推。我们要修改的是映射的右边,即按键的功能表。常用的 1 至 9 分别对应着:

1–鼠标左(主)键,2–鼠标中键(现代鼠标通常为滚轮按下),3–鼠标右(副)键,4–滚轮向上滚动,5–滚轮向下滚动,6–滚轮向左滚动,7–滚轮向右滚动,8–鼠标后退键,9–鼠标前进键。

其他 10 以上的值我不知道,网上也没有查到相关资料,欢迎补充。接下来我们就是要把刚才获得的 6 和 7 号按钮映射到 8 和 9 号功能,因此映射表就是:”1 2 3 4 5 8 9″。建议先使用 xinput –set-button-map …(具体语法 man xinput) 命令进行测试,确定功能没错再填入配置文件中。

4. 重启 X server ( kill -KILL `pgrep X` ) 并测试新配置是否生效。

 

参考资料:

1. Disabling the mouse scroll wheel … — KLUDGE-O-MATIC

2. Mouse button mapping — Ubuntu Forums (@jbg7474)

 

国内推荐的 NTP 授时服务器

Ubuntu (Debian) Linux 下使用 ntpdate 工具进行时间同步。默认的时间服务器是国外的,下面介绍几个推荐的国内 NTP 授时服务器。

ntpdate 软件的配置文件位于 /etc/default/ntpdate 。我目前的配置如下:

NTPDATE_USE_NTP_CONF=no #不使用 /etc/ntp.conf 转而使用下面的列表
NTPSERVERS="ntp.tuna.tsinghua.edu.cn 210.72.145.44 ntp.api.bz 0.cn.pool.ntp.org ntp.sjtu.edu.cn"
NTPOPTIONS=""

这个列表是国内几个比较快和稳定的服务器,包括教育网及公网电信、联通的地址。我记得推荐是使用三个服务器以内,可以按照网速去掉两个用不到的。

当然,如果使用其他 NTP 客户端,例如 ntpd 或者 chrony,也可以相应的在 /etc/ntp.conf、/etc/ntpd.conf 或 /etc/chrony.conf 中,修改或增加以下几行:

server ntp.tuna.tsinghua.edu.cn
server 210.72.145.44
server ntp.api.bz
server 0.cn.pool.ntp.org
server ntp.sjtu.edu.cn