7
9
2014
3

把 /usr/share 压成 squashfs,以及写 systemd 的 mount 单元

好像一年多没写东西了诶…… 其实寒假就想写点啥,但都因为拖延症没写成。可见维护博客也是个挺麻烦的事。这次为了避免拖延,写点简单的东西好了。

前言

Archwiki 的 Maximizing performance 一文很早就提到 “Compressing /usr” 这么个优化方式。就是用 squashfs 压缩 /usr(squashfs 是只读的),然后上面加一层 aufs 实现读写支持。好处就是减小磁盘空间占用,从而减轻 I/O 负担,

不过后来 Linux 内核把 aufs 踢出去了,这个优化也就坑了。加上现在 Arch 现在基本把所有东西都放进了 /usr,init 进程对 /usr 依赖特别强,分出去可能会有各种毛病。于是就不再建议搞这个优化了。

前阵子搞学校图书馆的网络启动查询机。实现是:Arch 系统,文件放在 NFS 上的 squashfs 里,用 aufs 读写。于是重新折腾起 aufs + squashfs 了。后来索性在自己机器上也搞了个,不是压 /usr,而是压 /usr/share。这里就记录一下配置吧。

为什么要压缩 /usr/share,而不是别的?

  1. 除了安装、卸载、升级软件,对 /usr 几乎没有写操作。如果你不进行这些操作,弄个只读的 /usr 都没问题。这就是为什么一般教程只有说压 /usr 的,没有说压 /var 的。
  2. 压缩 /usr/share 比压整个 /usr 安全,没有 /usr/share 系统也能启动进 single 模式(虽然有些功能会受影响)。
  3. /usr/share 几乎是 /usr 中占用空间最大的一部分,且其中有很多小文本文件,压缩效率很高。

配置

先说说目录结构。文件系统相关文件都放在 /sfs/usr_share/:

  • squashfs 压缩档:/sfs/usr_share/filesystem.sfs
  • aufs 只读分支:/sfs/usr_share/ro
  • aufs 可写分支:/sfs/usr_share/rw

下面的操作其实都可以开着系统在线完成的,除了最后删除 /usr/share 的部分。

创建 squashfs 压缩档

一条命令的事儿:

 mksquashfs /usr/share /sfs/usr_share/filesystem.sfs \
        -b 32k -comp lzo -Xcompression-level 9

稍微解释:

  1. -b 32k:设置 squashfs 块大小为 32k。大概就是一次读取的最小单位。设大点压缩率会更高,但是读取一个 block 所需的 I/O 操作也会变多。所以要取个适当的值。我试了,32k 就差不多,再大压缩率增加的也不明显。(这主要是因为 /usr/share 里大多是很小的碎文件)
  2. -comp lzo:压缩算法设置为 lzo。这个压缩算法的特点是快速、省资源,压缩比一般般。但这样其实正好适合文件系统压缩,本来文件系统压缩就是牺牲内存/CPU资源来节省I/O资源的。可以看看网上的评测,这个压缩率比 xz/lzma 差一些,但压缩/解压速度快了很多。
  3. 注意压缩算法千万别选 lz7。这个算法也是跟 lzo 差不多的特点,不过内核的 squashfs 模块似乎还不支持该算法……
  4. -Xcompression-level 9:使用最大比率的 lzo 压缩。据说这样只是压缩速度会变慢,解压速度几乎不受影响。

写 systemd 的 mount 单元

按道理说,应该在 fstab 里加上相关项就可以了。但实际上我遇到了很严重的问题,开机经常没挂上 /usr/share。我没仔细追原因,感觉好像是因为 systemd 对挂载顺序作出了些调整,导致了一些问题。最后试了试 systemd 引入的新东西,解决了问题。

众所周知,systemd 造了好多轮子,什么 crontab、网络管理器、日志服务 它都想给接替了。fstab 也是这样,systemd 引入了 .mount 单元这么个东西,用于控制文件系统挂载。

虽然 Arch 还没抛弃 fstab,但其实 fstab 中有些内容已经被 systemd 完全取代了。老 Arch 用户可能记得,以前 /dev、/tmp 的挂载都是要写进 fstab 的,但现在都不用写了。Arch 用户可以看看 systemd 包提供的 /usr/lib/systemd/system/tmp.mount 这个文件,就是 /tmp 的挂载配置。内容很好理解,就不贴了。

正如 systemd 引入的各种单元(unit)一样,mount 单元也可以写各种依赖啊什么的东西,从这点来讲它比 fstab 的功能要强大。这里挂载 /usr/share 就要用到依赖关系:可读分支要在 /usr/share 挂载之前完成挂载。

直接贴文件:

[Unit]
Description = /usr/share, read-only branch

[Mount]
What = /sfs/usr_share/filesystem.sfs
Where = /sfs/usr_share/ro
Type = squashfs
Options = defaults

[Install]
WantedBy = local-fs.target

 

[Unit]
Description = /usr/share
Requires = sfs-usr_share-ro.mount
After = sfs-usr_share-ro.mount

[Mount]
What = none
Where = /usr/share
Type = aufs
Options = br:/sfs/usr_share/rw=rw:/sfs/usr_share/ro=ro

[Install]
WantedBy = local-fs.target

内容也很好看懂。Requires、After 这和 systemd service 的写法基本一致(其实我也不太懂),[Mount] 下就是挂载的说明了,What 后是要挂载的文件系统,Where 是挂载到的地方,Type 是文件系统类型,Options 是挂载参数。相当于:

mount -t <Type> -o <Options> <What> <Where>

不知道有人注意到这个文件名没,尤其是第一个。sfs-usr_share-ro.mount 这样命名其实是 systemd 强制要求的(抄自 man systemd.mount):

Mount units must be named after the mount point directories they control. Example: the mount point /home/lennart must be configured in a unit file home-lennart.mount. For details about the escaping logic used to convert a file system path to a unit name, see systemd.unit(5).

反正就是要和你挂载到的路径一致,把路径里的「/」换成「 -」。挺蛋疼的。

测试、清理

其实现在重启应该就可以了,/usr/share 放那儿反正会被 mount 盖掉。重启后确认 /usr/share 确实挂上 aufs 了,原来的文件是否删除就看心情了吧。

后期保养

说句实话,给 Debian stable 之类的上这个优化可能更有效。Arch 你得经常滚啊,滚一滚 aufs 可写分支就变得很大,这时就得重新压一下 squashfs 了。

重新压的步骤和前面差不多,就是把你现在的 /usr/share 当成没压的重新压一遍,把可写分支清空。不过清空可写分支的操作得离线进行(至少要进 single 模式卸载掉原来的 aufs)。注意安全,不多说了。

 

随便写写,没看懂的人千万不要乱试哦!

1
29
2013
1

Archlinux on ThinkPad L430

甲、前言

出于特殊需求,花将近3000买了这个 ThinkPad L430。

一、配置

  • CPU:Intel Pentium B980 @ 2.40GHz  #Sandy Bridge 的,主频还可以
  • 显卡:HD 3000 核显 + Quadro NVS 5400M 独显  #奇葩的型号,好像是啥绘图卡,感觉和610M水准差不多
  • 内存:2GB  #跑Win7HB和Linux足矣
  • 硬盘:320GB HDD
  • 14吋屏幕、DVD刻录机、有摄像头、没指纹识别、预装Win7HB

二、吐槽

  • 指纹识别呢?我一直觉得 ThinkPad 这个很厉害,结果发现便宜货上没有……
  • 第一天就发现光驱是坏的,送回去修了,略郁闷。
  • Win7 预装了一坨联想的东西,还有啥QQ电脑管家,去死吧……

 

3
4
2012
0

【火狐三则】增强组件的PKGBUILD;不错的dial插件;同步profile到内存盘

没有什么关联的三则。

1. 火狐addon的PKGBUILD:

从CVS获取代码编译最新版插件的PKGBUILD,对喜欢用测试版Fx的用户可能有点用。

community里面有稳定版的adblock-plus、noscript,是下载XPI解压然后打包的。自己写的话,可以参考其中确定安装目录的部分。

adblock-plus

从hg获取的代码有个metadata,里面可以提取Fx版本支持信息,所以写成动态获取依赖版本了。

另外,第一次知道,用某些CVS的PKGBUILD中不用自己写clone代码的部分…… makepkg会自动完成。

pkgname=firefox-adblock-plus-hg
pkgver=3414
pkgrel=1
pkgdesc="plugin for firefox which disables script (mercurial developing version)"
arch=('any')
url="https://adblockplus.org/"
license=('GPL')
depends=("firefox")
conflicts=("firefox-adblock-plus")
provides=("firefox-adblock-plus")
makedepends=('unzip' 'python2-jinja' 'mercurial')

_hgroot="https://hg.adblockplus.org/"
_hgrepo="adblockplus"

build() {
    rm -rf "$srcdir/$_hgrepo-build"
    cp -rf "$srcdir/$_hgrepo" "$srcdir/$_hgrepo-build"
    cd "$srcdir/$_hgrepo-build"
  
    # determine supported firefox versions
    _fxver=($(sed -n 's/firefox=\(.*\)/\1/p' metadata | sed "s/\//\ /"))
    _abpver=$(sed -n 's/version=\(.*\)/\1/p' metadata)
    _emid=$(sed -n 's/id=\(.*\)/\1/p' metadata)
    depends=("firefox>=${_fxver[0]}" "firefox<=${_fxver[1]}")
    provides=("firefox-adblock-plus=$_abpver")

    python2 build.py build abp.xpi

    install -d "$pkgdir/usr/lib/firefox/extensions/$_emid"
    unzip -od "$pkgdir/usr/lib/firefox/extensions/$_emid" abp.xpi
    
    # unzip set filemode extracted from XPI file to 600
    # I don't know why :3
    chmod -R a+r "$pkgdir/usr/lib/firefox/extensions/$_emid"
}

https-everywhere

我sed功力太差,不会从XPI中提取版本信息(其实是土方法太繁琐),所以这个就不搞动态版本了……

pkgname=firefox-https-everywhere-git
pkgver=20120303
pkgrel=1
pkgdesc="an addon making firefox auto use HTTPS (git developing version)"
arch=('any')
url="https://www.eff.org/https-everywhere/"
license=('GPL2')
depends=("firefox>=3.0")
provides=("firefox-https-everywhere")
makedepends=('unzip' 'git')

_gitname="https-everywhere"
_gitroot="git://git.torproject.org/https-everywhere.git"

build() {
    cd $srcdir
    msg "Connecting to the GIT server...."
  
    if [ -d $_gitname ]; then
        cd $_gitname && git pull origin && cd ..
        msg "The local files are updated."
    else
        git clone $_gitroot $_gitname
    fi
    
    msg "GIT checkout done"
    
    rm -rf "$_gitname-build"
    cp -rf "$_gitname" "$_gitname-build"
    cd "$_gitname-build"
    sed -i '1 i#\!/usr/bin/python2' trivial-validate.py
    ./makexpi.sh
    
    install -d "$pkgdir/usr/lib/firefox/extensions/https-everywhere@eff.org"
    unzip -od "$pkgdir/usr/lib/firefox/extensions/https-everywhere@eff.org" pkg/*.xpi
}

 

2. FVD Speed Dial插件:

之前用Speed Dial,感觉界面很弱智……

今天发现了这个。自我感觉比Speed Dial强大多了,界面挺好看。

除了支持Speed Dial的分组之类的,Dial页还能显示最常访问、最近关闭等。

下载、截图自己看吧:https://addons.mozilla.org/en-US/firefox/addon/fvd-speed-dial/

 

3. profile-sync-daemon,同步浏览器配置到内存盘:

把用户profile(~/.mozilla)放到内存盘,可以提高Fx速度,并减少磁盘读写。考虑到这个比较麻烦,还要自己写脚本什么的,一直没搞过。

看Archwiki,发现了profile-sync-daemon这个daemon,挺很方便的。不仅支持Fx,还支持Chrome、Opera、Midori。graysky出品,必属精品。

从AUR安装,修改 /etc/psd.conf,在USERS部分填上自己的用户名,rc.d start psd 启动就行了。

9
10
2011
7

e4rat:大幅提升Linux开机速度

警告:此软件仅限原生ext4文件系统使用。其他文件系统以及从低版本升级的ext4文件系统用户不要使用,否则将导致灾难性后果。 本着负责的态度,先Warning。 

e4rat是个好东西。其原理大致是(我猜的):通过磁盘整理有序化开机要加载的文件,并在系统启动阶段把数据预读到内存,充分使用内存和IO资源。

AUR上大家的溢美之词:

snack 发表于 Mon, 20 Jun 2011 23:03:28 +0000

Just one word: amazing! Can't believe such an improvement can be obtained so simply. Definitely one of the most notable utilities I've ever tried.

bwat47 发表于 Sat, 11 Jun 2011 00:55:03 +0000

Very impressive stuff! I have a laptop with a 5400rpm drive. This made like halved my boot time (gdm starts way faster, login is faster) all my apps like chrome/banshee/empathy start as fast as if they were cached in memory already :)

drexya 发表于 Sat, 04 Jun 2011 02:52:06 +0000

Wow, impressive results Oo.

可以看看官方给的效果图Amazing诶!

使用前

使用后

 

本文针对Arch系统,介绍一下使用方法。

1. 系统要求:

根文件系统是原生ext4,即一开始就格式化成ext4了,不是从ext2、ext3升级的。

内核支持audit。repo中的内核都支持,手动编译内核的需要注意一下。

2. 安装:

yaourt -S e4rat

或者自己从AUR下载脚本编译。

3. 收集信息:

grub中Linux启动项最后加上参数:

init=/sbin/e4rat-collect

启动后e4rat会记录120秒内系统打开的文件。可以在 /etc/e4rat.conf 修改等待时间(timeout)。

PS:据我观察,收集信息时系统启动会变得格外的慢,可能要一分钟以上。

4. 整理磁盘:

收集信息后,会生成 /var/lib/e4rat/startup.log 文件,里面记录的就是启动时打开的所有文件。然后要整理磁盘,该操作需要在单用户模式下执行:

sudo init 1

然后:

e4rat-realloc  /var/lib/e4rat/startup.log

5. 大功告成:

修改grub菜单文件,Linux启动项参数加入:

init=/sbin/e4rat-preload

重启后e4rat就开始工作了。

6. 其他:

a. 不要让e4rat预读太多东西,启动到桌面就足够了。如果预读太多东西(比如浏览器、文本编辑软件),反而会拖慢开机速度。

b. 以上都是针对Arch默认的init程序。如果你使用其他init机制,比如systemd,需要修改 /etc/e4rat.conf ,设置init参数:

init /bin/systemd

c. 该软件对SSD固态硬盘没什么作用。

| Theme: Aeros 2.0 by TheBuckmaker.com