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电脑管家,去死吧……

 

10
28
2012
3

NetworkManager 配合使用 chnroutes (至少适用于 Arch)

高三很忙,好久没写东西了。不过也快熬出头了。今天就写点儿啥吧。

 

VPN是个好东西,翻那个啥效果不错,比goagent之类的要稳定。但如果不配置路由的话,VPN就会成为默认网关,包办所有对外连接。这反而会导致访问国内网站速度变慢,而且也挺浪费流量的。我搜了一下,找到了chnroutes这个工具:

chnroutes
利用来自APNIC的数据生成路由命令脚本,让VPN客户端在连接时自动执行。通过这些路由脚本,可以让用户在使用VPN作为默认网关时,不使用VPN访问中国国内IP,从而减轻VPN负担,并提高访问国内网站的速度。

如果使用openvpn之类的命令连接VPN的话,按照其readme配置即可。但我还是偏好GUI,想用NetworkManager来管理连接。NetworkManager的VPN连接程序是自带的,并不使用命令行工具的配置文件。

Google到了这篇文章:《Ubuntu 9.10下使用Network-manager 配置openvpn 》

 

简要转述 chnroutes 使用方法:

  1. 克隆代码:
    git clone git://github.com/GutenYe/chnroutes.git
  2. 终端下切到代码目录,执行:python2 chnroutes.py
  3. 接下来会生成 vpn-up.sh、vpn-down.sh。vpn-up.sh 需要修改一下(原因参考上面提到的文章),把开头的 “OLDGW=$(...” 那一行删掉,改为:
    OLDGW=$(ip route show | grep '^[^d].*proto static' | grep -v 'dev\s*tun' | awk 'NR==1' | sed -e 's/.*via \([^ ]*\) .*/\1/')
  4. 把 vpn-up.sh 随便放到个合适的地方吧(我放到了 /etc/openvpn/ )

 

Arch 的 NetworkManager 没 Ubuntu 那个名为 01ifupdown 的 dispatcher 。简单研究一下,发现dispatcher也不是啥复杂的玩意儿。要点如下:

  1. 接入/断开连接时,会依次调用 /etc/NetworkManager/dispatcher.d/ 下的 shell 脚本
  2. NetworkManager 会给脚本传入(至少)两个参数,第一个是连接名称,第二个是动作
  3. 动作有(至少)四种:up—接入普通连接,down—断开普通连接,vpn-up、vpn-down—接入/断开VPN连接

照葫芦画瓢写了个(请保存到 /etc/NetworkManager/dispatcher.d/10chnroutes):

#!/bin/sh -e

case "$2" in
    vpn-up)
    exec /etc/openvpn/vpn-up.sh
    ;;
    vpn-down)
    exit 0
    ;;
esac

exit 0

额,弱爆了是吧……别的发行版应该也能用。

按说vpn-down时应该执行一下vpn-down.sh的,但我发现加上了反而会导致一个(无伤大雅的)错误,而且不执行也没啥影响,VPN断开后路由表确实自动恢复了。这方面我不太懂,反正事实就是这样。

到这里,NetworkManager 连接 VPN 时就能自动配置路由了。在VPN连接后,找个国内看IP的网站测试看看吧。

 

另外,对 Ubuntu 用户的附注。那篇参考文章提到的 01ifupdown,在最新的Ubuntu里变复杂了,要修改成下面这样:

    up|vpn-up)
        export MODE="start"
        export PHASE="post-up"
        /etc/openvpn/vpn-up.sh
        exec run-parts /etc/network/if-up.d
    ;;

 

Category: 计算机 | Tags: arch linux ubuntu vpn 网络
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 启动就行了。

2
19
2012
5

unzip 6.10b测试版,解决ZIP乱码问题

原来unzip有个-O参数,可以设定编码的。到了6.0版本不知为何移除了。后来ZIP乱码问题就一直困扰着群众。

今天翻了翻官网,发现测试版本6.10b重新添加了这个参数:

- Add -I and -O options for setting ISO and OEM character sets, respectively, used by UnZip when doing character set translations. This support is based on the unzip60-alt-iconv-utf8 patch suggested in an Info-ZIP forum thread and uses the iconv library which must be available. These options are enabled using the USE_ICONV_MAPPING compiler macro. Suggestions welcome on how to improve this limited character translation support.  

虽然这个版本2010年底就发布了,但能搜索到的信息几乎没有,真是奇怪。用官方新版本解决乱码不是很方便么……

于是写了个PKGBUILD,扔AUR了: unzip-beta

使用示例:

unzip 我是一个ZIP.zip -Ogbk

Category: 计算机 | Tags: arch ZIP 软件 linux
1
27
2012
10

最后还是堕落到宋体了

不得不说,点阵字体还是有很大好处的:看着清楚。所以又迎回了宋体。

矢量字体在我这里总有发虚、笔画杂揉的问题。估计是屏幕太小太旧,用网上给的配置感觉也不太好。

其他Windows字体没装,保持系统简洁。

 

参考: http://forum.ubuntu.org.cn/viewtopic.php?f=8&t=359236

(总算弄明白之前宋体为啥总也弄不好了,某个系统级别配置搞的鬼。我逐个移动/etc/fonts/conf.d下的文件,终于找到了元凶。)

 

以下是目前的fontconfig:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <!-- 基本设置,我的屏幕小,DPI设置为85。 -->
    <match target="font">
        <edit name="dpi" mode="assign">
            <double>85</double>
        </edit>
        <edit name="rgba" mode="assign">
            <const>rgb</const>
        </edit>
        <edit name="autohint" mode="assign">
            <bool>false</bool>
        </edit>
        <edit name="hinting" mode="assign">
            <bool>true</bool>
        </edit>
        <edit name="hintstyle" mode="assign">
            <const>hintfull</const>
        </edit>
        <edit name="antialias" mode="assign">
            <bool>true</bool>
        </edit>
        <edit name="embeddedbitmap" mode="assign">
            <bool>false</bool>
        </edit>
    </match>

    <!-- Windows中文字体替换 -->
    <match target="pattern">
        <test qual="any" name="family">
            <string>宋体</string>
            <string>新宋体</string>
            <string>NSimSun</string>
            <string>微软雅黑</string>
            <string>Microsoft YaHei</string>
            <string>AR PL ShanHeiSun Uni</string>
            <string>AR PL ShanHeiSun Uni MBE</string>
            <string>AR PL UMing CN</string>
            <string>AR PL UMing HK</string>
            <string>AR PL UMing TW</string>
            <string>AR PL UMing TW MBE</string>
        </test>
        <edit name="family" mode="assign" binding="same">
            <string>SimSun</string>
        </edit>
    </match>

    <!-- 不认识的字体当作sans-serif -->
    <match target="pattern">
        <test qual="all" name="family" compare="not_eq">
            <string>sans-serif</string>
        </test>
        <test qual="all" name="family" compare="not_eq">
            <string>serif</string>
        </test>
        <test qual="all" name="family" compare="not_eq">
            <string>monospace</string>
        </test>
        <edit name="family" mode="append_last" binding="weak">
            <string>sans-serif</string>
        </edit>
    </match>

    <!-- 小号宋体用点阵,关闭抗锯齿,不然看起来很浅 -->
    <match target="font">
        <test qual="any" name="family">
            <string>SimSun</string>
        </test>
        <test name="pixelsize" compare="more_eq">
            <double>8</double>
        </test>
        <test name="pixelsize" compare="less_eq">
            <double>18</double>
        </test>
        <edit name="antialias">
            <bool>false</bool>
        </edit>
        <edit name="embeddedbitmap" mode="assign">
            <bool>true</bool>
        </edit>
    </match>

    <!-- 斜体关闭点阵、开抗锯齿更清晰 -->
    <match target="font">
        <test name="slant" compare="not_eq">
            <const>roman</const>
        </test>
        <edit name="antialias">
            <bool>true</bool>
        </edit>
        <edit name="embeddedbitmap" mode="assign">
            <bool>false</bool>
        </edit>
    </match>

    <!-- 某些常见字体的alias -->
    <alias>
        <family>Times</family>
        <prefer>
            <family>Times New Roman</family>
        </prefer>
	<default>
	    <family>serif</family>
	</default>
    </alias>

    <alias>
        <family>Helvetica</family>
	<prefer>
	    <family>Arial</family>
	</prefer>
	<default>
            <family>sans</family>
        </default>
    </alias>

    <alias>
        <family>Courier</family>
        <prefer>
            <family>Courier New</family>
        </prefer>
	<default>
	    <family>monospace</family>
	</default>
    </alias>
    
    <alias binding="strong">
	<family>Ubuntu</family>
	<prefer>
	    <family>Ubuntu</family>
            <family>MYuppyGB-Medium</family>
            <family>文泉驿微米黑</family>
	</prefer>
    </alias>

    <!-- 基本的三个字体族:sans、serif、mono -->
    <alias binding="strong">
	<family>sans-serif</family>
	<prefer>
            <family>SimSun</family>
            <family>WenQuanYi Bitmap Song</family>
	</prefer>
    </alias>

    <alias binding="strong">
	<family>serif</family>
	<prefer>
            <family>SimSun</family>
            <family>WenQuanYi Bitmap Song</family>
	</prefer>
    </alias>
    
    <!-- 等宽就不用宋体了。编程不怎么用中文,英语矢量字体更好看 -->
    <alias binding="strong">
	<family>monospace</family>
	<prefer>
	    <family>Droid Sans Mono</family>
            <family>文泉驿等宽微米黑</family>
	</prefer>
    </alias>
</fontconfig>

另外,用font-manager禁用了几个字体。Nimbus那几个是X带的的基本字体,很难看。文鼎明体不禁用应该也没啥问题。剩下几个是效果差的:

<?xml version="1.0"?>
<fontconfig>
  <selectfont>
    <rejectfont>
      <pattern>
        <patelt name="family">
          <string>Nimbus Mono L</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>AR PL UMing TW MBE</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>Century Schoolbook L</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>URW Bookman L</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>AR PL UMing CN</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>Nimbus Roman No9 L</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>Nimbus Sans L</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>AR PL UMing HK</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>AR PL UMing TW</string>
        </patelt>
      </pattern>
      <pattern>
        <patelt name="family">
          <string>Ahem</string>
        </patelt>
      </pattern>
    </rejectfont>
  </selectfont>
</fontconfig>

 

Category: 计算机 | Tags: 字体 linux arch
1
17
2012
7

repo-elephant:Arch彩蛋?

无意中在最新的 pacman 4.0.1 里面发现了repo-elephant这么个玩意儿。

 

哦呵呵:

cuihao@cuihao-arch /tmp $ repo-elephant -q
    _    _
   / \__/ \_____
  /  /  \  \    `\
  )  \''/  (     |\
  `\__)/__/'_\  / `
     //_|_|~|_|_|
     ^""'"' ""'"'

 

啊哈:

cuihao@cuihao-arch /tmp $ repo-elephant -q
     __
    '. \
     '- \
      / /_         .---.
     / | \\,.\/--.//    )
     |  \//        )/  /
      \  ' ^ ^    /    )____.----..  6
       '.____.    .___/            \._)
          .\/.                      )
           '\                       /
           _/ \/    ).        )    (
          /#  .!    |        /\    /
          \  C// #  /'-----''/ #  /
       .   'C/ |    |    |   |    |mrf  ,
       \), .. .'OOO-'. ..'OOO'OOO-'. ..\(,

 

貌似是个正经玩意儿:

cuihao@cuihao-arch /tmp $ repo-elephant -h
repo-elephant (pacman) 4.0.1

  -q, --quiet       最小化输出信息
  -s, --sign        更新后使用 GnuPG 签名数据库
  -k, --key <密匙>   使用指定的密匙签名该数据库
  -v, --verify      更新前验证数据库签名

更多细节及可用选项的描述请参见 repo-elephant(8) 。

 

……好像又是坑爹:

cuihao@cuihao-arch /tmp $ man repo-elephant
没有 repo-elephant 的手册页条目

cuihao@cuihao-arch /tmp $ man 8 repo-elephant
在第 8 节中没有关于 repo-elephant 的手册页条目。

 

庐山真面目,原来是repo-add啊:

cuihao@cuihao-arch /tmp $ ls -al `which repo-elephant`
lrwxrwxrwx 1 root root 8  1月 13 12:45 /usr/bin/repo-elephant -> repo-add*

 

打开repo-add,发现这么一些代码:

elephant() {
	case $(( RANDOM % 2 )) in
		0) printf '%s\n' "H4sIAL3qBE4CAyWLwQ3AMAgD/0xh5UPzYiFUMgjq7LUJsk7yIQNAQTAikFUDnqkr" \
		                 "OQFOUm0Wd9pHCi13ONjBpVdqcWx+EdXVX4vXvGv5cgztB9+fJxZ7AAAA"
		;;

		1) printf '%s\n' "H4sIAJVWBU4CA21RMQ7DIBDbeYWrDgQJ7rZ+IA/IB05l69alcx5fc0ASVXUk4jOO" \
		                 "7yAAUWtorygwJ4hlMii0YkJKKRKGvsMsiykl1SalvrMD1gUXyXRkGZPx5OPft81K" \
		                 "tNAiAjyGjYO47h1JjizPkJrCWbK/4C+uLkT7bzpGc7CT9bmOzNSW5WLSO5vexjmH" \
		                 "ZL9JFFZeAa0a2+lKjL2anpYfV+0Zx9LJ+/MC8nRayuDlSNy2rfAPibOzsiWHL0jL" \
		                 "SsjFAQAA"
		;;
	esac | openssl base64 -d | gzip -d
}
# figure out what program we are
cmd=${0##*/}
if [[ $cmd == "repo-elephant" ]]; then
	elephant
	exit 0
fi

 

Arch开发人员真有聊

1
8
2012
0

一些Arch PKGBUILD的知识

总结一些以前疑惑的关于PKGBUILD的问题。

1. 就算需要,base-devel组中的软件包也不会写入编译时依赖列表(makedepends):

base-devel软件包组包含编译软件所需的基本工具(软件包列表:i686x86_64),包括gcc编译器、make之类的。一般编译软件包都需要这些包,所以干脆就规定makedepends中不需要指定它们。

如果你发现怎么makepkg都编译不了,先看看是不是忘记装base-devel了(pacman -S base-devel)。

2. 从git、svn、cvs、hg等版本控制系统获取代码的软件包,版本号会自动更新:

从版本控制系统获取代码的话,只要PKGBUILD是标准格式,版本号会自动更新,以反映最新的代码变化。

比如,从AUR上下载的ibus-git的PKGBUILD,本来的版本号是20110501,可makepkg之后得到的版本号就变成当天日期YYYYMMDD了。

svn、hg版本号会更新为最新修订号,git、cvs用当天的日期了。

3. install文件之作用:

某些软件包除了PKGBUILD,还会附带一个XXX.install文件。这个文件定义了安装、升级、删除软件包前后要执行的操作。

这些操作放到PKGBUILD是不行的,因为最终要安装的是软件包,而非PKGBUILD。

比如,字体软件包安装或卸载后需要刷新字体缓存,这些操作就必须放在install文件中。

4. arch=('x86_64' 'i686')arch=('any') 的区别:

arch=('x86_64' 'i686')表示:该PKGBUILD可以为x86_64和i686平台生成软件包,但生成的软件包并不能跨平台。

arch=('any')表示:该PKGBUILD生成的软件包在x86_64和i686平台都可以安装。

5. package()build() 函数的区别:

package()是在fakeroot环境执行的,所以能使用某些特殊命令。

其实,通常情况下,把编译过程放在package()、或是把所有操作都放在build()都是可以的。makepkg只保证package()build()(以及不常见的check())之后执行。

6. “xxx || return 1”中“return 1”的作用:

xxx || return 1”的意思是:如果 xxx 命令出错退出了,就退出当前函数并返回错误代码1。这是为了保证重要过程出错时makepkg及时停止。

估计是历史遗留,现在用处不大,因为makepkg本来就会自动出错停止。

7. makepkg不会自动删除旧的src目录,可能导致第二次编译错误:

在执行过一次makepkg的目录再次执行makepkg,src目录不会自动被删除。如果有patch之类的操作,可能因为上次patch过而导致错误。需要手动删除src目录。

Category: 计算机 | Tags: arch cvs Git linux shell svn 软件
12
26
2011
0

在github搭建Arch软件仓库

想搞一个Arch软件仓库。没钱买服务器,就想着扔到个代码托管网站。本来想用google code,结果SVN总是连不上,最后在github弄了个:pakkuman

Arch的软件仓库构造简单,所以放git上也没啥难的。速度还不错,起码能达到100KB/s(以前github慢死了,现在好多了)。

目前没啥特色,主要是验证一下想法。

pacman.conf:

[pakkuman]
Server = https://raw.github.com/cuihaoleo/pakkuman/master/$arch

目前的软件包(随便找了几个以前编译的):

cuihao@cuihao-arch ~ $ pacman -Sl pakkuman
pakkuman amule-dlp-hg 20111016-1 [已安装]
pakkuman freetype2-git-infinality 2.4.99.git20111130-1 [已安装]
pakkuman gtkqq-git 20111226-1 [已安装]
pakkuman ibus-cloud-pinyin-svn 148-1 [已安装]
pakkuman python-webqq-svn 15-1 [已安装]

Category: 计算机 | Tags: arch linux git 软件
12
2
2011
0

Arch下systemd无法开机执行rc.local之解决方法

早就发现了,Arch的systemd提供的那个 rc-local.service 貌似有问题,rc.local不会执行。因为没用rc.local,一直没管。

 

解决方法源自这里,需要稍加改动: http://superuser.com/questions/278396/systemd-does-not-run-etc-rc-local

 

建立文件 /etc/systemd/system/rclocal.service (我怕和系统自带的service冲突,改了个名字),内容为:

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

干掉旧的service:

systemctl disable rc-local.service

上新的service:

systemctl enable rclocal.service

重启动检验。

Category: 计算机 | Tags: arch systemd linux

| Theme: Aeros 2.0 by TheBuckmaker.com