记一次磁盘数据损坏的修复过程

昨晚我大概没有把硬盘插紧,零点(一堆计划任务执行时)在 dmesg 里看到了大量 ext4/SATA 错误。今天开机时 BIOS 直接提示没有可引导的设备。下面记录了我所有的测试和恢复步骤:

  • 用备份盘开机,首先发现 /dev/sda 存在,但没有任何 /dev/sda*。判断是分区表损坏。
  • 执行 testdisk 快速扫描找回分区表,因为盘里只有一个分区,这一步很顺利。继续操作写回分区表。
  • 此时 /dev/sda1 已经出现,尝试 mount,失败。提示 ext4 没有 journal。
  • 执行 fsck.ext4 /dev/sda1,期间提示包括 root node 不是 directory 等一系列错误,一路 y 下去重建了 root node,并把一堆目录丢到了 /lost+found。
  • 重新 mount,成功挂载到 /mnt。
  • 进去查看,发现只有一个 ./lost+found。果然 / 目录里的信息丢失了。
  • 进入 ./lost+found,里面有二十来个目录。一个个进去查看。
  • 根据目录内容,将 home、var、usr、etc、srv、opt、root、boot 猜出来,并移动回对应的 /mnt/*。剩下的多是空目录,放弃。
  • 尝试 arch-chroot,失败,想起来还需要重建 / 里的一些 symlink 和空目录。
  • mkdir dev media mnt net proc run sys,然后创建 {s,}bin -> usr/bin,lib{,64} -> usr/lib 的 symlink。
  • 再次 arch-chroot,成功。
  • 执行 pacman -S filesystem 以防万一。
  • 运行 grub-install 恢复引导。
  • 运行 pacman -Qkq 比对文件,发现只有 visual-studio-code 包内容有丢失,暂时不管。
  • 重启,成功进入系统,重新安装 visual-studio-code。

至此,虚惊一场的数据丢失已经完全恢复,总共历时 1 个小时(前面大量的时间花在了让备份盘能启动起来,上一次备份出现了一点差错……)。

最后赞美一下坚强的 ext4!

Pacman Hooks 简介

Pacman 5.0 带来了 Hooks 支持,但在大规模应用前,我们留出了一个多月的时间来让用户先升级到 Pacman 5.0(因为同时升级 pacman 和有定义 hooks 的包会导致无法正常执行这些 hooks)。现在距离 Hooks 正式投入使用已经过去了一个月,我觉得是时候介绍一下 Hooks 和如何使用它了。

先来看一个简单的 Hook:

这个 Hook 的作用是:当检测到安装或更新的包文件中存在 usr/lib/tmpfiles.d/*.conf 时,在更新后对每个文件调用 systemd-tmpfiles --create 方法。前面的检测部分定义在 [Trigger] 部分,后面执行的操作定义在 [Action] 部分。下面我们分别了解一下这两部分。

一、[Trigger] 部分

首先需要了解的是可以用于触发的条件类别(Type)。上面的例子里使用了文件(File),即当操作中的包中存在对应文件时触发。另一个可选的 Type 是软件包名(Package),即直接匹配操作中的包名。

接下来,操作(Operation)选项限制了对软件包的操作类别。可以选择的操作有安装(Install)、更新(Upgrade)和删除(Remove)。一个 Hook 需要在多种操作执行时,如例子中那样写成多行即可。常用的组合有三种全部写上(更新缓存、数据库等)、写 Install+Upgrade(执行安装时的一次性操作)及与之对应的 Upgrade+Remove(卸载时的一次性操作)。

最后,我们需要定义具体的目标(Target)。如果目标是文件,这里需要写其相对根目录的完整路径,但需要去掉开头的 / 字符。通配符(*、?)可以使用,具体匹配时会使用 fnmatch 方法。同样的,在一个 Hook 中可以定义多个目标,类似例子中的 Operation 那样写成多行即可。
Continue reading Pacman Hooks 简介

Arch Linux [testing] 系列仓库简介

Arch Linux 中的 [testing]、[community-testing] 和 [multilib-testing] 三个仓库构成了 [testing] 系列仓库。由于网上许多地方对 [testing] 系列仓库存在一定的误解,我作为一只开发者,想藉此文介绍一下 [testing] 系列仓库。

一、[testing] 系列仓库里有哪些包?
主要有三类,按照数量排序应该是:由 soname 等 TODO 产生的大批完全未经测试的包;重要软件包、软件集合的更新、不靠谱上游推出的新版本、上游大版本更新等维护者虽然测试过但是不敢肯定没问题的包;因为维护者没有时间等情况而完全未经测试的包。注意,这里多数的情况都是完全未经测试的包,keep in mind。

二、什么情况下软件包会留在 [testing] 系列仓库里很长时间?
主要也有三类:没人测试给 signoff 的;已知有问题但还未修复或不知道怎么修复还在研究的;维护者明明拿到 signoff 了(针对目标仓库是 [core] 的情况)或明明不需要 signoff(针对所有除了 [core] 以外的仓库)但还是觉得没把握的。简单来说,一般情况下你想用的新版软件不会在 [testing] 系列仓库里停留超过一个星期,除非它已经被发现有问题了。

三、开 [testing] 系列仓库需要满足什么条件?

  • 对当前系统中所有重要资料的备份。因为你不知道你装的下一个未经充分测试的包里是否会出现类似之前 bumblebee 或 steam 那样的灾难性错误。
  • 有从包括 bumblebee 在内的各种灾难中恢复的能力。几乎没有人能帮你完成这件事,所以你需要自己拥有这种能力。这里包括的不止是对修复针对性问题所需要的知识和/或找到这些知识的能力,还包括提前准备好修复工作中需要的工具,比如 USB 安装介质和你的备份。
  • 能接受系统在一段时间内不可用。 如果你正在工作中赶进度,或者明天就需要在一场演讲中用到,这不是一个开启 [testing] 跑更新的很好时机。请保证你在满足前两个条件的情况下,还能接受你的系统需要一段时间才能修复这个事实。无论是找到问题、修复还是重装系统,还有从备份中 恢复文件,都是需要一定时间的。

最后,如果读到这里还没被我吓跑,欢迎你像我一样启用 [testing] 系列仓库,并把发现的问题报告到 Arch Linux Bug Tracker

搜狗拼音 for Linux 新版发布

官网地址:
http://pinyin.sogou.com/linux/

本猫折腾了一下, 做了一个 PKGBUILD, Hack 了一下 curl 版本的问题, 目前自己测试可以用哈~
snapshot66

坑爹之处在于, 这次放出的版本必须用内置的 qimpanel 界面! 也就是说, 经典 UI 和 kimpanel (包括 gnome-shell 那个 kimpanel 插件之类的) 都不能用, 否则你会看到一条超坑的提示:

“请启用fcitx-qimpanel面板程序,以便更好的享受搜狗输入法!”

做好的包和完整的 src 包下载: http://pkgbuild.com/~fyan/staging/fcitx-sogoupinyin/

PKGBUILD: (偷懒的猫只做了 x86_64 的)

其中那个 libcurl.so.4 是从一个很老版本的 curl 包里提出来的.

workaround curl 用的那个启动脚本:
/usr/bin/fcitx-qimpanel

使用方法:
重载 fcitx, 开启 qimpanel:

然后启动 fcitx-qimpanel:

然后切换到搜狗拼音输入法, 可以开始玩了!

Pipelight – 让 Linux 原生 Chromium/Chrome 无缝支持 ActiveX 控件 (看! 网银!)

工行网银, Silverlight, 支付宝控件, 放开那个 Windows 虚拟机, 让 Wine 上吧~

无图无真相:

2014-02-20-183618_1044x559

2014-02-20-183809_986x553

基本的原理是, 利用 Chrome 里已有的 npactivex (ActiveX for Chrome) 扩展, 配合 pipelight 提供的 npactivex NPAPI 插件, 将 ActiveX 控件本身用 wine 执行, 并且无缝地嵌入 Chrome 网页中.

因为此功能依然在活跃开发中 (今年 FOSDEM 2014 的一个碰撞产生的火花神马的), 稳定版本的 pipelight 暂时没有加入此功能. 大家如果想尝鲜的话, 我下面介绍一下 Arch Linux 里的安装测试方法 (暂时只针对 64 位测试用户哈):

2014/2/27 更新: 因为 pipelight 0.2.5 已经添加了 npactivex 插件, 不再需要手动安装 -git 的版本了.
1. 添加来自 pipelight 的第三方源到 /etc/pacman.conf:

2. 添加并授权 pipelight 开发者的软件包签名 PGP key:

3. 安装 pipelight:

4. 解锁 pipelight 的 npactivex 插件:

看到 "Plugin npactivex is now unlocked" 即为解锁成功.

5. 启用 npactivex 插件

看到 "Plugin npactivex is now enabled" 即为解锁成功.

6. 启动 chrome 浏览器,打开 chrome://plugins, 应该可以看到以下内容:

ActiveX hosting plugin for NPAPI
ActiveX hosting plugin for NPAPI r37
Name: ActiveX hosting plugin for NPAPI
Description: ActiveX hosting plugin for NPAPI r37
Version:
Location: /usr/lib/pipelight/libpipelight-npactivex.so
Type: NPAPI
Disable
MIME types:
MIME type Description File extensions
application/x-itst-activex ActiveX (*.ocx)
.ocx
application/activex-manager ActiveXManager

如果看到下列错误:

Pipelight Error (npactivex)!
Something went wrong, check the terminal output

请从终端打开 chromium/google-chrome, 观察终端出错日志.

7. 安装需要的 ActiveX 控件. 下面以工行控件为例:
7.1. 下载工行网银控件安装包:

7.2. 安装 mfc42 运行库:

7.3. 安装:

故障排除: 运行

如果输出包含以下内容就说明安装成功了, 否则说明以上某一步出错了

{93156467-FD99-4A30-9CA5-8563F4BB8DB3}|||icbc_netbank_client_controls

8. 安装 np-activex extension:
扩展可以从 Chrome Web Store 直接安装, 地址: https://chrome.google.com/webstore/detail/activex-for-chrome/lgllffgicojgllpmdbemgglaponefajn/related (打不开请翻墙哦 :D)

9. 设置 np-activex extension:
打开 chrome://chrome/extensions, 点击 "ActiveX for Chrome" 旁边的 "选项" (Options), 浏览到 "ICBC工商银行" 所在的条目, 将"已禁用"改为"已启用".

10. 用 Chrome 打开 https://mybank.icbc.com.cn/icbc/perbank/index.jsp 应该可以正常登陆工行网银了 😀

支付宝控件的安装过程基本一样 (注意不要漏掉设置 WINEPREFIX 哦), 不过在 npactivex extension 的设置界面并没有 Alipay 的选项. 分享一下我测试成功的规则哈:

Mode: WildChar
Pattern: https://*.alipay.com/*
User Agent: MSIE9
Other helper scripts: dynamic ieevent

最后, 感谢 Pipelight 项目. Pipelight 项目是两位德国的大学生发起的项目, 因最初目标是在浏览器里无缝支持 Silverlight 而得名. 如果你愿意表达对他们的感谢, 可以到以下链接为他们赠送 kudo:
https://www.ohloh.net/p/pipelight/contributors/3052248574201504
https://www.ohloh.net/p/pipelight/contributors/3052248574201570

感谢 npactivex 项目. npactivex 项目的开发者是 Chuan Qiu, 如果你愿意表达对他的感谢, 可以向他捐赠, 链接是 http://code.google.com/p/np-activex/wiki/Donations

感谢 Wine 项目以及 Wine 项目背后的CodeWeavers公司, 如果你愿意表达对他们的感谢, 可以购买商业版的 CrossOver 支持他们继续为 Wine 做出更多贡献: http://www.codeweavers.com/ 如果有足够多的用户要求, CrossOver 会集成 pipelight 解决方案, 方便更多 Linux 用户 :3

附安装 -git 版本的旧方法:
1. 安装源里的 mingw-w64 组, 全选安装

2. 安装 AUR/pipelight-git, 需要修改 PKGBUILD 的一些部分:
- 删除依赖 mingw-w32-bin
- 在 ./configure 这一行末尾添加 --win32-static

3. 完成安装, pipelight-git 的 wine-browser-installer 和 wine-silverlight 两个依赖也来自 AUR.

来尝鲜 KDBus 吧!

虽然这玩意现在还不被认为稳定, 而且有些东西用它之后工作不正常, 但是我还是想介绍一下 - 怎么说不折腾不舒服是吧!

首先介绍下 kdbus (及相关的用户态工具), 这玩意是 Greg KH (Linux 内核稳定版本负责人, 主要负责 kdbus 部分) 和 Lennart Poettering (混乱邪恶的 Avahi, Pulseaudio, Systemd 作者, 主要负责 libsystemd-bus 部分) 等大神写的, 用来在内核态实现一个 dbus 的实现, 而用户空间的 dbus-daemon (包括 session dbus) 则交由 libsystemd-bus 来提供(兼容)接口. 下面引用的介绍来自Solidot:

kdbus支持内核消息过滤、提供了可靠的次序保证,支持传送文件描述符,它被认为比用户空间的D-Bus能提供更强的安全性和更好的性能。

不过对于咱用户来说, 关心的主要问题当然是更好的性能啦, 根据一篇 Gentoo 的如何玩 kdbus 的介绍, 咱能感觉到的变化有: dbus 本身更快了! 机器启动也更快了!

下面就是 Arch 里测试的步骤啦, 其实很简单嗯.

1. 安装 kdbus-git 和 systemd-git (都在 AUR 里)

注意如果你用的是自定义的内核, 请修改 kdbus-git 的 PKGBUILD 里对应的部分. 默认的 PKGBUILD 应该只能在不开 [testing] 的默认内核里工作.

安装完成后, 跑一次 # depmod -a 来让模块生效

2. 新建文件 /etc/modules-load.d/kdbus, 里面只写一行 kdbus 即可

2.99. 注意, 如果你之前习惯于 eth0 eth1 这样的网卡命名并且因此 mask 了 80-net-name-slot.rules, 你需要重新 mask 80-net-setup-link.rules, 否则改名又会出现... (感谢 systemd-networkd 吧)

3. 重启!

我这里测试的结果是, --system 的 dbus-daemon 还在, 而 --session 的 dbus-daemon 没有了, 一大堆 systemd-bus-proxyd 进程出现了.

最后, 记一下我测试一些软件的结果:

调用 kdbus 正常工作: Fcitx, Pidgin, Chromium, Pulseaudio, ...
在 kdbus 下无法正常工作: kwallet, akonadi, ...

Arch Linux 折腾小记 – 申请 TU 通过后三个多月来我做了什么?

自从我申请 Arch Linux Trusted User 通过后:

我往 [community] 仓库添加了这些软件包(按先后顺序):

  • pyzy: 作为 ibus-pinyin 的新依赖引入, 拼音注音库
  • kcm-fcitx: Fcitx 输入法框架(下文简称 Fcitx)的 KDE Config Module (KDE 控制面板模块)
  • fcitx-cloudpinyin: Fcitx 的云拼音输入引擎插件 (注意这不是一个输入法哦! 在 fcitx 中各拼音输入法的第二个候选词的位置插入一个云拼音引擎的返回结果, 支持 QQ/搜狗/百度/Google 的云输入法 API)
  • fcitx-configtool: Fcitx 的经典配置工具, 基于 gtk3
  • fcitx-sunpinyin: 为 Fcitx 添加 sunpinyin (中文拼音)输入引擎支持 (词典相当智能, 强力推荐)
  • fcitx-anthy: 为 Fcitx 添加 anthy (日语)输入引擎支持
  • fcitx-chewing: 为 Fcitx 添加 chewing (繁体中文注音)输入引擎支持
  • libpinyin: 一个智能拼音输入引擎, 现在词典弱于sunpinyin
  • fcitx-libpinyin: 为 Fcitx 添加 libpinyin (中文拼音)输入引擎支持
  • ibus-libpinyin: 为 IBus 输入法框架添加 libpinyin (中文拼音)输入引擎支持
  • libgooglepinyin: 一个由 Android 上的 Google Pinyin Fork 出来的(中文拼音)输入引擎
  • fcitx-googlepinyin: (略, 你懂的)
  • ibus-googlepinyin: (同上)
  • cgminer: bitcoin (比特币) 的一个挖矿工具, 支持 CPU 和 GPU, 高效稳定, 各种推荐
  • opencc: 开源中文简繁转换库 (fcitx 的可选依赖)
  • fcitx-unikey: 为 Fcitx 添加 unikey (越南语)输入引擎支持
  • fcitx-m17n: 为 Fcitx 添加 m17n (多国语言码表)输入引擎支持
  • google-glog: Google 的一个 C++ 日志库, 作为  librime 的依赖引入
  • kyotocabinet: 一个 C++ 的 DBM 实现, 作为  librime 的依赖引入 (我才不知道这是神马呢)
  • librime: 中州韵, 一个(繁体为主)中文智能输入引擎, 支持拼音, 粤拼, 五笔, 注音等等
  • brise: librime 的词库
  • fcitx-rime: (略, 你懂的)
  • ibus-rime: (同上)
  • yamdi: BOYPT 大大 request 的一个 FLV 文件折腾器
  • ttf-hanazono: 一个免费的日语汉字库, 包括了超过8万(达到 Ext D 区)的汉字, 是覆盖汉字最全的免费字体(注意, 安装后有42M大哟)
  • pidgin-hotkeys: Pidgin 的全局热键支持插件
  • wqy-microhei: 大名鼎鼎的文泉驿微米黑
  • gtest: Google 的一个 C++ 测试框架, 作为 fcitx-rime 的编译依赖引入
  • fcitx-table-extra: Fcitx 的一些额外码表支持(包括仓颉3, 仓颉5, 粤拼, 速成, 五笔, 郑码, 还有一些我不认识的>.<)
  • fcitx-hangul: 为 Fcitx 添加 hangul (韩语)输入引擎支持
  • osdlyrics: 支持多款播放器的歌词显示插件
  • zinnia: 一个手写识别库, 作为 fcitx-rime 的依赖引入
  • fcitx-mozc: 为 Fcitx 添加 mozc (日语)输入引擎支持 (mozc 是 Google 日语输入法的开源版本)
  • pidgin-lwqq: Pidgin 的一个 webqq 协议插件, 已经支持群聊/收发图片/传文件/显示备注等等功能
  • python2-xapian: Xapian 索引库的 Python Bindings
  • python-pyquery/python2-pyquery: 一个像 jquery 一样的 Python 库
  • fbterm: 一个使用 frame buffer 设备或者 VESA 显卡的高速终端模拟器(重点是不用图形界面而且支持中文哦)
  • fcitx-fbterm: fbterm 里的 Fcitx 输入法支持
  • fcitx-ui-light: Fcitx 的轻量 UI
  • fcitx-table-other: Fcitx 的一些更奇怪的码表支持(包括 Latex, Emoji, 还有一大堆我不认识的>.<)
  • pep8-python2/pep8-python3: Python 的 PEP8 代码规范检查器
  • gtkhotkey: 一个 Gtk+ 程序的跨平台热键处理库, 作为 synapse 的依赖引入
  • synapse: 一个很赞的 Launcher (类似 Gnome-Do), 被 shellex 大大推荐了之后我就用上了
  • pastebinit: 一个用来上传点什么到某个 pastebin 的命令行工具
  • xnoise: 一个 Gtk+ 的媒体播放器
  • ydcv: (我自己写的)一个简单的命令行(联网)查单词程序, 调用有道词典的公共 API
  • python-bottle/python2-bottle: 一个(我公司在用的) Python Web 框架
  • sunpinyin/sunpinyin-data: 分包了一下 sunpinyin 的数据
  • recorditnow: yuyichao 大大 request 的一个 KDE 里的屏幕录制软件
  • pidgin-kwallet: Pidgin 的 Kwallet 支持插件
  • boinc/boinc-nox: 重新分包的伯克利开放式(志愿者)计算平台软件
  • goagent: (咳咳) 你懂的
  • python2-gevent-beta: Gevent 1.0 系列的 beta 版本, 作为 goagent 的可选依赖引入
  • fcitx-qt5: Fcitx 的 QT5 IM Module (截止发文时间这货还在 [community-staging] 里, 过几天(十几天?)才能出炉哦)

除了这些包外, 我还(参与)维护了这些已经在 [community] (或曾经在 [extra]) 里的包:

  • python2-greenlet
  • ibus-table
  • ibus-sunpinyin
  • ibus-pinyin
  • fcitx
  • ibus-chewing
  • mongodb
  • ibus-m17n
  • python-tornado/python2-tornado
  • python-sh/python2-sh
  • python2-gevent
  • stardict/stardict-lite
  • tcpflow
  • ibus-qt
  • stunnel

我在 aur-general 邮件列表处理了上百封(脑测的, 应该有吧?)邮件, 有关 AUR 包的删除/合并/Disown(这货怎么翻译呢)操作.

我在 IRC 里和 Arch 其他 TU/Dev 讨(tiao)论(xi)了各种奇怪的问(yong)题(hu).

我在 Arch Linux 中文社区… 参与折(wan)腾(huai)了一个 Minecraft 服务器 XD (咳咳)

我在 IRC #archlinux-cn 和百度贴吧 archlinux 吧回(tiao)答(xi)了各种奇怪的问(yong)题(hu).

(这篇本来打算跨年的时候写的, 不过各种懒拖到现在了…)

[Arch] 今日更新的 fcitx(-gtk2) 在 gtk2 应用中无法使用问题的解决与启示

今日更新了 fcitx, 许多用户反馈在部分应用程序中无法激活/使用, 虽然这类问题已经并不新鲜, 但是我觉得还是有必要说明一下.

首先, 这个问题从根本上是pacman的错(升级顺序混乱).

升级的时候你应该看到 fcitx-gtk2/fcitx-gtk3 的 installing 后面跟着个 error, 那就是因为, 存在下面的依赖链(以 fcitx-gtk2 为例):

最后的两个都在升级列表里, 而按照逻辑, fcitx-gtk2 需要在他们之后升级才是正常的, 但是 pacman 没有考虑这个问题(依赖链中间有两个未参与此次升级的包).

我今天中午收到反馈就 bump 了版本(在基友 yuyichao 的建议下更新了 fcitx-gtk2.install, 简单的 hack 了一下使得以后类似情况时不出现此问题), 现在你看到(或者装了)的应该是 -3 结尾的版本号. 但是即使升级后, 所有使用 gtk2 相关库的应用程序仍需重启才能生效.

因为类似情况并不是第一次出现了(以前有数次大规模 rebuild 后某些包不正常的情况), 基本上如果你在升级过程中看到有库链接错误/segfault/参数错误之类的提示, 在此次升级指令完成后把这些出错的包重新安装, 如果还有错, 继续安装有错的包直到没有错为止. 这样基本上可以解决大部分的此类问题.

另附此次我机子上 fcitx-gtk* 升级出错的 log 以便大家参考前文的分析 (无关包已去掉)

一句话检查自己 Arch 里装的 AUR 包是否和社区同步

我们知道 aurget yaourt 等工具可以解决普通升级的情况, 但是如果一个包改名了, 或者(不靠谱的)维护者降级了没加前置version, 这些工具不会给出任何提示. 如果没有关注自己使用的包的 comments (没有notify) 以及 aur-general 邮件列表的话, 常常会错过这样的信息, 以致自己机子上的包过期很久也没发现, 以后出现莫名其妙的问题什么的(

举例来说, aur/qtcreator-bin 被收入 [community] 一段时间了, 因为收入后改了名 (新名称是 qtcreator), 导致 yaourt 没有给我任何提示. 今天用下面的语句检查后我才发现, 自己机子里的 qtcreator-bin (版本2.3) 包已经不在 AUR 里了, 而[community-testing]/qtcreator 版本是2.6.0beta, 可见我这里的包已经过期许久.

和上次的小脚本一样, 我又用到了 GNU Parallel, 嗯就是这样(

简单的 Arch 第三方软件源自动化同步上传工具

首先解释下, 这玩意是给包维护者用的, 不是给普通用户的(
功能: 扫描自己维护的包列表, 同步所有包到远程软件仓库. 自动判断architecture. 如使用 yaourt, 需要配置 yaourt 输出到 pacman 目录, 或者手动修改工具里的路径.
PKGLIST格式: 一行一个包名.
PS: 因为用到了 GNU Parallel, 所以记得装一下嗯(

packageupload:

packagesync: