2
23
2012
8

迁移到64位 Arch Linux

曾经因为不了解,所以一开始选择了32位系统;后来内存大了,ArchLinux 的内核没有编译PAE支持,只能用 3GiB 多的内存,不爽。朋友又给了这篇教程,于是略作准备就开始动手了。

可是,但我真正动手时,那篇文章已经被另一篇英文教程取代了。当时忘记了 MediaWiki 会记录所有的编辑历史,所以只好将就着看了。结果,重启时 udev 没跑起来,说找不到 librt.so。我当然不会就此罢休,花费了一些时间,不仅拯救了系统,成功迁移到了 64 位,而且确定了 ArchWiki 上那篇教程的错误。

先说这个错误吧。现在已经修正了。方法 2: 从正在运行的系统一节,在安装 busybox 的时候,现在是一个红色的警告框,暗示着这里曾经发生的悲剧——

警告: 不要现在安装 lib32-glibc 软件包。在执行命令 ldconfig 后,当你安装 linux(内核)时,生成的镜像文件中,librt.so 等库文件会在 /usr/lib32 目录下,启动的时候二进制文件不会在此搜索库文件,导致启动失败。

当悲剧发生后,我有些紧张地拿出移动硬盘,先是进入移动硬盘上的 Arch,胡乱安装了几个 64 位软件包并重新生成 initramfs,结果连 init 也执行不了了。无奈我又启动64位内核的 PartedMagic chroot 进去查看。但是,chroot 失败了:

sh: cannot open shared object file

后来我才知道,因为我安装lib32-glibc/lib/ld-linux.so.2发生冲突,我覆盖了;后来卸载 32 位的 glibc 时,它被删除了。于是,动态链接的 32 位程序没有动态库加载器了。但其实还是有办法的,因为被误删的只是个软链接。

/usr/lib32/ld-linux.so.2 /bin/ls

老猫的提示下,手动指定ld-linux.so.2运行成功。我尝试把它链接过去,这个 32 位与 64 位库混合的系统开始有些可用了。接下来按 Wiki 里的指示操作就可以了。不过,我没有重装全部的库,而是只装了标明 i686 架构的库。这就是我之前那个用 Haskell 写的脚本的目的。不过还是出了点小问题——虽然我为防止程序运行不了而在开始之前把软件包列表生成了一份保存起来,但我忘了我的 HOME 是加密过的。PartedMagic 里没有 eCryptfs 工具,而 Arch 里的那个又因为库的原因运行不了,囧死了。。。幸运的是,我在迁移之前把 Dropbox 弄好同步了一遍,这个软件包列表也同步了。通过 Dropbox 网页界面下回来就好了。

弄好重启之后,整个事情还没完——我从 AUR 里编译安装的那些包还没重装呢。边重装边研究新的 64 位系统,发现 gcc 还是可以编译出 32 位程序的,只是要装gcc-multilib而已。现在可好了,既可以运行 64 位的程序,又可以运行 32 位的。库依赖少的 C 程序编译个 32 位的出来也没问题。

对了,最后说一句,vnstat 这厮的数据库格式竟然是平台相关的!换成 64 位后它就不断报错,直到我删除了以前的数据库。

Category: Linux | Tags: arch linux
12
18
2011
7

在 Arch 上使用 PulseAudio

一直不怎么懂关于音频的配置,所以一直没管这方面,直到遇到小麻烦。我把gnome-volumn-control干掉之后,发现音量无法调到 100% 以上了,某些视频音量太小听不清。这才第一次正视音频配置。

其实也说不上有多么「正视」,因为我只是在 ArchWiki 上找了几条命令执行了下而已。

安装了以下软件包:

  • pulseaudio-alsa, 就一个配置文件,用处不明
  • pamixer-git. 命令行调节音量用的,Awesome 音量 widget 改用这个了
  • pavucontrol, 图形界面的音量调节工具。更新后的 Awesome 音量 widget 上点右键运行它,可以针对不同的程序进行调节

另外,在 mplayer 的配置文件中加了ao=pulse这行。

就这些了。

Category: Linux | Tags: Arch linux awesome 音频
12
5
2011
13

Awesome 调节音量不再依赖 GNOME

之前一直在用 gnome-sound-applet 来调节音量。今天终于脱离了它。

GNOME 越来越臃肿了。今天系统出了点小问题,查看日志时再次看到 dbus 报怨 NetworkManager 没有运行的错误。我是直接用的 ArchLinux 的network服务连网的,根本不需要 NetworkManager 掺和,可是自己要用 Empathy,而它奇迹般地依赖 NetworkManager。。。虽然试了下强制卸载,最后只成功pacman -Rdd几个其它的包,没能在保证 Empathy 能用的前提下干掉 NetworkManager,心中多有不甘。于是开始打 gnome-sound-applet 的主意。

gnome-sound-applet 这东西是 gnome-control-center 的一部分,其依赖了 15M 左右的奇怪 GNOME 组件。这个 applet 也很鸡肋,本来是显示和调节音量用的,结果黑黑的图标在我的灰色 Awesome 面板上并不容易找到,花了良久才习惯。另外就是,该图标本身不提供任何信息,查看音量时需要把鼠标悬停过去,心中多有不爽。好在今天这些问题一并解决了。

参考来源是 Awesome Wiki 的这个页面,不过这里的代码太老了,不能用,自己参照rc.lua的其它部分以及 wiki 和 reference 修改之后才能用。最终的效果是这样子的:

Awesome widgets 截图

你应该很容易能猜到最右边的就是音量控制了,因为它前边有个八分音符符号“𝅘𝅥𝅮”。鼠标操作很简单:单击切换静音,上下滚动调节音量。静音时百分号会被红色的“M”取代。

贴代码:

-- {{{2 Volume Control
volume_cardid  = 0
volume_channel = "Master"
function volume (mode, widget)
  if mode == "update" then
    local fd = io.popen("amixer -c " .. volume_cardid .. " -- sget " .. volume_channel)
    local status = fd:read("*all")
    fd:close()

    local volume = string.match(status, "(%d?%d?%d)%%")
    volume = string.format("% 3d", volume)

    status = string.match(status, "%[(o[^%]]*)%]")

    if string.find(status, "on", 1, true) then
      volume = '𝅘𝅥𝅮' .. volume .. "%"
    else
      volume = '𝅘𝅥𝅮' .. volume .. '<span color="red">M</span>'
    end
    widget.text = volume
  elseif mode == "up" then
    io.popen("amixer -q -c " .. volume_cardid .. " sset " .. volume_channel .. " 5%+"):read("*all")
    volume("update", widget)
  elseif mode == "down" then
    io.popen("amixer -q -c " .. volume_cardid .. " sset " .. volume_channel .. " 5%-"):read("*all")
    volume("update", widget)
  else
    io.popen("amixer -c " .. volume_cardid .. " sset " .. volume_channel .. " toggle"):read("*all")
    volume("update", widget)
  end
end
volume_clock = timer({ timeout = 10 })
volume_clock:add_signal("timeout", function () volume("update", tb_volume) end)
volume_clock:start()

tb_volume = widget({ type = "textbox", name = "tb_volume", align = "right" })
tb_volume.width = 35
tb_volume:buttons(awful.util.table.join(
  awful.button({ }, 4, function () volume("up", tb_volume) end),
  awful.button({ }, 5, function () volume("down", tb_volume) end),
  awful.button({ }, 1, function () volume("mute", tb_volume) end)
))
volume("update", tb_volume)

记得把 tb_volume 加到 wibox 里去。

这里是我的整个 Awesome 配置。

2013年3月11日更新:Awesome 3.5 版本语法变化较大,请到我的 github 上查看相关代码。

Category: Linux | Tags: arch awesome gnome Lua linux
11
9
2011
14

在 Arch 上启用 NTP 服务对时

一日即将按算好的时间外出。将系统挂起,出门时检查下手机,却郁闷地发现电脑时间又慢了!十几分钟啊。。。。

我的手机是和移动运营商的网络时间同步的,因此不出事故它是可靠的。看来电脑的时钟也应该同步下了,不然过段时间要手动调下。

毫不犹豫地在ArchWiki里搜索NTP,按wiki进行操作。这wiki写了那么长,其实只要对时的话操作很简单。

  1. sudo pacman -S ntp安装
  2. sudo rc.d start ntpd启动 daemon
  3. vim一下/etc/rc.conf,加入开机启动项中,同时把hwclock干掉

就这么三步。至于同步的时间服务器,默认的pool.ntp.org就挺好的。ntpd 启动后系统时间并没有马上改变,而是过了几分钟才在我不注意的时候悄悄同步准确了。

Category: Linux | Tags: linux arch ntp
9
7
2011
19

生成 Awesome 的“应用程序”菜单

Ubuntu 下,Awesome 有个叫 debian_menu 的模块,用于向 Awesome 菜单中添加一个类似于 GNOME 的“应用程序”菜单的项。然而到了 ArchLinux 下,却没这么个模块了。本来我并不太在意,但看到别人折腾后,自己又开始手痒了。

本来是准备自己用 Python 写个程序来生成的,用 pkgfile 一查,却发现有archlinux-xdg-menu这么个软件包,遂装了。原来主要是两个 Perl 脚本。其一生成各种格式的菜单配置,其二根据配置文件为指定的窗口管理器生成菜单配置文件。虽然看示例配置文件似乎不支持 Awesome,但xdg_menu --help一看却是支持 Awesome 的。

xdg_menu --format awesome > ~/.config/awesome/menu.lua

然后改下rc.lua,把这个大菜单加上就可以了:

require("menu")

mymainmenu = awful.menu({ items = { { "Awesome", myawesomemenu, beautiful.awesome_icon },
          -- ...
          { "应用程序 (&A)", xdgmenu },
          -- ...

截图如下:

效果不错,只可惜没图标。

又:从 wiki 上看到,原来这菜单可以添加快捷键的,只要在相应字母前加上&符号即可。

2011年12月3日更新dlin帮忙修改了archlinux-xdg-menu,现在有图标了 ;-)

2012年5月28日更新:现在 Arch 下需要稍微修改下命令参数了:

xdg_menu --format awesome --root-menu /etc/xdg/menus/arch-applications.menu > ~/.config/awesome/menu.lua
Category: Linux | Tags: arch awesome
6
21
2011
3

Arch 休眠设置

之前因为更改分区把Ubuntu的休眠给弄坏了,现在来到Arch下近一个月了,才发现原来Arch的休眠也有问题——休眠成功了,但是再启动直接重新开始了。内核参数resume=/dev/disk/by-label/swap也加了。Google 一下,很容易就找到了答案——原来这个也要配置!

很简单,在/etc/mkinitcpio.confHOOKS数组里加上resume,然后重新生成 initramfs 即可:

sudo mkinitcpio -p kernel26

有点郁闷,竟然默认不支持,安装系统或者 pm-utils 时也没提示什么的。我之前还以为是内核的resume参数不支持通过磁盘标签指定呢。又找了下,wiki 里倒是有。但是每安装个软件都查查 wiki 也太累了吧,那样还不如回 Ubuntu 呢。

Category: Linux | Tags: arch linux
5
6
2011
9

login shell 和 non-login shell 不同造成的问题

上篇说到,我在Arch下的tmux的部分环境变量有问题。于是接下来我开始调查原因。最后终于真相大白。不过在揭露真相前,先详细说说问题是什么。

自从使用zsh以后,我在Ubuntu下发现我在~/.profile中设置PATH变量的代码在tty下没有起作用。但在~/.zshrc中设置又不行,因为图形界面登录时不会读取~/.zshrc。source 它也不行,因为可能导致双重设置(在一段时间里,我总是很奇怪地发现命令补全时某些命令会出现两次。。。)。于是,最后我的方案是这样的(箭头表示 source):

.profile --> .zsh/zshrc.env   <-+
.zshrc --> ZSHRC_ENV set? --No--+

这个方案在Ubuntu下一直工作良好。但在Arch+tmux下就出问题了。在tmux中的zsh启动前,ZSHRC_ENV已经设置,于是~/.zsh/zshrc.env没有被 source,于是$PATH设置得不对了。。。

在查阅tmux N次之后,我想,可能是某个启动文件覆盖了我自己的 PATH 变量的设置。于是打开 zsh 的文档,翻到这里:

5.1 Startup/Shutdown Files

Commands are first read from /etc/zsh/zshenv; this cannot be overridden. Subsequent be- haviour is modified by the RCS and GLOBAL_RCS options; the former affects all startup files, while the second only affects global startup files (those shown here with an path starting with a /). If one of the options is unset at any point, any subsequent startup file(s) of the corresponding type will not be read. It is also possible for a file in $ZDOTDIR to re-enable GLOBAL_RCS. Both RCS and GLOBAL_RCS are set by default.

Commands are then read from $ZDOTDIR/.zshenv. If the shell is a login shell, commands are read from /etc/zsh/zprofile and then $ZDOTDIR/.zprofile. Then, if the shell is interactive, commands are read from /etc/zsh/zshrc and then $ZDOTDIR/.zshrc. Finally, if the shell is a login shell, /etc/zsh/zlogin and $ZDOTDIR/.zlogin are read.

于是发现这一切的根源在于tmux里启动的是login shell!Arch的/etc/profile中重置了$PATH/etc/profile.d/locale.sh中重置了$LANG,所以造成我的tmux下的zsh环境变量不对的问题。于是我把设置移回了~/.profile中,然后将软链接~/.zprofile指向它。locale.shpacman不知道是什么包的,所以我就把它改成了:

[ -z "$LANG" ] && export LANG=en_US.UTF-8

至此,tmux部分的问题终于解决了!

Category: Linux | Tags: arch linux zsh tmux
5
5
2011
5

悲剧的 Arch

昨天尝试切换到Arch,结局十分悲剧。

配置文件复制完毕,启动Awesome正常,启动火狐正常,然后其它的就木有正常的了。。。

首先是tmux。Arch下的tmux一直有个让我十分郁闷的问题:PATH/LANG等环境变量会被重置,但又不是所有环境变量被重置,所以在.zshrc中的检测也失败了。结局就是,我使用脚本自动在tmux中启动的程序几乎全部失败。

其次是empathy、gnome-terminal等使用了GTK3,但是GTK3是不读取~/.gtkrc-2.0的。于是它们的外观很丑很丑。上网搜了下,~/.gtkrc-3.0的格式改变了。虽然变成类似CSS的更容易了,但我还是得花时候学习啊。另外,很多GTK3的窗口右下角都会有个调整块,看着十分碍眼。

wuala因为是Java写的,所以界面还好没变。不过,我忘记密码了!!!wuala的密码是本地存储的,没有办法找回。看了下自己设的密码提示,还是没猜出来。后来换回Ubuntu在登录wuala时看到了密码的长度,又想到了另外一个可能的密码。不过我不敢在这个已经登录的wuala里试了,万一错了就太悲剧了。

继续使用中发现更多的问题。点击empathy中的链接发现默认使用Chrome打开了,不知道该如何设置。fcitx输入法在empathy中工作不正常,一旦按回车或者退格之后就表现出来了,回车、退格无效、Ctrl-空格经常不起作用、某些字母穿透了输入法直接上屏。

我用的Ubuntu中文论坛的加速脚本是那个Python版的。我提取了其pyc文件(并且修改了端口号)。现在也悲剧了——Python 2.7 不认 Python 2.6 编译的字节码文件!于是我只好到官网下载了2.6版的,然后编译安装。然后又是找不到libpython2.6.so.0.1这个库文件,sudo ldconfig后依旧不行。过了好久我才意识到是配置文件里没有包含/usr/local/lib这个目录,在/etc/ld.so.conf.d/下建个文件里边写上后终于好了。

遇到的这么多问题就解决了Python2.6那一个。于是最后只好郁闷地回到Ubuntu下了。


2011年5月7日更新:tmux 那个诡异的问题解决了,见login shell 和 non-login shell 不同造成的问题

2011年5月31日更新:fcitx 那个问题已经在csslayer的指导下几天前就解决了,需要打补丁。Bug 报告链接,我修改的 PKGBUILD 文件

Category: Linux | Tags: arch gtk3
4
7
2011
9

带补丁gvim 7.3 Arch软件包下载

准备向 Arch 迁移了,于是编译了个GVIM。之所以要自己编译,当然是要打非官方补丁了。

主要的 bug 修正为:

其中第三条只在 Arch 上出现,据说是某个库的 bug。后来折腾了段时间,发现如果 gvim 不 fork,或者 fork 后父进程生存的时间长一点点,就不会错误地出现这个提示(但是真正使用超级用户权限时也没有这个提示,不知道是否属正常情况)。


2011年7月14日更新:最新版下载地址

Category: Vim | Tags: arch C代码 linux vim
3
28
2011
35

新的Arch,杯具的nouveau驱动

上周五,我决定在本机上安装 Archlinux,然后逐步将整个系统迁移过去。但杯具的是,三天过去了,我只能决定暂时放弃。

转向 Arch

自从 Ubuntu 9.04 发布以来,我就告别了 Windows XP,一直在用 Ubuntu 了。时至今日已经快两年了,这个系统却从来没有重装过,Ubuntu 半年一次的版本升级,我都是升级升过来的。但现在,我觉得有必要换系统了。

首先,一个系统用的时间长了,难免有些垃圾文件神马的。Linux 比 Windows 要好很多,不需要“优化大师”神马的,但不清理我心里总觉得不舒服,因为我知道系统里有那么些无用的文件存在。首当其冲的是用户配置文件,就是$HOME下的东东。很多时候会一时冲动安装一些刚刚听说的软件,后来发现并不是自己喜欢或者需要的,所以又卸载掉。最开始什么都不清楚,没有去清理掉$HOME下的配置文件。后来会手动去清理下,但还是不时地发现一些不需要的配置文件。也有一些软件安装了却没有卸载干净,像软件自己生成的全局配置文件之类的,我也不可能每次卸载软件时仔细检查 dpkg 的输出。升级软件后也可能会留下一些再也不会用到的配置文件。

其次,Ubuntu 默认装了太多我从来不用的软件。鉴别出这些软件并不容易。而 Arch 的软件除了核心系统外完全由自己指定安装,这种不干活的软件势必会少很多。另外,Arch 的软件包打包很容易。虽然我不是编译狂人,但有些软件,比如Vim,我还是一直坚持自己编译。用 Ubuntu 的话,我只能很原始地编译好再make install,卸载时还得找到configure好的Makefile来卸载,而在 Arch 上的话,我可以很容易地让 pacman 帮我管理这些自己编译的软件。

再次,我现在的 Ubuntu 不知道被我怎么折腾了下,网络连接出问题了,虽然后来解决了,但是这样会自动使用一个名为“ifupdown (eth0)”的配置,且无法更改。它唯一的问题是,其 DNS 是由路由器分配的,而不是我指定的8.8.8.8。所以每次开机后、挂起/休眠恢复后,我都需要重新连下网,等等几十秒,让我很是郁闷。另外,由于历史原因,我一直在使用 ext3 文件系统,每次检查文件系统时得等好几分钟,很想换 ext4 了。

最后,Arch 的启动和关机界面太漂亮了。我并不喜欢 Ubuntu 的图形启动界面,就像我不喜欢 Window 7 的 Aero 界面一样。纯文本的界面挺不错的,而且我知道它正在做什么。万一卡住了,我也知道是卡在什么位置了。配置也很方便,主要的系统配置都写在rc.conf里,不像 Ubuntu 下,我不知道 sshd、vsftpd 以及 privoxy 是怎么跑起来的。前两者没什么问题,可是 privoxy 我有自己运行的实例,系统自动运行反而占用了端口,让使用我自己的配置的实例运行不了。

新的系统

我是直接复制之前安装在移动硬盘上的终端版 Arch,省得升级和安装曾经安装过的软件的麻烦。首先挂载/home和/boot,dd 了个 70M 的文件再 mkfs.ext4 后挂载到 /var/lib/pacman,专门放 pacman 的数据库。之所以没有使用 reiserfs 或者 ext2,是考虑到它们可能更容易在断电或者宕机的时候出问题。安全第一啊!我可不想因为包管理器的数据库被损坏而重装系统。

复制系统我最开始用的是 tar,可是很快我发现复制过去的可执行文件的权限都是 700……果断 Ctrl-C,然后换 rsync:

rsync -aviK --delete --delete-excluded --exclude=boot/other '--exclude=var/cache/pacman/*' ./ /media/rooty

刚运行几秒钟,我突然想起了 pacman 数据库将要存放的 /var/lib/pacman.fs 文件。于是 Ctrl-C 掉,把--delete参数去掉再继续。就在我以为逃过一劫时,rsync 执行完毕,我看到最后一行赫然写着 pacman.fs 已被删除!

怎么会这样?赶紧 man 一下:

       --delete-excluded
              In addition to deleting the files on the receiving side that are not on the sending side, this tells rsync to also delete any files  on  the  receiving
              side  that are excluded (see --exclude).

In addition to

但我知道文件的数据还未真正删除,因为那个文件仍处于被挂载的状态。我尝试过 debugfs,但是没找到它。Google 过,无果。好吧,我认命,又重新 dd 了一个 pacman.fs,一边 dd 我一边祈祷,希望这个文件是连续分配的。

终于搞定复制前,我还经历过一次误删 pacman 的数据库。好在还有一份副本,所以才未酿成大祸。接下来就是一系列的 pacman 命令了。然后,当我尝试启动 gdm 时,杯具发生了——

杯具

花屏了!!!

这个图片是我手动启动 X,然后开 gnome-terminal,再在根本看不清字的情况下输入scrot而得到的。

三天来我一直在尝试各种设置,重装 nouveau 和 xorg,设定不同的 xorg.conf,但无一例外。通过 vimdiff,我注意到 Xorg.0.log 中的以下信息:

[   122.450] (--) NOUVEAU(0): Virtual size is 1366x768 (pitch 0)

而显示正确的时候(在我的 Ubuntu 和 PartedMagic 上)pitch 后面的数字都是 1408。

[    27.992] (--) NOUVEAU(0): Virtual size is 1366x768 (pitch 1408)

Google 后在这里看到设置DisplaySize等来调整 pitch 参数的方法。设置后我紧张地启动了 gdm,可希望再一次地破灭了……

昨天,我终于看到这个帖子。看来是个 bug 了。于是,再一次地,我的 Linux 系统安装宣告失败。记得2009年3月的时候,我第一次安装 Linux,也就是 Ubuntu 8.10。安装很顺利,可是在使用几天之后,X 便再也启动不了,只好重装。重装好几次,每次情况都一样,直到 9.04 的发布。

在尝试解决这个问题期间,我不仅搞定了终端下上 gtalk、中文输入(最开始是 vimim,后来改用 zhcon),还分析了 zhcon 的码表文件格式,并将 fcitx 的码表转成 zhcon 的。

如果让我重新选择,我绝对不会买使用 nvidia 显卡的机器了。

为什么我不用官方驱动

为什么我一定要用 nouveau,而不使用 nvidia 的官方驱动呢?不是因为 nouveau 开源,只是因为我转向 Arch 的原因之一——更漂亮的控制台界面。最开始我就是用的官方驱动,还有 compiz 的特效。我的控制台分辨率,从最开始的 800x600,后来终于折腾成了 1024x768。可是我的显示器是宽屏啊,1366x768 的!我忍受又胖又矮的字体好久,也忍受了每次从图形界面切换到 tty 或者另一个图形界面时的黑屏闪烁。最后,compiz 开始不给力,不时地卡好几秒。于是我终于放弃了特效,转向实用主义,用起了 nouveau 驱动。虽然 Ubuntu 的终端也就是那样,文本到处乱飞,字体也令人不爽,但毕竟切换 tty 时不再闪烁,我可以同时跑 Awesome 和 gnome 了,心里还是挺满意的。

本以为可以完美转向 Arch 的,没想到再次被 nvidia 杯具。我实在是弄不懂,开放接口文档就那么难么?


2011年4月9日更新:

今天准备试试GNOME 3 的 Live CD,结果进入图形界面后一看,和 Arch 一样的悲剧……

2011年4月11日更新:

这里有一些相关的 bug 报告——

2011年4月11日再次更新:

经过两个星期的折腾和等待,以及Update Scanner的不断监视,我于第一时间更新内核至 2.6.38.2,整个世界就正常了!

Category: Linux | Tags: arch 显卡驱动 nouveau

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com