Chrome OS自动升级后crouton音频的问题

日常使用 Chromebook 的朋友们应该都知道 Chrome OS 系统默认是自动推送并更新的,这样可以让你的 Chromebook 等设备始终用上最新的系统,跟上 Google 的步伐,这个特性对于我来说还是相当好的,不过今天我的 Dell Chromebook 11 自动更新到 49.0.2623.95 版本之后却发现 crouton 系统里略显严重的音频问题。

crouton 是一个通用的在 Chrome OS 系统里以 chroot 方式运行普通 Linux 系统的环境,这里我就不做介绍了,由于要测试一下我之前修改的 PPTV Kodi(XBMC) 插件,直接通过 crouton 启动 Ubuntu 14.04 trusty 系统,跟往常一样打开 Kodi 却发现没有任何反应。系统没有直接给出任何报错信息,通过命令可以看到 kodi.bin 进程在运行但一直没有看到 Kodi 媒体系统界面,查看 Kodi 的日志文件 ~/.kodi/temp/kodi.log 也看不到有用的错误信息。

接下来发现更加奇怪的是似乎 crouton 系统里所有和音频相关的程序都是启动了没有任何反应,包含 XFCE 自带的 Audio Mixer,例如我之前用的好好的 SuperTux 2 小游戏(一款类似超级马里奥的 Linux 游戏)也运行不了,通过给 SuperTux 2 启动命令加调试输出的参数可以看到:

(trusty)zzm@localhost:~$ supertux2 --verbose
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:236 PhysfsWriteDir: /home/zzm/.supertux2
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:237 PhysfsSearchPath:
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:241   /home/zzm/.supertux2
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:241   /usr/share/games/supertux2
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:305 Component 'config' finished after 0.001 seconds
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:305 Component 'tinygettext' finished after 0.094 seconds
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:305 Component 'controller' finished after 0.001 seconds
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:305 Component 'commandline' finished after 0 seconds
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/video/gl/gl_renderer.cpp:61 no support for late swap tearing vsync: No OpenGL context has been made current
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/video/gl/gl_renderer.cpp:64 no support for vsync: No OpenGL context has been made current
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/video/gl/gl_renderer.cpp:132 Using GLEW 1.10.0
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/video/gl/gl_renderer.cpp:133 GLEW_ARB_texture_non_power_of_two: 1
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:291 window  Window: Size(1280, 712) Fullscreen: Size(0, 0)@0 Area: Size(0, 0)
[INFO] /build/supertux-e4GX8V/supertux-0.4.0/src/supertux/main.cpp:305 Component 'video' finished after 0.074 seconds

从上面的输出可以看到 SuperTux 已经可以正确加载视频组件了,但似乎到了音频时就直接卡住没反应了,这时我想起看看 crouton 系统的 PulseAudio 音频功能是否工作正常:

(trusty)zzm@localhost:~$ ps ax | grep pulseaudio
 2034 ?        Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog
11585 ?        Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog
11944 pts/2    Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog
11991 pts/2    Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog
12055 pts/2    Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog
13094 ?        Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog
13301 ?        Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog
13388 pts/2    S+     0:00 grep --color=auto pulseaudio
27624 ?        S      0:00 /usr/bin/pulseaudio --start --log-target=syslog
27630 ?        S      0:00 /bin/sh /usr/bin/start-pulseaudio-x11
27640 ?        Ss     0:00 /usr/bin/pulseaudio --start --log-target=syslog
27641 ?        Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog
27645 ?        Sl     0:00 /usr/bin/pulseaudio --start --log-target=syslog

这下才发现 Ubuntu 的 PulseAudio 音频服务已经不正常了,系统里已经启动了多个 pulseaudio 进程,但都是直接卡住无法退出的状态,我们可以看看系统日志的输出:

2016-03-26T00:44:51.253228+08:00 ERR pulseaudio[13959]: cras_client: Unknown server_state version.
2016-03-26T00:47:17.599107+08:00 ERR pulseaudio[14281]: cras_client: Unknown server_state version.

看到 cras_client 就明白了这个是之前大概了解过的 Chrome OS 音频客户端,看看 crouton 官方 Wiki 里关于音频系统的说明:

https://github.com/dnschneid/crouton/wiki/Audio

开始就说的是 crouton 系统里音频工作机制:

Audio in crouton should work out of the box, with sound control synchronized between Chrome OS and crouton. By default, audio is forwarded to Chromium OS Audio Server (CRAS), and you will be able to play audio from both Chromium OS and crouton at the same time, without problem.

也就是 crouton 系统里的音频是以 ALSA 插件方式直接通过 Chrome OS 自带的 CRAS (Chromium OS audio server) 服务器实现的,这样存在的问题就是 Chrome OS 主系统自动升级之后可能和 crouton 里已经安装的 CRAS 插件不兼容了,这样 PulseAudio 音频服务就会启动失败。

解决方法也就简单了,用最新的 crouton 脚本更新一下已经安装的 Linux 系统一般就能搞定了(请自行把下面的 trusty 换成你安装的 crouton 系统名称):

chronos@localhost ~/Downloads $ sudo sh ./crouton -n trusty -u

提示

鉴于国内不少 Chromebook 用户没有路由器直接翻墙的条件,而 crouton 系统里又是不能直接使用 Chrome OS 的代理的,这样很多用户会在 crouton 脚本从 chromium.googlesource.com 网站下载音频程序这一步遇到被墙阻挡而更新失败的问题。

这里我安利一下我修改过的 crouton 脚本,和官方脚本的唯一区别就是通过 HTTP(HTTPS) 代理从 chromium.googlesource.com 网站下载音频程序,我已经放到 Gist 上,需要的朋友可以从此 Gist 链接 下载。

更新成功之后会看到 crouton 其实已经在输出信息的最后对这个问题做了说明,只能怪自己当初安装 crouton 系统的时候就没注意到这点了 -_-#:

Audio from the chroot will now be forwarded to CRAS (Chromium OS audio server),
through an ALSA plugin.

Future Chromium OS upgrades may break compatibility with the installed version
of CRAS. Should this happen, simply update your chroot.

另外需要说明的是如果你的 crouton 系统里安装了不止一个图形系统 target (例如我同时安装了 xorgxiwi 这两个 target,默认的 xorg 是为了更好的性能,xiwi 则是为了可以直接在 Chrome OS 系统里以窗口形式运行 Linux 图形程序),那么 crouton 系统自动更新之后默认的图形系统可能会被改回来,这是你只要修改对应 crouton 系统的 xmethod 配置文件 (例如我的是: /usr/local/chroots/trusty/etc/crouton/xmethod) 就可以重新配置默认的图形系统了。