在U盘上安装 Arch Linux (2013-07)

前言

1 月份在移动硬盘上装了个 Arch , 但这块移动硬盘实在是太旧了,在我的旧电脑上经常供电不足, 弄了块 USB 2.0 PCI 卡 也无济于事。 最近终于挺不住了,频繁的报分区损坏、无法进入系统, 严重的时候会在进行硬盘操作时死机。 无奈,拿出一个比较新的 8G U盘,重做随身系统。

本篇文章基于上次移动硬盘安装的经历修改补充而来, 不过半年的时间,一些基础组件就已经发生了变化, Arch Linux 可真是够“折腾”的。

PS:基于半年的 Arch Linux 使用经验, 我 合租的 Linode VPS 也用上了 Arch, 目前感觉尚好,Nginx + PHP-FPM 确实是不错的组合。 Linode 使用修改过的 Linux 内核, AUR 上也有人发布 自己制作的更新版 , 还没研究怎么升级。

基本系统安装

和上次移动硬盘安装一样,选择 32 位系统。 安装介质使用 archlinux-2013.07.01-dual.iso dd 到另一个U盘。

  • 使用U盘启动,自动以 root 身份进入系统。

  • 插入移动硬盘,分区,格式化,挂载。

    本想使用 GPT 分区表,查了一些资料, 为了使这个U盘在 BIOS 和 UEFI 电脑上都能用, 需要创建一个 BIOS boot 分区,2M 大小足够,位置尽量靠前。 多系统的话还要创建一个 200M 的 EFI System Partition(ESP) 分区。 这些都不是问题,但实际做下来, GPT 中的 NTFS 分区在 Win7 下死活不认, 想用这个分区作为常规U盘使用就不行了, 只好再回到 MBR 分区表。 如果是移动硬盘用 GPT 应该没有问题。

    所以仍然使用 MBR 分区,所以就要用 fdisk 或者 cfdisk 了, 不能使用支持 GPT 的 gdisk 和 cgdisk, 4k 对齐也是自动完成。 有趣的是,如果想把 GPT 分区表转换成 MBR 分区表, 还得借助 gdisk:r 进入 Recovery 模式, g 进入 MBR 模式,w 进行转换。 根据实际情况, 有些分区转换未必能够成功, 不过变回 MBR 分区表是没有问题的。

    NTFS 分区得在第一个分区,不然 Windows 不认。

    启动U盘是 /dev/sdb,目标U盘就成了 /dev/sdc。

    # fdisk /dev/sdb
     
    Disk /dev/sdc: 8022 MB, 8022982656 bytes, 15669888 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x00000000
     
    Device      Boot    Start       End         Blocks      Id      System
    /dev/sdb1           2048        1804287     901120      7       HPFS/NTFS/exFAT
    /dev/sdb2   *       1804288     2009087     102400      83      Linux
    /dev/sdb3           2009088     10405887    4198400     83      Linux
    /dev/sdb4           10405888    15669887    2632000     83      Linux

    第一个分区先用 ntfs,当正常U盘使用, 如果以后需要用到 ESP 分区,直接用这个分区转,或者切一部分空间过去。 第二个分区 100M,挂 /boot; 第三个分区 4G,作为 ArchLinux 根分区; 第四个分区 2.5G,作为 $HOME

    格式化分区:

    如果使用 xfs 分区格式:

    # mkfs.ntfs -f /dev/sdc1 -L f004-c
    # mkfs.xfs -n size=64k -l lazy-count=1 /dev/sdc2 -L f004-boot
    # mkfs.xfs -n size=64k -l size=128m,lazy-count=1 /dev/sdc3 -L f004-a
    # mkfs.xfs -n size=64k -l size=128m,lazy-count=1 /dev/sdc4 -L f004-b

    -n size=64k 参数增加了文件名(目录)区域大小(默认 4k), 这样可以减少 IO 消耗,代价是 CPU 消耗多一些, 这对现代计算机显然不是问题。 -l size=128m 参数扩大日志的容量(默认 10m),更安全, 代价是挂载时间会长一些。 -l lazy-count=1 参数减少 superblock 读写次数,提高性能。

    如果使用 ext4 分区格式:

    # mkfs.ntfs -f /dev/sdc1 -L f004-c
    # mkfs.ext4 -b 4096 -m 0 -i 16384 -O '^has_journal' /dev/sdc2 -L f004-boot
    # mkfs.ext4 -b 4096 -m 1 -i 16384 -O '^has_journal' /dev/sdc3 -L f004-a
    # mkfs.ext4 -b 4096 -m 0 -i 16384 -O '^has_journal' /dev/sdc4 -L f004-b

    -b 4096 是每个存储块的大小。 -m 1 是指定 root 保留空间为 1%,home 区就不留了。 -i 16384 是指定多少字节的数据设置一个 inode 节点, 增加它的值会减少 inode 的总数,占用的空间会少一些, 相应的能够存储的文件数量也减少了,这个稍微注意一下就好,一般都够用。 -O '^has_journal' 是关掉文件系统日志,有点小危险。

    经过两天的折腾,个人感觉 ext4 在U盘上读写速度快一些。

    挂载分区:

    # mount /dev/sdc3 /mnt
    # mkdir /mnt/boot
    # mount /dev/sdc2 /mnt/boot
    # mkdir /mnt/home
    # mount /dev/sdc4 /mnt/home

    df -h 检查一下:

    # xfs
    Filesystem  Size    Used    Avail   Use%    Mounted on
    /dev/sdc3   3.9G    33M     3.9G    1%      /mnt
    /dev/sdc2   82M     5.2M    77M     7%      /mnt
    /dev/sdc4   2.4G    33M     2.4G    2%      /mnt/home
     
    # ext4
    Filesystem  Size    Used    Avail   Use%    Mounted on
    /dev/sdc3   3.9G    8.1M    3.8G    1%      /mnt
    /dev/sdc2   96M     48K     96M     1%      /mnt
    /dev/sdc4   2.5G    3.8M    2.4G    1%      /mnt/home

    ext4 改变 bytes-per-inode 确实对分区所占空间影响很大。

  • 安装基本系统

    家里有无线路由,网络不用配置,已经自动连上了。

    编辑 /etc/pacman.d/mirrorlist ,把最快的源挪到最上面。 一般来说 163 和台湾的源比较快,163 似乎有时候不稳定, 几个中国大学的源有些是 ipv6 的,用不了。 安装完成后,这个配置文件也会自动拷贝到新系统中。 自带的 vi 真的是比 vim 难用多了,一会儿第一时间换掉。

    按照官网说明,用 # pacstrap /mnt base base-devel 安装基本系统, base-devel 也一并装上,迟早会用到 AUR 或 ABS。 提示共 128 个软件包,需要下载 158.37M 内容,安装完成后是 507.09M。

    安装 grub: # arch-chroot /mnt pacman -S grub

    生成 fstab: # genfstab -p -U /mnt >> /mnt/etc/fstab , 然后更改 fstab (系统默认一般就比较好了,不优化也行):

    • 使用 relatime 挂载参数。

      以前是推荐增加 noatime 挂载参数,不记录文件读取时间, 但这会导致 Mutt 等需要文件读取时间的软件出错。 现在改为使用 relatime 参数了 (已经默认加上了,Linux 2.6.30 起此参数成为默认值), 只有在文件读取时间早于文件更新时间时,才更新读取时间数据。

    • 使用 nodiratime 挂载参数,不记录目录读取访问时间。

    • /tmp 放到 tmpfs 上去。(没单独分区,免了)

    • 不再使用 discard 挂载参数。

      这个参数主要是针对 SSD 硬盘的,对不支持 TRIM 的机械硬盘无效, 对U盘貌似作用不明显。

    • 不再使用 async 挂载参数,开启异步读写模式。 由于只是“看起来”快了,实际数据写入速度并没有改善, 考虑到稳定性,是否应使用此参数?

    • 不要使用 barrier=0 挂载参数,这个选项似乎在突然断电、 拔U盘时,有几率丢失文件或损坏分区。 (基于我的经历 + 参考

    由于不会跑什么大应用,为了降低 swap 的使用频率, 修改 /mnt/etc/sysctl.conf

    vm.swappiness = 1
    vm.vfs_cache_pressure = 50

    前一句是尽量不使用 swap,后一句是缓存文件系统信息。

    下面的操作可以在 chroot 环境下运行:

    # arch-chroot /mnt

    设置 hostname: echo 'f004' > /etc/hostname

    设置时区:

    # ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    新建 /etc/locale.conf 内容为:

    LANG='en_US.UTF-8'
    LC_COLLATE='C'
    LC_MESSAGES='C'

    编辑 /etc/locale.gen ,取消 en_US.UTF-8, zh_CN.UTF-8, zh_TW.UTF-8 前面的注释,然后执行 locale-gen 命令。

    更改 root 密码: passwd root

  • 安装 Grub 引导系统。

    仍然在 chroot 环境中操作。 编辑 /etc/mkinitcpio.conf ,检查 HOOKS 段, 让 block 参数紧挨着 udev 参数之后(早一点加载), 然后 # mkinitcpio -p linux 生成 img 文件。 同时加上了 shutdown 参数,作用以后再试。 resume 参数就算了,U盘本来就小、慢,支持休眠更痛苦。 (注:新版本中 block 参数替代了 usb pata sata scsi 等一众参数)

    安装 grub:

    # grub-install --target=i386-pc --recheck --boot-directory=/boot --no-floppy /dev/sdc
    # cp -v /usr/share/grub/{unicode.pf2,ascii.pf2} /boot/grub/
    # cp -v /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo

    无论是 32 位还是 64 位系统,都是使用 --target=i386-pc 参数, --no-floppy 是不检查软驱(这玩意儿现在应该没人用了)。 后两句不执行也行,还没弄懂是做什么的。

    然后,千万不要忘记 生成 grub.cfg 文件

    # grub-mkconfig -o /boot/grub/grub.cfg
    # grep 'set=root' /boot/grub/grub.cfg
    # blkid /dev/sdc2

    现在的 Grub2 使用 UUID 来找硬盘分区, 后两句就是检查新生成的 grub.cfg 使用的分区 UUID 和硬盘是否相符。 如果忘记生成 grub.cfg 了,可以再次用光盘启动进去做。

    最后,退出 chroot 环境,umount,重启。 启动U盘可以收起来了。

    启动后,新安装的U盘变成了 /dev/sdb, 此时最好将 mkinitcpio grub-install grub-mkconfig 重新做一遍, 否则有可能在下次或另外一台机器上启动时,损坏分区表,丢失文件。 或许没有道理,但这是我重复安装好多次以后的感觉,可能有以下原因:

    • 带电插拔,可我都是 umount 了啊,不应当这么脆弱。
    • 被 USB 3.0 高电流给破坏了,没拔U盘烧了算我走运? 倒是听说过 USB 3.0 损坏U盘数据。
    • /boot 原先没有单独分区,这个不应该。
    • 是原先使用 GPT 分区在 BIOS 电脑上水土不服? U盘难道就不能用 GPT 分区么?

    反正换回 MBR 分区后,貌似比较正常了。

初始设置

如果一切正常,现在可以用 root 登录系统了:

# uname -a
Linux f004 3.9.9-1-ARCH #1 SMP PREEMPT Wed Jul 3 22:52:05 CET 2013 i686 GNU/Linux
 
# free -h
            total   used    free    shared  buffers cached
Mem:        1.0G    54M     951M    0B      5.6M    27M
-/+ buffers/cache:  21M     984M
Swap:       0B      0B      0B
 
# df -h
Filesystem      Size    Used    Avail   Use%    Mounted on
/dev/sdb3       3.9G    764M    3.1G    20%     /
dev             499M    0       499M    0%      /dev
run             503M    7.1M    496M    2%      /run
tmpfs           503M    0       503M    0%      /dev/shm
tmpfs           503M    0       503M    0%      /sys/fs/cgroup
tmpfs           503M    0       503M    0%      /tmp
/dev/sdb4       2.5G    3.8M    2.4G    1%      /home
/dev/sdb3       96M     39M     58M     41%     /boot

安装U盘拿掉后,这个U盘就成为 /dev/sdb 了。

  • 配置有线网络。

    没网络的时候,可以直接设定ip应急,后面 netctl 才是正规设置:

    # ip addr add 192.168.0.100/24 dev enp0s4
    # ip link set dev enp0s4 up
    # ip route add default via 192.168.0.1
    # echo nameserver 208.67.222.222 >> /etc/resolv.conf

    觉得设备名 enp0s4 不习惯,也可以在 udev 中改名(重启生效):

    # cat /etc/udev/rules.d/10-network.rules
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:50:70:a2:49:7d", NAME="eth0"

    如果使用 dhcd 动态分配地址:

    # dhcpcd        # 自动让 eth0 获取 IP
    #               # 或者配置成服务自启动(更加方便)
    # systemctl enable dhcpcd@eth0
    # systemctl start dhcpcd@eth0

    如果使用静态地址,现在是用 netctl 进行管理:

    # pacman -S ifplugd
    # systemctl disable dhcpcd@eth0
    # systemctl stop dhcpcd@eth0    # 要停掉 DHCP,不然有干扰
    # cd /etc/netctl
    # cp examples/ethernet-static home
    # vi home           # 设置我的静态 IP 设置 profile
    # systemctl enable netctl
    # 重启一下,清除刚才的临时 IP 设置
    # netctl start home
    # netctl enable home

    如果要快速切换网络环境, 再在 /etc/netctl/ 下建立一个新的 profile 文件, 用 netctl switch-to PROFILE 来进行切换,会自动停掉旧的。 更详细的可以看 我以前写的 netctl 如何选择 profile

  • 安装 vim,默认的 vi 实在是用不惯:

    # pacman -S vim
    # pacman -R vi
    # ln -s /usr/bin/vim /usr/bin/vi
  • 关闭 PC 小喇叭。

    这个实在是太烦人了,在启动时就禁用:

    # cat /etc/modprobe.d/nopcspkr.conf
    blacklist pcspkr

    这个文件需要自己创建。

  • 安装 ntp 自动更新时间

    # pacman -S ntp libedit
    # systemctl enable ntpd
    # systemctl start ntpd

    另外,Arch 建议在 /etc/ntp.conf 中添加 iburst 参数,比如:

    server 0.pool.ntp.org iburst
    server 1.pool.ntp.org iburst
    server 2.pool.ntp.org iburst
    server 3.pool.ntp.org iburst

    检查 ntpd 同步情况:

    # systemctl restart ntpd
    # ntpq -np

    时间同步完成后,用 hwclock -w 写入硬件时钟。

  • 创建普通用户。

    # useradd -m fwolf
    # passwd fwolf

    通常,这个用户我们要赋予 sudo 权限:

    # pacman -S sudo
    # cat /etc/sudoers.d/fwolf_sudo_conf
    Defaults    env_reset
    Defaults    secure_path="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
    fwolf   ALL=(ALL:ALL) ALL
    %admin  ALL=(ALL) ALL
    %sudo   ALL=(ALL:ALL) ALL
    # chmod 0440 /etc/sudoers.d/fwolf_sudo_conf

    注意, /etc/sudoers.d/ 下的文件,名称带有 ~ 或者 . 的不会生效, 参见 CentOS – 0005017: The #includedir directive in sudoers does not work , 文件属性也必须是 0440 。

  • 安装 Yaourt

    /etc/pacman.conf 中添加:

    [archlinuxfr]
    SigLevel = Never
    Server = http://repo.archlinux.fr/$arch

    然后 pacman -Sy yaourt 完成安装。

  • 安装其他常用工具

    bash-completion ctags git htop openssh subversion tk

图形系统

由于U盘要带着到处跑,所以图形驱动一定是什么都有。 也不追求多么花哨的界面效果,简洁明快,所以选择 LXDE+Fluxbox 。

  • 字符界面分辨率

    默认进入字符界面后,分辨率是最大分辨率,如果要另行指定, 可以修改 /etc/default/grub

    GRUB_CMDLINE_LINUX_DEFAULT="quiet video-1024x768M@75m"

    然后 grub-mkconfig -o /boot/grub/grub.cfg 重新生成 grub 配置文件。

  • 默认点亮 Numlock

    需要用到两个命令:系统自带的 setleds 和 通过 pacman 安装的 numlockx。

    要在字符界面下打开 Numlock,可以在 $HOME/.bashrc 中添加:

    # Numlock
    if [ -x /usr/bin/setleds ]; then
        for tty in /dev/tty{1..6}; do
            /usr/bin/setleds -D +num < /dev/tty > /dev/null 2>&1
        done
    fi

    这样设置会在登录之后自动打开 Numlock,若要登录之前就打开,可以参照 Arch Wiki 将上述内容添加到 /etc/rc.local 或者 /etc/inittab , 但不如跟着用户配置容易备份。

    要在 X 下打开 Numlock,可以在 $HOME/.xinitrc 中添加:

    # Set numlock
    if [ -x /usr/bin/numlockx ]; then
        /usr/bin/numlockx on
    fi
  • 安装 xorg 和显卡驱动

    • Xorg: xorg-server xorg-xinit xorg-server-utils mesa
    • 显卡驱动:xf86-video-ati xf86-video-intel xf86-video-nouveau nouveau-dri
    • 笔记本触摸板支持:xf86-input-synaptics
    • 测试 X 工作是否正常:xorg-twm xorg-xclock xterm

    现在可以用 startx 启动 X 看到简陋的图形界面了。 如果想用 Ctrl+Alt+Backspace 关闭 X,需要在 /etc/X11/xorg.conf.d/10-evdev.conf 中增加一段:

    Section "InputClass"
        Identifier "Keyboard Defaults"
        MatchIsKeyboard "yes"
        Option "XkbOptions" "terminate:ctrl_alt_bksp"
    EndSection
  • 安装 LXDE & Fluxbox

    • LXDE 组的所有包
    • Fluxbox
    • 监测文件系统变化的 Gamin
    • 常用软件:leafpad obconf epdfview

    配置一个简单的 $HOME/.xinitrc ,从 /etc/skel/.xinitrc 复制一份, 然后添加:

    #xrandr -s 1024x768 # 如果需要的话,提前指定分辨率
    exec startlxde

    现在都是液晶的天下,很少出现分辨率刷新率超出界限不显示的情况, 命令行下的分辨率可以用自动,嫌字小上面有修改 grub 设置的方法, 图形下 LXDE 也支持 auto 分辨率,一般也都自动设置好了。

    为了把 Openbox 换成 Fluxbox,需要修改 /etc/xdg/lxsession/LXDE/desktop.conf

    [Session]
    window_manager=fluxbox
  • 中文相关

    • 基本字体 ttf-dejavu artwiz-fonts wqy-microhei

    • 输入法 fcitx-im fcitx-configtool fcitx-fbterm ,在 $HOME/.xinitrc 里添加:

      export GTK_IM_MODULE=fcitx
      export QT_IM_MODULE=fcitx
      export XMODIFIERS="@im=fcitx"
    • 字体配置,把原先用的其他常用字体和配置文件都搬过来了, 就是 $HOME/.fonts 目录,Ubuntu 下用的很好,这里也可以直接用。 把 $HOME/.fonts/fonts.conf 链接为 /etc/fonts/local.conf 即生效, 然后修改 /etc/fonts/conf.avail 下的 40-nonlatin.conf60-latin.conf 将 SimSun 或者其他你喜欢的字体设置为首选字体, 最后 $ fc-cache -vf 更新下字体缓存,重启 X 就可以了。

至此,一个基本的、具备图形界面的 Arch Linux 就安装完成了, pacman -Scc 清理一下,已安装程序占用空间约 1.4G。 总体感觉,运行速度受U盘读写速度影响非常大,有时候会卡。

……大约反复两周后,经历了无数次的重装,我终于下了结论: U盘上的 Linux 系统除非只以只读方式使用,否则几乎没有可用性。 大概是因为重启、关机时,umount 总是等不及U盘的灯闪来闪去, 就强制重启或关机了,然后文件系统未正常 umount, 然后就是文件系统损坏,一修复都是文件丢失,损坏的 inode。 难道是因为我的U盘质量不好么? 不管怎样,拿这个做随身系统的想法破灭了, 还是磁介质的机械硬盘靠谱一点。

Ubuntu升级到9.04 Jaunty的变化和遇到的问题

  • 长按键盘自动连续击键的间隔缩短了。
  • 显卡驱动没有问题,终于能够摆脱8.10里像涂了墨水一样的中文字乱码了。
  • Firefox的速度好像也快了不少,或许也是显卡驱动的原因?
  • Fluxbox apps文件中Position设置LOWERLEFT/BOTTOMLEFT原来时从屏幕最下方算间距,现在时从工具栏上方开始算,所以原来的值要减去工具栏的高度(25)。
  • 消失很久的启动时的Splash屏又回来了,不过是Xubuntu的小老鼠(我用的WM是Fluxbox),想取消的话,删掉usplash及其相关的包即可。

如果在没有正式发布的时候就升级了,每天的更新比正式发布后要多得多,每天都要下载一大堆包升级,得考虑好,当然你也可以忍着不频繁升级。

Fluxbox任务栏上当前聚焦的窗口和其他窗口的风格是一样的,区分不开了,更换任何styles都无效。

Firefox窗口的标题栏里中文字显示为方块

先这个是Gnome的问题,所有窗口标题栏中包含中文时都是方块,而Fluxbox工具栏上是能够正确显示中文的。尝试更换不同的fluxbox styles发现menu.title.font设置为dejavu字体时窗口标题栏就能正常显示中文了,其他的窗口内容、网页中文全部显示正常。

终于让我找到原因了,又是一个哭笑不得的问题,在我自定义风格里,使用了dejavusans这个字体,而这个字体现在好像在系统中找不到了,因此它就像出错后就不再往下执行了一样,导致后面overlay里定义的新字体也不生效,窗口栏上的中文就成方块了。换其他style之所以能正常显示窗口标题栏上的中文,是因为他们没用dejavusans这个字体。最后的解决方案,把这个自定义style里的dejavusans替换成dejavu -_-!

字体大小dpi优化

字体DPI设置会根据显示器进行优化,而不再局限于默认的96DPI,还可以在System → Preferences → Appearance → Fonts → Details里自行定义。原来是在.Xresources里设置的Xft.dpi:96,不知道还有用没。目前发现的问题是窗口标题栏中的文字比以前大了一些。

我的Fluxbox还遇到了一个问题,屏幕尺寸、位置计算出现了错误,原先我是/etc/gdm/Init/Default中用xrandr -s 1024x768强制重设分辨率,现在把这行禁用后发现桌面的“尺寸”比1024大,鼠标移动到屏幕边缘后会自动移动,但显示不全。

	$ xdpyinfo |grep resolution
	  resolution:    78x78 dots per inch

78是显示器真正的dpi数,但按这个设置又显得字太小了。最后,把xorg.conf里大于1024的分辨率都删掉,这样就可以去掉上面xrandr那句了,显示也正常了,dpi仍然用的是96。

上某些网站中文字模糊(像粗体字那样的模糊)

打开/etc/fonts/conf.d/44-wqy-zenhei.conf,找到下面这行:

	<edit name="antialias" mode="assign"><bool>true</bool></edit>

把true改成false后重启X即可。

Ctrl+Alt+Backspace关闭X的组合键被禁用了

编辑/etc/X11/xorg.conf,在最后加上:

	Section "ServerFlags"
		Option "DontZap" "no"
	EndSection

Ubuntu从Gutsy升级到Hardy,php5-sybase又掉链子

升级非常简单,/etc/apt/source.list中的gutsy替换为hardy,然后aptitude updateaptitude safe-upgradeaptitude dist-upgrade,下载一大堆包安装半天就完事了,不过和以前几次升级一样,hardy中自带的php5-sybase 5.2.4-2ubuntu5.1还是不支持sybase:

[12-Jun-2008 09:13:13] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20060613+lfs/sybase_ct.so' - /usr/lib/php5/20060613+lfs/sybase_ct.so: cannot open shared object file: No such file or directory in Unknown on line 0

没办法,再修改源,降级回Gutsy中的5.2.3:

$ sudo aptitude install php5-sybase=5.2.3-1ubuntu6.2 php5-gd=5.2.3-1ubuntu6.2 php5-mysql=5.2.3-1ubuntu6.2 php5-tidy=5.2.3-1ubuntu6.2 php5-sqlite=5.2.3-1ubuntu6.2

我试过,装上这个5.2.3的sybase,也就是sybase_ct.so,是不能配合php 5.2.4使用的,只能保持php暂时不升级。

另外,这样弄了以后,php的tidy扩展不可用了,好在tidy不是必须的。

烦人的sybase。

Update @ 2008-06-13

LG未来窗775FT显示器被正确识别成了LG 775FT,不过fluxbox中默认的高分辨率可受不了,在gdm的init中用srandr设一下分辨率,修改/etc/gdm/Init/Default,在末尾的exit 0前面加上:

xrandr -s 1024x768

Gnome、GDM的分辨率一般可以在/etc/X11/xorg.conf中调整,不过fluxbox不认,只能用xrandr。

这次换了块GeForce4 MX 440 with AGP8X显卡,安装省事多了:

sudo aptitude install nvidia-glx
sudo nvidia-xconfig

驱动启用之后的logo也有变化,原来是白底色的,现在是灰色底色,反而不如以前的好看。

由于换了内核,virtualbox也要升级,并且前提是内核的header包要安装,不然vbox模块编译失败,软件能启动虚拟机却是无法启动的:

sudo apt-get install build-essential linux-headers-`uname -r`

另外由于pulseaudio的原因,目前还是个聋子。。。不过家里电脑升级后alsa一点也不受影响,原因复杂而又未知 🙁

Update @ 2008-06-14

changelog里查到关于sybase_ct的两处变更:

-- dAniel hAhler <ubuntu@thequod.de>  Wed, 19 Dec 2007 10:48:04 +0100
php5 (5.2.4-2ubuntu1) hardy
* Fixes sybase_ct for MS SQL (LP: #21995)

Bug #21995 in php5 (Ubuntu)

-- sean finney <seanius@debian.org>  Sun, 16 Sep 2007 14:46:06 +0200
php5 (5.2.4-1) unstable
* Switch php5-sybase to use the mssql extension instead of the sybase_ct
    extension.  Closes: #418734, #329065.

(后两个bug id是debian的:#418734, #329065,参见Debian Changelog php5

为什么总要把sybase和mssql往一起扯呢,分明是不一样的东东,再往下翻,和sybase有关的改动最早也是2004、2003年的了,要不说sybase可怜呢,不冤枉。经常看看这里,看什么时候才能把sybase_ct.so加上吧。

现在弄得php怪怪的,gregarius总是没法update: Segmentation fault,可能也是和版本混合有关系;升级到最新的5.2.4-2ubuntu5.1就好了,可这时sybase_ct.so又没了。

Update @ 2008-06-15

没有声音的问题终于解决了,绕了一大圈,先调了半天pulseaudio,后来没弄好,干脆卸载了,然后发现真正的问题是没有找到声卡硬件,即使这样,pulseaudio也不再装了,看网上兼容问题挺多了,还是先用alsa,等成熟了再用pa。

没有声卡硬件的问题,我的机器是Dell GX620:

00:1e.2 Multimedia audio controller: Intel Corporation 82801G (ICH7 Family) AC'97 Audio Controller (rev 01)

先怀疑是alsa的问题,按照HdaIntelSoundHowto重新编译了alsa,未果,后来从怀疑alsa转为怀疑声卡硬件,因为lsmod里面没有任何关于snd相关的内容,进而再转为怀疑内核,终于翻到了Ubuntu 8.04下AC97声卡驱动问题的解决,安装linux-ubuntu-modules-2.6.24-19-generic,重启,然后就好啦。804看来升级跨度有点大,用的新东西有点多,以前都不用安装ubuntu-modules包的。

php5-sybase的问题提交了个bug report,看有没有人搭理。

Update @ 2008-07-28

如上,如果声音有问题出不来的话,海内扎绵羊游戏会有问题,只见羊跑见不到扎中没扎中,也不出成绩板。装好ubuntu-modules后重启马上就好了。

安装配置fluxbox桌面环境

安装

基本系统Ubuntu 7.10 Gutsy,Xfce桌面。直接安装源里的fluxbox:

aptitude install fluxbox

版本1.0.0-1,大小只有1058k。安装完成后,检查一下/usr/share/xsessions/fluxbox.desktop文件,里面已经有Exec=/usr/bin/startfluxbox,不用修改了。重启X,(应该会自动创建~/.fluxbox/startup配置文件。

在X登录界面,Sessions选择Fluxbox,并设置为默认session。输入用户名密码进入系统之后,只看见一个光板的桌面,下面有一条工具栏,想截屏来着,可按PrintScreen键没反应,作罢。不过说真的,进入桌面的速度真的很快。工具栏上点右键可以调出工具栏的设置,桌面上点中键可以调出虚拟桌面的设置,但在桌面上点右键没反应,原来是fluxbox默认配置的问题(害我瞎折腾半天)。

菜单

fluxbox安装完成后默认的菜单配置文件~/.fluxbox/menu内容如下:

[begin] (fluxbox)
[include] (/etc/X11/fluxbox/fluxbox-menu)
[end]

而include的这个菜单文件根本就不存在,所以就没有菜单出现喽。现在我来手工加点内容吧:

[begin] (fluxbox)
[exec] (Firefox) {/usr/bin/firefox}
[exec] (Bash) {x-terminal-emulator -T "Bash" -e /bin/bash --login}
[include] (/etc/X11/fluxbox/fluxbox-menu)
[end]

现在,不用重启或重开X,在桌面上点右键,怎么样,一个小小的菜单出来了吧,内容只有两项:Bash和Firefox,选中后会打开相应的程序。不过真要这样一个一个的把菜单配置全可就累死了,本来fluxbox自带一个菜单生成程序fluxbox-generate_menu的,但在Gutsy中没有,虽然它只是一个脚本,可以自己去下载一个单独用,不过手动一下:

sudo update-menus

然后再重启Fluxbox就好了,根据当前系统中原有桌面系统(比如Gnome、Xfce)软件安装情况,自动把menu项建好了,生成了刚才缺少的/etc/X11/fluxbox/fluxbox-menu这个文件。

利用这种方式,或者使用fluxbox-generate_menu的好处就是可以随系统中软件安装情况变化,再搭配个人的一些优化设置,使用起来就更顺手了。

关机与重启

Fluxbox菜单中的restart和exit分别对应“重启窗口管理器”和“退出X,回到GDM界面”,没有直接关机或重启的选项,需要自己手工添加:

[submenu]
    [exec] (Reboot System) {sudo /sbin/shutdown -r now}
    [exec] (Reboot System) {sudo /sbin/reboot}      #和上面一句作用相同
    [exec] (Shutdown System) {sudo /sbin/shutdown -h now}
[end]

先别着急用,命令不都带着sudo了么,还要赋予用户不需密码就能够使用/sbin/shutdown的权限,修改/etc/sudoers,添加:

Cmnd_Alias REBOOT = /sbin/reboot
Cmnd_Alias SHUTDOWN = /sbin/shutdown

fwolf ALL=(ALL) NOPASSWD: REBOOT, SHUTDOWN

再调用关机或重启,虽然使用到sudo,也不再需要输入密码,而是直接就执行了。(参考1参考2

如果一定要需要用户输入自己的密码才能关机的话,也是可以实现的,那就是通过shell来执行sudo,在新开的shell窗口中会提示用户输入sudo时的密码,输入密码不正确时就拒绝执行sudo了,比如这样(参考):

[exec] (Shutdown) {konsole -T "Shutdown" -e sudo shutdown now -h}
[exec] (Shutdown) {gnome-terminal -t "Shutdown" -e "sudo shutdown now -h"}
[exec] (Shutdown) {xfce4-terminal -t "Shutdown" -e "sudo shutdown now -h"}

挂起与休眠

首先安装hibernate,源里有的,然后用root命令运行hibernate或者hibernate-disk就是休眠(信息写入磁盘,不耗电),运行hibernate-ram就是挂起(信息写入内存,会耗一点点的电)。如果运行了gnome-power-manager(在状态栏上会有电池图标),就可以设定合上笔记本时就休眠。菜单项和sudoers文件的修改和上面的关机和重启一样:

Cmnd_Alias SUSPEND = /usr/sbin/hibernate-ram
Cmnd_Alias HIBERNATE = /usr/sbin/hibernate-disk

fwolf ALL=(ALL) NOPASSWD: REBOOT, SHUTDOWN, SUSPEND, HIBERNATE

感觉挂起没有休眠好用,有时候从挂起状态恢复时会死掉,得重启X。

rxvt-uincode的daemon模式

超节省资源的fluxbox当然要搭配同样节省资源的rxvt-unicode来使用才更好,rxvt-unicode的daemon模式就更好了,可以在菜单中这样配置:

[exec] (rxvt-unicode) {urxvtc "$@"; if [ $? -eq 2 ]; then urxvtd -q -o -f; urxvtc "$@"; fi}

这样就可以自动启动守护程序urxvcd了(参见官方文档)。使用中rxvt-unicode到gedit或者scribes这样的程序粘贴内容有点问题,Ctrl-V不管用,不过用鼠标中键可以粘贴过来,而Shift+Insert只在rxvt-unicode里起作用。也有人说可以用autocutsel来同步两个剪贴板。

其它设置

快捷键

快捷键设置的默认定义文件为$HOME/.fluxbox/keys,注意Mod1代表Alt, Control代表Ctrl, Mod4代表Windows键,Mouse2是鼠标中键,Mouse4、5则是鼠标滚轮下滚、上滚。比如音量调节:

Control Mod1 Up :Exec amixer sset Master 1+ unmute
Control Mod1 Down :Exec amixer sset Master 1- unmute
Control Mod1 Left :Exec amixer sset Master mute

界面字体

默认设置下,如果菜单中有中文,那么配置完成后只能看见两个小方框,这并不是说fluxbox菜单不支持中文,而是字体没设置好。其它窗口标题栏等地方的中文也是类似的情况。可以在$HOME/.fluxbox/overlay文件中设置字体、字号的选项(这个文件的本来作用是定义Style切换中的保留设置),比如如下的内容:

# 菜单标题的字体
menu.title.font: Simsun-10
# 菜单组标题的对齐方式
menu.title.justify: center
# 菜单项目的字体
menu.frame.font: Simsun-10
# 菜单项目的对齐方式
menu.frame.justify: left
# 窗口标题栏文字的字体
window.font: Simsun-10
# 窗口标题栏文字的对齐方式
window.justify: center
# 窗口标题聚焦时的背景颜色|5/5/f
window.label.focus.color: rgb:4e/8f/cf
window.label.focus.colorTo: rgb:4e/8f/cf
# 时钟的字体
toolbar.clock.font: Simsun-10
# 工作区名称的字体
#toolbar.workspace.font: Simsun
# 图标栏的字体
toolbar.iconbar.focused.font: Simsun-10
toolbar.iconbar.unfocused.font: Simsun-10

字体名称后面-11为字体大小,再后面跟:bold表示黑体显示,中间都没有空格。

自启动程序

自启动程序可以在$HOME/.fluxbox/startup中配置,写在exec /usr/bin/fluxbox一句的前面,并且**一定要在后面加上表示后台运行的&符号。比如为了优化GTK程序的运行,可以加上:

GSDPID=`pidof gnome-settings-daemon`
if [ "x$GSDPID" == "x" ]; then
    gnome-settings-daemon &
fi
gnome-power-manager
gnome-volume-manager -daemon=yes &

gnome-power-manager是电源管理程序,用来管理笔记本的电源,台式机可以不用;gnome-volume-manager则是卷管理器,只有加载了它,插入u盘或者移动硬盘之后才能自动挂载。

程序属性apps

$HOME/.fluxbox/apps这个文件我还是第一次见过,它可以定义窗口的各项属性,比如:

[app] (name=xfce4-terminal)
[Position]  (LOWERLEFT) {0 55}
[end]

[group]
    [app] (name=urxvt) (class=URxvt)
        [Position] (LOWERLEFT) {0 25}
[end]

第一个[app]是定义了程序xfce4-terminal启动时的窗口位置为相对于屏幕左下角0,55的坐标,这样每次启动程序的时候就不用再手工移动窗口到自己舒服的位置了。fluxbox没有gnome那样窗口自动dock到屏幕边缘的功能,这算是另外一种方式的补充。

第二个[group]则是定义在本group范围之内的app,启动之后自动tab到一起,tab是fluxbox的特有功能,有点类似xfce4-terminalgnome-terminal开多个tab的功能(我也正是利用这点来模拟rxvt-unicode的多tab),这样打开多个rxvtc的时候,就自动tab到一个窗口去了,不用再手工按鼠标中键把一个标题栏拖到另外一个标题栏上。如果再在keys文件中配上Ctrl+PageDown切换到下一个Tab的功能:

Control Prior :PrevTab
Control Next :NextTab

多Tab shell窗口功能就近乎完美了,几乎可以完全淘汰xfce4-terminal了(字体颜色设置上还略有些不太习惯)(这样还把xfce4-terminal自身的tab切换功能给屏蔽了,调成用Mod1/Alt来组合也不错)。如果你想,在group中加上其它程序也是可以的。

apps文件很重要,不过如果手工在设定窗口保存属性的话,会被系统自动改写,为了保存手工编写代码的美观性,可以把这个文件的属性设置为444,编辑时再用w!强行写入。

桌面图片随机轮换

这一点简直太适合我了,我就喜欢设定一个目录,用里面的图片随机作为桌面,只需要把下面这个命令仍到crontab里就可以了:

env DISPLAY=":0.0" fbsetbg -F -R /path/to/your/wallpaper/

注意这个目录中不能有非图片文件。记得安装feh,虽然不装的话也能用,装上以后图片显示速度和拉伸效果都更好一些。

参考

Update @ 2007-12-16

安装了feh之后,发现mutt看邮件的图片附件时也会自动调用它,并且速度与效果比原来的imagemagic要好得多。

Update @ 2008-01-25

apps文件中要用到的窗口class可以用xprop查询到。