6
22
2015
122

一切都已经结束;一切又刚刚开始

蓦然回首,竟又已度过三个春秋。

三年前的那日,大雨倾盆,北京看海。而我却在简陋的出租屋里,对网络另一端还没有见过面的女生表白了。从那一刻起,一切都变了。

二十多年前,父母老师们都说,好好上学,将来考上好大学就会幸福了。

七年前,在信息严重不足的情况下,我「如愿」进入了现今各项指标我都要打一星的武汉大学计算机科学与技术专业。从信息匮乏到信息过载,再到毕业前夕笨拙的面试。我不知道路将通向哪里,然而眼前有路,努力走下去吧。

于是我来到了北京。告别了没什么感觉的故乡,也告别了他们曾经的谎言,开始面对真实的世界了。

那时的世界还算美好。所以我依然缓缓地在那不知道通向哪里的道路上走着。直到遇见了她。直到以为自己遇见了幸福。然而,幸福只是对我笑笑,然后离开,留我在一个没有路的地方发呆。

每天依旧去公司上班。只是不再准时。只是每天都吃很少,也不再关心吃的是什么。只是经常代码写着写着跑到卫生间里哭一场。只是冰箱里的雪糕一天会多减少四五支。在北京空气污染最严重的日子里,我也毫无察觉。而有时过完马路,才发觉自己根本没看是否会被车辆撞上。那时我才开始害怕起来。

那段时间,买了新手机,Sony LT26i,很漂亮也挺好用。但是并不开心。公司组织去云南旅游。那也是至今唯一一次公司组织的旅游,也是自己唯一一次旅行。然而躺在电脑里的照片里并没有几张照片里有自己。自己记忆最深的是,车在山间的公路上行驶,我听着耳机里郭静的歌曲,望着窗外一座又一座的山发呆。因为她曾经跟我说,她的家乡在群山环绕之中。

窗外的山

这段时期,遇到了小百合 @koyyuri。可惜他已经永远地离开了,只留下我没有授受他的语音聊天邀请的遗憾。

也遇到了五分之一个地球之外的淑贞姐和远在台湾的依依。虽然远隔重洋,可在我失恋的日子里,她们给了我很大的帮助。很感谢她们。

后来临近交房租的日子,我突然很想离开。非常想,所以很快就离职了。也从此,找不到能让自己满意的工作了。没有获得多少有价值的工作经验。甚至自己做了什么,也大部分都忘掉了。

那年春节在家都做了什么我已经完全忘记了。只知道只有流量极其有限的3G网络很难受,所以随便接受了一家位于南京的初创公司的工作。

秦淮河畔,桃花盛开。很美,却少一人相伴。有次走近河边的时候,竟然突然有种跳下去的冲动。发觉之后赶紧离远了些,再也不敢靠太近。

秦淮河畔的桃花盛开

就这样过了一年半。其间又遇到了素蓝,和她那些明信片。她还给我寄了一张。不过我收到的时候,她已经从网上消失了。

素蓝寄来的明信片

南京这家小公司不仅一直没发布那个很难理解的产品,而且到后来人越来越少。在网线另一头的朋友们的帮助下,我也渐渐地从失恋的悲伤中走了出来。所以,是时候离开了。

于是就离开了南京。本打算回到武汉角落的家之后,再重振旗鼓,再一次求职。可事与愿违。我不该回到那个只有3G网络又充满噪音的地方的。休息不好,而又有来自父母的巨大压力,根本没法全力求职。

失望、疲惫、担忧,逼迫我再一次选择先离开再作打算。

是的,担忧。在父母身边,有好吃的饭菜,不用自己操心吃饭的事情。仅此而已。没有家的温暖,也没有安全感。面对楼上房东的噪音,父亲说他来解决,结果并没有什么效果。有一次我实在忍不住和对方交涉,父亲还表达了不满。

父亲就是这样的人,对自己人表现得很强势以至于暴力,而对外则软弱无力。小时候父亲带我在外边吃早餐。还没吃几口,转过身擤鼻涕,结果店主以为我们吃完,把一满碗粉给倒掉了。我不满意,而父亲只是一边安慰着我,一边付了钱。

另一次,去另一城市走亲戚。那时候可没有手机地图之类的高科技。于是我们找了很久,在几个地点之间来回转悠大半天。我们又不是去求他办什么事,说不清自己在哪里又不出来接人,还去拜访他干嘛。

所以我们家一直受父亲那边的亲戚欺负,然后我和母亲长期受父亲的欺负。具体情节可参考《不要跟陌生人说话》,我就不展开叙述了。

那些日子里我经常会担忧,特别是在父亲喝酒之后。毕竟他是体力劳动者,我还无法保障自己的安全。后来为了安全起见,我每次回家前都会计划好,如果出事我要带上哪些必要的物品,选择哪条路线逃离。

母亲好一些,但也并不让我安心。有一次,她没有跟我说就去「帮我」整理行李箱。也许很多人都觉得这没什么,最多找东西时不容易找到了。但是我和母亲之间虽然没什么矛盾,却也并没有多少亲密。更何况,我还怕多年来一直隐瞒着父母的秘密被发现之后可能会发生的麻烦又危险的后果。

所以再一次地「不选而择」,来到了北京又一家创业公司。

工资恢复到了正常水平,工作时间恢复了正常,公司产品也不再是难以理解的东西。仅此而已。我对公司所做的产品没有兴趣,自己的工作内容更多的是实现需求,而不是做很多程序员做不到或者做不好的事情。新网站上线的时候,还把我吓到了,因为在我看来那根本还没有达到可以上线的完成度和品质。(所以那一整天我们都忙着修 bug。)

期间又试过阿里和百度。依旧被拒了。没有他们想要的工作经验,而我也不再是应届生。当然另一个原因应该是我不会把自己做过的东西吹得多么牛逼。我只会实事求是,可不会无中生有。为了工作机会而去学习没有意思的技能这种事,能避免就尽量避免吧。毕竟这世界上有意思的事情太多了,有那个精力把时间花在没意思的事情上太不值得。

对阿里失望之后,我也考虑了很偶然遇见的蘑菇街。然而从JD上我并不能确定他们的职位是否适合我。所以发信询问,后来发现可以在新浪微博上私信他们之后也私信询问过。可得到的信息只有他们已经收到我的信息了,自动的以及人工的。并没有得到自己需要的信息。后来实在等不下去了,投简历过去。那时受朋友引荐,去新浪面试过后,感觉还不错。至少对我来说总算是找到了一个愿意收留我、我也感兴趣的地方。后来蘑菇街说是他们CTO看到了我的简历,准备约面试。直到那时,我还是没能得到自己想要的信息,对他们所提供的职位还充满着不确定。而另一边,新浪的职位却非常确定。而有事经过故事开始的地方,发现自己已经彻底远离了那些事情的影响。所以最后我选择了留在北京,选择了认可自己的新浪。

三年过去了。我更加了解自己了,其实早就该如此。中国教育太关注分数,我虽然能够逃离一些,真正学得了一些知识,锻炼了考试之外的能力,然而淹没在题海之中的,除了更好的分数之外,还有对自己的忽视。是的,高三时的题海战术使我的成绩下降了不少。太累了,身体上和精神上都累,又学不到新东西了,所以成绩会下降,不然我去华科肯定不会有问题的。

三年过去了。经历过第一次幸福、第一次安全感,也经历过第一次整个世界毁灭的痛苦。

我知道人间路曲折不好走
也知道人间事沧桑不好受
但是花开一季 人生一世
累又算什么 苦又算什么
人 就只有这么这一辈子
总要风经过 雨来过
痛过 也哭过
才能在岁月的门后
把那些心酸 当作笑谈说

然而这些本该是数年前就会发生的事情。父母的影响和中国教育对分数的疯狂追求延误了青春的发生。

三年过去了。然而我还是没做出什么很多人都知道的开源项目,反而是更忙了,在前端各种技术喷涌而出的时候对新技术的关注反而更少了。也没取得多少对以后的工作有利的经验。本来能力就不等同于经验,只是很多人并不懂。当一个人经常用正确的方法做事时,没有走过那么多弯路的经验,她还是可以很顺利地完成任务,而不会需要先把所有错误都犯一遍。比如我并不需要像下厨房那样实际丢失过数据,才知道当误删文件发生时该怎么做。

这三年来,我最大的收获并不是多了三年的工作经验,因为那实际上不重要,也没有多少实质内容。这三年来,我在人生的道路上被逼着奔跑,以挽回自己被错过的时光。我一定要好好照顾自己,争取多活三年,这样我就可以当这三年并没有存在过了。虽然别人并不会这么看,但我也不会再为别人而活了。

只是,我已经不再年轻,也不再优秀了。

中国大陆用户:

墙外用户:

Category: 未分类 | Tags:
6
21
2015
0

在用户命名空间中运行 LXC 虚拟机

不用 sudo 也可以跑 LXC 虚拟机啦。使用 root 权限的 LXC 虚拟机,里边的 root 权限就是真实的 root 权限,虽然不太能够跑出来。而利用用户命名空间来启动的普通权限的 LXC 虚拟机则只在那个虚拟机里有 root 权限,从外面看跟一普通用户一样的。

首先需要一枚启用了CONFIG_USER_NS的内核。使用以下命令查看:

zgrep USER_NS /proc/config.gz

部分发行版会默认禁用用户命名空间功能,需要手动启用,参见 vagga 的安装文档。而 Arch Linux 不喜欢给软件打补丁,而这个特性又被认为是不安全的,所以并没有启用。当然这并不妨碍自己编译一个启用了这个特性的内核啦,比如 linux-lily 从 4.0.1 开始启用此特性。

注意:这个特性被认为不安全的,会时不时地爆出个提权漏洞(比如前不久这个),请谨慎启用。

内核支持没问题的话就可以开始配置了。以下配置过程主要参考 Arch Linux 论坛里的这篇帖子

首先给自己配置一些子 UID 和子 GID,也就是自己的分身。我在/etc/subuid/etc/subgid内写下如下内容

lilydjwg:100000:65536

意思是说,我(lilydjwg)被授权使用从 100000 开始的 65536 个 UID 和 GID。这一步是需要 root 权限的。这个配置好之后就可以创建用户命名空间了,比如:

lxc-usernsexec -m u:0:100000:1 -m g:0:1000:1 -m g:1:100000:1 -- /bin/zsh

此命令是说,创建一个用户命名空间,其中 UID 从 0 开始,实际对应于外边 100000 开始的 UID,总共分配一个;GID 从 0 开始,实际对应于外边 1000 开始的 GID,总共分配一个。执行之后可以看到新启动的 zsh 已经是 root 权限了。不过cat /etc/shadow就会发现还是没权限 :-D 在里边 touch 个文件的话,在外边看会是 UID 为 100000 的用户创建的。我之所以要指定 GID 的映射,是因为我的 HOME 目录外人读不了的。为了加载 zsh 的配置,就把自己的 GID 映射给它了。

注意:如果这里没有包含 /etc/subgid 中的 GID 区间,那么 shadow 4.6 将不允许 setgroups,导致命令失败。(只要有任意一部分即可。)

当然我也可以把自己的真实 UID 映射过去,这样子除了被里边的进程自认为有 root 权限之外没什么别的差异。用户命名空间要配合别的命名空间一起用才有意思。

然后要配置一下 cgroup,不然 lxc 会报错的。这一步也是需要 root 权限的。

echo 1 | sudo tee /sys/fs/cgroup/cpuset/cgroup.clone_children

for d in /sys/fs/cgroup/*; do
    sudo mkdir $d/$USER
    sudo chown -R $USER: $d/$USER
done

用处后边再说。

虚拟机里的网络是分开的。默认是没有网络的。想要的话得先授权,向/etc/lxc/lxc-usernet文件里写入

lilydjwg veth br0 10

其中br0是桥接用的网络接口名。没有就自己建一个:

brctl addbr br0
ifconfig br0 192.168.57.1
iptables -t nat -A POSTROUTING -s 192.168.57.1/24 -j MASQUERADE

这些当然也是需要 root 权限的。

还要告诉 LXC 使用用户命名空间:在~/.config/lxc/default.conf写入:

 lxc.include = /etc/lxc/default.conf
 lxc.id_map = u 0 100000 65536
 lxc.id_map = g 0 100000 65536

然后,去弄一个 LXC 系统镜像吧:

lxc-create -t download -n lxcname

名字自己起。这个命令会让你选择你要的发行版和版本的。这一步不需要 root 权限了。镜像文件列表可以看这里

等它跑完之后新的 LXC 虚拟机的 root 文件系统已经就绪了。不过在启动它之前先去编辑一下它的配置文件,加入网络配置。默认它位于~/.local/share/lxc下与 LXC 虚拟机同名的目录下。

在配置文件里加上

lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
lxc.network.ipv4 = 192.168.57.4
lxc.network.name = eth0

在启动之前还要做一件事——将当前进程加入到之前创建的 cgroup 中:

for d in /sys/fs/cgroup/*; do echo $$ > $d/$USER/tasks; done

然后就可以启动 LXC 虚拟机啦。当然是不需要 root 权限的:

lxc-start -F -n lxcname

当然,得给里边的 root 用户设置一个密码,不然登录不了的。可以使用 lxc-usernsexec 来 chroot 过去:

lxc-usernsexec -- chroot rootfs /bin/bash

2019年07月31日更新:修正 lxc-usernsexec setgroups 可能失败的问题。

Category: Linux | Tags: linux lxc
6
7
2015
19

Linux 系统接收通过蓝牙传输的文件

首先安装 bluez 包。我用的版本是 5.30。其次安装 blueman。

启动蓝牙服务:

systemctl start bluetooth.service

然后使用 blueman-manager 之类的命令启动 blueman。这时会在系统托盘看到蓝牙图标。点右键选择「添加新设备…」,完成配对。

然后,如果是要往手机发文件的话,是没有问题的,但是收的话,会失败。原因是,默认接收文件前会先询问用户要不要接收,而 blueman 不知道怎么搞的根本没反应……

解决方案是:直接启动一个默认接收文件的 obexd 就好了:

killall obexd
/usr/lib/bluetooth/obexd -r tmpfs -n -a

-r指定收到的文件存哪里,默认是 $XDG_CACHE_DIR 下的 obexd 目录,即默认是 ~/.cache/obexd。这里的路径是相对于用户主目录的。

-n是不要以守护模式运行,会把日志输出到终端而不是系统日志。

-a就是重点——接收所有文件——了。

obex 这套东西的文档在/usr/share/doc/bluez/dbus-apis/下有。

Linux 下遇到点问题还真是折腾,声称完成某一功能的软件一大堆,结果装好了,要么根本不知道怎么用(gnome-bluetooth、bluedevil),要么适用版本不匹配(obexpushd、ArchWiki 等网上的过时信息),要么有 bug 用不了(blueman)。

不过好的一点是,不涉及闭源的软件和协议,而又有足够的时间和能力的话,问题总是能够解决的。不像 Windows 或者 Android,遇到问题两眼一摸黑,只能不断地重试和重装,看看人品会不会爆发一下。

最后,折腾好久终于传输成功的照片:

雨后彩虹

北京好不容易下了场大雨,没想到雨后还出现了彩虹~

Category: Linux | Tags: linux Android 蓝牙
6
1
2015
6

Wireshark 抓远程主机的包

(失眠了,干脆起来写文。)

调试时经常会有抓包的需求。通常,我在本地用图形界面的 Wireshark 来抓包及解析,而对于远程服务器,因为没有图形界面,只好使用 tcpdump 抓包到文件然后复制到本地拿 Wireshark 看了,这样就不能实时查看抓到的包了。当然 tcpdump 也可以实时输出,但是信息太少、难以阅读,功能也过于简单,比如我要跟踪流啊、不同的流用不同的颜色高亮啊、添加注释啊、时序分析啊,tcpdump 完全没办法做到。实际上复杂一点的协议解析它都做不到。

一直没去研究 Wireshark 如何从标准输入读取网络包数据。大概是某天下意识地按了一下Alt-h看到了 Wireshaark 的 man 手册,才知道原来 Wireshark 支持这么多参数!图形界面的程序支持各种可选参数的可不多见。Wireshark 指定-i -就可以从标准输入读取数据,不过要同时指定-k,不然得在图形界面里点「Start」开始抓包。

那怎么把抓到的数据包发送到标准输出呢?实际的抓包操作不是 Wireshark 直接执行的。Wireshark 又不是 360,既然能以普通用户身份执行需要特权的操作,那么就会有一个无图形界面的工具来辅助。它就是 dumpcap。查阅其 man 手册可知,把抓到的数据输出到标准输出的选项是-w - -P-P 指定使用 pcap 格式,不然会使用 pcap-ng 格式,Wireshark 不认)。还可以给定其它选项,比如只抓 lo 网络设备上的包用-i lo,或者指定一个过滤器如-f 'port 1234'(具体语法见pcap-filter的 man 手册)。一定要记住不要把传输抓包数据的数据包也抓到了哦~

比如:

ssh lxc-debian sudo dumpcap -P -w - -f "'not port 22'" | \
  wireshark -i - -k

这样就可以实时看到远程主机上的网络包了~通过 ssh 执行命令时引号得用双层的。使用 sudo 是因为我那个 Debian 的 dumpcap 没有特权。

Category: Linux | Tags: linux 网络 wireshark

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com