pacman使用 Archlinux 的朋友大概遇到过这样的烦恼,软件安装得比较多的时候,再用 pacman 做任何事情的时候都可以看到硬盘狂转一段时间,然后才有反应。

pacman 官方给了一个 pacman-optimize,它会把 pacman 数据库文件打包到别的地方,删除,然后再放回去。这样做可能会让这些零碎的文件在硬盘上是连续排列的,但实际效果却不是很好。

虽然用 Archlinux 应该有三年左右了,但我还从来没有看过 pacman 的数据库是什么模样。有一天终于忍不住去看了一下 /var/lib/pacman 下面到底是什么,原来是这么多零碎的小文件啊!

于是解决方案也就有了:把所谓的 pacman 数据库放到 reiserfs 文件系统里。如果你本来在这个地方用的就是 reiserfs 的话,那么不需要做任何事情, pacman 应该就很快了。如果你和我一样用的是 ext4 这样的文件系统,也不必慌张地把整个分区都换成 reiserfs。

新建一个 160 MB 的 reiserfs 文件 pacman_db.fs

truncate pacman_db.fs --size 160M
mkfs.reiserfs -f ./pacman_db.fs

把现有的 pacman 数据库复制到这个 reiserfs 里面:

sudo mount pacman_db.fs -t reiserfs /mnt -o loop 
cp -a /var/lib/pacman/* /mnt
sudo umount /mnt

接下来修改 /etc/fstab,加上一行:

/[path_to_pacman_db]/pacman_db.fs /var/lib/pacman reiserfs defaults,loop 0 4

左边的 [path_to_pacman_db] 需要根据实际情况填一下。最右边的 4 应该是比 fstab 中其他条目大一些的数字,表示 fsck 检查时最后处理这个地方。

如果想让这个设置立即生效,执行 sudo mount /var/lib/pacman 即可。否则,重启一下就可以了。现在,使用 pacman -Syu 更新一下系统,是不是比以前快许多? :)

Tagged with:  
  • http://blog.pluskid.org pluskid

    表示本来就很快,你该换笔记本了,哈哈~~

    • http://lihdd.net quark

      @pluskid :
      不觉得,你多装些软件试试看?用 reiserfs 之后的 “resolving dependencies…” 会在 0.x 秒内结束,硬盘也不会闪,ext4 应该是办不到的。

  • http://blog.pluskid.org pluskid

    @quark
    原来你说的是 resolving dependencies 这里啊,确实有点慢~~

  • http://hi.baidu.com/storymedia 君临天下

    据说ext4 比 ext3 and 2 慢但对细碎文件支持ext3比2好,所以我现在统一采用ext3格式!算是保守吧!据说btrfs很强劲,不知道是否如此!

    • http://lihdd.net quark

      @君临天下 : 不知道你看到的是什么资料。ext4 在各方面的速度比 ext3 好,ext3 是比无日志的 ext2 慢一点。不过大量小文件的时候 extfs 都会悲剧……

      我以前看的文件系统评测之一在这里,很不错,推荐参考。

  • L42y

    刚刚把U盘格式化成reiserfs,用U盘来玩,呵呵。U盘处理小文件应该有优势

  • http://hzqtcblog.appspot.com/ hzqtc

    我现在就干脆全用reiserfs了,可能是快一点吧- -

    • http://lihdd.net quark

      @hzqtc : 是应该比较快…… 不好的地方就是如果 / 需要 fsck 的话,可能会有点麻烦

  • http://oppih.realax.me hippo

    请问,“新建一个 160 MB 的 reiserfs 文件 pacman_db.fs”,这一步,是在哪里创建?任意位置?

    • http://lihdd.net quark

      @hippo : 是的,这一篇文章主要就是说用 reiserfs 来处理 pacman 的 cache 中大量小文件的情况,效果比较明显。

  • http://oppih.realax.me hippo

    不过我还是好奇,这个 pacman_db.fs 文件,是以什么形式存在硬盘上面的呢?比如,我的/是jfs的,然后在这里建立了这个reiserfs格式的文件,它就是一个文件放在那里了?

    • http://lihdd.net quark

      @hippo : 是的。正如 /dev/sda1 一样可以被当作块设备挂载。

  • http://oppih.realax.me hippo

    OK,谢谢你的解释。那请问你把这个文件放在哪里的呢?我准备放在/var/lib/下,这样合适么?

    • http://lihdd.net quark

      @hippo : 我是把它放在那里的。这种做法其实有些亡羊补牢的感觉,如果很早就知道这样做的好处的话,在硬盘分区的时候就分出来一块地方就好了。

  • http://oppih.realax.me hippo

    哈,文件系统的事情开始确实弄不清楚的……我现在Arch的根分区用了jfs,说是已经停止开发了……呜……

  • Pingback: 记录一下这几天折腾的东西 | oppih

  • http://blog.imxifs.info vehicle

    root分區用的是reiserfs,但是我表示pacman依然慢

  • oldherl

    这样改动之后,有时候会开机自动fsck这个文件系统,可是此时/是只读的,所以就没办法检查,出错,得手动挂载……
    你是怎么解决的?
    把它单独弄成一个分区?

    • http://lihdd.net quark

      @oldherl : 我只在异常断电后遇到这个问题,届时需要手动 remount。如果在 fstab 中的最后一栏是 0 ,则回避自动检查,修改成比 / 大一些的数字则会在 / 挂载之后才会检查。

  • http://oppih.realax.me/ oppih

    出状况了哦……前几天,给我出来这么个:

    file system has been mounted 31 times without being checked

    偏偏我还不会手工检查……还不敢乱来。怕给弄坏了。。。

    • http://lihdd.net quark

      @oppih : 先 unmount,再用 fsck 工具手工检查一次,然后再 mount 不会有问题的…… 如果怕出问题就先 copy 一份备份一下。

  • owensss

    哎…不知不觉就能看懂了啊…