Running docker on Nexus 5

My Raspberry Pi 3 died. It was used for running Plex server. It was running inside docker before the Pi died. I was looking for replacement. I looked into my basement and I found two Google_Nexus_5_(lg-hammerhead) phones. Then the story began…

Prerequisites

  • you are fairly familiar with how flashing works, e.g. fastboot stuff.
  • you’ve already running postmarketos on your phone
  • you know what docker is
  • you know that you are probably gonna remove all the fancy UIs from your phone, and switch to postmarketos-ui-fbkeyboard or some console only mode
  • you’d better have a LAN connection on your phone rather than wifi

Steps

I can only prove this is working on my phones for now.

1. Edit kernel config

NOTE: before you make any change to kernel, always backup ~/.local/var/pmbootstrap/cache_git/pmaports/main/linux-postmarketos-qcom-msm8974/config-postmarketos-qcom-msm8974.armv7

Run

pmbootstrap kconfig edit postmarketos-qcom-msm8974

where qcom-msm8974 is for my Nexus 5. You need to figure out what’s for your phone.

You have 2 options to learn what to set when configuring the kernel:

You can see the changes I made to my kernel config at https://gitlab.com/tigerinus/pmaports/-/commit/d4c1ad862f5485fd9a7577e59b95e97da1b988ae

BTW – I’ve got a Ugreen USB 2.0 network adapter hooked, so I took the chance and selected

Device Drivers => Network device support => <*> USB Network Adapters => <*> ASIX AX88xxx Based USB 2.0 Ethernet Adapters 

2. Build the kernel

pmbootstrap build linux-postmarketos-qcom-msm8974 --force

I had to add --force otherwise it won’t build.

If everything is successful, you should find something like below

~/.local/var/pmbootstrap/packages/edge/armv7/linux-postmarketos-qcom-msm8974-5.9.0_rc4-r0.apk

3. Install the kernel

Get the linux-postmarketos-qcom-msm8974-5.9.0_rc4-r0.apk copied onto your phone and do

sudo apk add -u linux-postmarketos-qcom-msm8974-5.9.0_rc4-r0.apk

Just in case, I also copied /boot/boot.img-postmarketos-qcom-msm8974 to local as boot.img, boot to bootloader and did

fastboot flash boot boot.img

Reboot the phone and run check-config.sh again to see if anything missing. My experience is you don’t need everything enabled.

4. Install docker

Boot to your phone, assuming you have a pretty good internet connection, then do

sudo apk add docker

Not only this installs docker, but also an important service containerd.

5. Get docker daemon running

Run

sudo service docker start

We are not there yet. This first-time boot is for creating files, directories, group it needs. The docker command won’t work because of couple things that have to happen at boot time below.

DO NOT make docker to start on boot or you will get “can’t load program: function not implemented: unknown.” error.

BTW – If you hate doing sudo docker... everytime, you can optionally add yourself to docker group by

sudo vi /etc/group

Now reboot so at least containerd service is effective, in terms of automatically mounting cgroup2 to /sys/fs/cgroup.

sudo reboot

After reboot, do

sudo service docker start

You should see something like

Sudo service docker start.png

which you won’t see if you tried to start docker service before the reboot.

6. Verify things are good

Docker info.png
health check
Docker run hello world.png
hello-world
Docker run fedora.png
fedora

What’s next?

It’d be fun to have kubernetes running on this little device. Not sure if I should go with k3s or microk8s.

References

最近 Windows 10 的锁屏壁纸都很赞

顺便分享一下 wsl 下如何找到这些图片的命令:

$ for asset in `file -i $(wslpath $(cmd.exe /c "<nul set /p=%UserProfile%" 2>/dev/null))/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets/* | grep png | awk -F':' '{print $1}'`; do echo cp $asset /tmp$asset.png; done

输出是一堆 cp 命令,需要执行的话把 echo 去掉就行了。

cp /mnt/c/Users/xiaoh/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets/04f9bd3de104a427ca557d53f05747c382a62bc3efb2422a0ba9bbe8aa21e757 /tmp/mnt/c/Users/xiaoh/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets/04f9bd3de104a427ca557d53f05747c382a62bc3efb2422a0ba9bbe8aa21e757.png
cp /mnt/c/Users/xiaoh/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets/1181ec5a0c631705dcaded34f58a171b842ed6783274b4bc7122e66eaa498a67 /tmp/mnt/c/Users/xiaoh/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets/1181ec5a0c631705dcaded34f58a171b842ed6783274b4bc7122e66eaa498a67.png
cp /mnt/c/Users/xiaoh/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets/ffadc5cae56e18df849d64d219b374745eb3f046a01a7ff3316c0ce4eb5d3c64 /tmp/mnt/c/Users/xiaoh/AppData/Local/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets/ffadc5cae56e18df849d64d219b374745eb3f046a01a7ff3316c0ce4eb5d3c64.png
...

英雄所见略同

Relying on complex tools to manage and build your system is going to hurt the end users. […] “If you try to hide the complexity of the system, you’ll end up with a more complex system”. Layers of abstraction that serve to hide internals are never a good thing. Instead, the internals should be designed in a way such that they NEED no hiding.

依赖复杂的工具来管理整个系统的结果是给最终用户带来恶化的体验。[…] “如果你尝试隐藏系统的复杂性,于是就得到一个更加复杂的系统。” 为了隐藏内部机制而设置抽象层并非良好的架构方法,而应该把内部机制设计得精良而无需隐藏。

— Aaron Griffin

在 k8s 中开一个 shell

经常需要一个远程临时的 shell 做些什么事,比如实验一下某个需要运行一晚上的脚本,用完环境就扔了。在 AWS 或者 Azure 上开一个新的 VM 总是感觉不够快捷,也不想专门浪费一个 VM 的资源为这个目的留着。

还好我有个 Kubernetes 下创建 pod 的权限,这下就方便多了。

首先创建一个 shell.yaml 来描述一个可以运行 bash shell 的 pod(容器镜像用的是官方的 bash 镜像):

apiVersion: v1
kind: Pod
metadata:
  name: shell
  labels:
    purpose: shell
spec:
  containers:
  - name: shell
    image: bash
    command: ["tail"]
    args: ["-f", "/dev/null"]
  restartPolicy: OnFailure

然后执行下面的命令来创建这个 pod:

$ kubectl apply -f shell.yaml
pod/shell created

成功之后,就可以通过下面的命令获得一个远程的 shell 环境了:

$ kubectl exec -it shell -- bash --login
shell:/#

这个新创建的环境是基于 alpine linux 的,自然什么工具都没有自带。需要什么工具,只要用 apk add 命令安装就好了。我因为工作需要一般都会安装下面这些工具:

apk add git
apk add nodejs-current
apk add npm
apk add python3

如果想从或者向这个 pod/shell 复制文件的话,用下面的命令就好了:

kubectl cp ... ...

又一个开始

人们总是说迈出第一步是最难的。其实不对——最难的是第二步。往往接触一个新事物的时候,人的好奇和兴奋大于紧张和恐惧。各种名人传记里说第一步难的,都是得瑟,真的。而当第二个机遇摆在面前的时候,却早已习惯了第一步驻足在的地方。习惯了那里的人和物,习惯了各种形色,再也迈不出那双肥腿。《Inception》 里说,当在一个梦里久了,你会忘记当年梦想,然后“困”在那个层次,很难再走出来,直到死亡。现实也是如此。一个人从学校里出来的时候,两手空空。只有怀揣一把子冲劲,从一个结束走向另外一个开始。如果没有想过计划下一个结束和开始,那么一定有一天会突然惊醒,然后“掐指一算,都已是风烛残年1”。

今天看新闻,说 Google 换 CEO 了。Eric 在给这个公司贡献了十年之后,回到了二把手。人们早已习惯了 Google 各种创意的鬼点子,结果前进变成了定格,匀速发展成为了静止。当习惯成为了主导,丢失的就是方向。那么一切改变都是必要的,无论好坏。

安居乐业,满于现状,那是退休以后的事。只有不惧怕改变,才不会被时间打败。

1萧乾《枣核》

三年

在天空中,同是一颗金星,早晨人们叫它启明,夜晚人们叫它长庚。我愿意选择最佳的角度,将生命的长杆伸进茫茫宇宙。不管钓上什么,都是我的。把酸苦留在心里,将幸福写在脸上。默默相对的,是那最虔诚的感动。

Life is Like a Boat

很久没有听到什么令人感动的歌了。最近看《死神》,突然发现喜欢上了片尾曲。好听的歌应该就是这样,简单的旋律加唯美的歌词。

Nobody knows who I really am
I never felt this empty before
And if I ever need someone to come along,
Who’s gonna comfort me, and keep me strong?

We are all rowing the boat of fate
The waves keep on coming and we can’t escape
But if we ever get lost on our way
The waves would guide you through another day

Far away, I’m breathing, as if I were transparent
It would seem I was in the dark, but I was only blindfolded

I give a prayer as I wait for the new day
Shining vividly up to the edge of that sea

Nobody knows who I really am
Maybe they just don’t give a damn
But if I ever need someone to come along
I know you would follow me, and keep me strong

People’s hearts change and sneak away from them
The moon in its new cycle leads the boats again

And every time I see your face
The ocean heaves up to my heart
You make me wanna strain at the oars, and soon
I can see the shore

Oh, I can see the shore
When will I see the shore?

I want you to know who I really am
I never thought I’d feel this way towards you
And if you ever need someone to come along,
I will follow you, and keep you strong

And still the journey continues on quiet days as well
The moon in its new cycle shines on the boats again

I give a prayer as I wait for the new day
Shining vividly up to the edge of that sea

And every time I see your face
The ocean heaves up to my heart
You make me wanna strain at the oars, and soon
I can see the shore

We are rowing the boat of fate, but the waves keep attacking us
But isn’t that still a wonderful journey? Aren’t any of them a wonderful journey?

This is it…

24 号因为身体微恙,没有参加当天的全球 Thrill The World 的活动。排练了一个月,很可惜。所以今天把全部的致敬都放在了这部纪录片上。本来是 28 号首映,但是惊喜发现今晚九点就有第一场了。于是安静地呆在办公室里加班,准备到时间准时出发去影院。

多谢小 A 提前帮忙买了电影票,以防人多爆场没有位置。后来才发现这个担心是多余的。虽然观众人数跟其它好莱坞大片不能比,但是还是能看到一些粉丝。电影还没有开始,就四处发 MJ 的 Sticker 贴在身上。影院也贴心地制作了钥匙链当作首映的礼物。

本来一开始那些粉丝看上去还要准备映后唱歌跳舞一番以表达敬意,但是近两个小时的放映之后,看到的只有沉默。对于我这个 15 年的老麦粉来说,绝大部分排练都似曾相识。感觉看到的不是新鲜的抢夺眼球的舞台特效,反而有一种感觉,就是他曾经回来过。

一个人活了 50 岁,却一丝不苟地从事了一个职业 45 年。片中有一个演唱会合作的歌手评价说,没有任何一个瑕疵可以逃过 MJ 的眼睛和耳朵。任何一错误都要更正从新来过。一切都是为了 Fans。熟悉的舞蹈和旋律,让人感觉时间从来都没有前进过。然后突然地,他就走了。喜欢麦当娜在之前MTV ‘09 的颁奖开幕上说的:Michael Jackson 前无古人后无来者,他当之无愧的 King of Pop。

image

Timeless 可啦思刻

听方大同有一段时间了。一开始听那独具特色的转音还觉得不错,直到后来听到没感觉,甚至有些厌烦。只是在开高速时来不及换歌的时候,才勉强连续听几首不疼不痒的。今天偶然听了他的翻唱专辑《Timeless 可啦思刻》,皆因为其中那首翻唱 MJ 的《Bad》,然后觉得原来好听的歌应该是这样简单的。

image

1 – You Are The Sunshine Of My Life

第一次听这首,其实并不是 Stevie Wonder 的原唱。而是 MJ 在很小的时候翻唱过的录音。听大同的演绎,加上黄韵玲的那装嫩的 Background,感觉不俗。制作人蛮有心的,是接 MM 出去约会时人家款款坐入副驾时第一首应该听到的,很是浪漫。

2 – Nothing’s Gonna Change My Love For You

第一感觉是一个阳光沐浴的下午唱给 MM 听得一首歌。可惜编曲不是 Unplug,否则那突现的 Vocal 会更加迷人。有机会我要学会这首。

3 – Bad

从来没想过评价神的作品。听了只会让人难过。Gone too soon……

4 – 狂潮

这张专辑里唯一的一首粤语作品。说实话,可能是因为大同在夏威夷长大的原因,他的广东话的歌曲听起来从来都是带着西洋味的。能听得出来大同在这首歌的演绎里尽量减少那种 R&B 风,唱得很有诚意,应该会打动很多来自南方的 MM。

5 – La Bamba

最喜欢的南美风 + 爵士 + 不插电就是这首了,仿佛回到了圣地亚哥。到了后来萨克斯还有钢琴互咖的环节,让人完全有进入了一家高档墨西哥餐厅的感觉。其实,开车载 MM 兜风的时候听这首也不错。听不懂歌词,所以不做更多评价。

6 – 红豆

菲的经典曲目,被大同一唱又是另外一番感觉。如果你会吉他的话,然后加上那么一点点他的灵乐口音,这又是一首泡妞的杀手锏曲目。虽然中间有一段让人又有了文首那种不痛不痒的感觉,但后来 Bridge 回来的那段效果还是蛮让人刮目的。帅哥们应该学会这首以后,在清晨 MM 还没醒的时候打电话过去唱,必杀。

7 – Georgia On My Mind

如果听完上面的 La Bamba 然后直接跳到这首舞曲,一定会有一种北上加州的感觉。除此之外,并没有太多其它感觉。开高速的时候会跳过吧。

8 – 记得

可能听歌不多的缘故吧,一开始听到这首竟然没有听出来是阿妹的歌。大同改的实在太多了,不过我要说改的不错。特别是从颓废启承转折到假音然后再到暇意的那种感觉,让人回想倒带再听一遍。应该是一首洗澡的时候或者装电灯炮的时候让 MM 听到的歌,必杀。

9 – Wonderful Tonight

终于有一首感觉像 KTV 应该点到的歌了。像一开始的评价那样,简单的歌才好听。生日、婚宴、派对、追 MM 的晚上唱这首应该蛮应景的吧。

10 – Moon River

对我来说听歌名次数最多,听歌曲本身次数最少的一首歌。应该算是名曲吧,可是一直没有什么感觉。不过让他这么一唱,还是听出点味道的。Background 那个 Jazz 吹得挺赞。早上唱完《红豆》,晚上应该唱这首催 MM 睡觉了。

^_^

读后感

某些年轻人,太急于表现自己。往往在还没有想清楚自己的下一句话的时候,就上升到了珠穆朗玛的高度。然后就会因为海拔太高,而迷失了自己原本想表达的方向。就好像坐着无敌海景缆车上山的人一样,永远也别想在他们脸上找到那种登山者的沧桑。

——读 N 年前自己的文字有感

曾经写过的小说开头:《天使》

像所有的故事开头一样,很久很久以前,那是一个傍晚。天边白色的云彩伴着昏黄的天空,就像一杯劣质的啤酒。
村外的石群中一片寂静,很难想象得到这里刚刚结束了一场嘶杀。
“你叫什么名字?”我擦拭着斧头上绿色的血,回过头来问她。
如果站在那边的霍彼茨看过来,他一定会认为我身边坐着一个男人。
“埃格尼丝。”从头盔中传出一个名字。我看不到说话的嘴唇,但凭着声音,我约摸着她应该有20岁上下。
“干吗不摘下头盔,让我看看你漂亮的脸蛋?”我不怀好意的说着。
说实话,我并不期望身边坐着什么大美人。她粗糙的手背不比Zombie(这里僵尸的名字)好到哪里去。看得出来,她是个沙场高手,如果在军队里,她说不定能当上一个什么小头目。
“想去地狱的话就告诉我一声,不用卖关子!”她深蓝色的眼睛在瞬间恶狠狠地瞪着我,好像进入了战斗的状态。
她的眼睫毛很长,我认为这是她最好看的地方。

这个国度从几年前开始,就受到了冈到夫军团的入侵。他们是一群杀人不眨眼的僵尸,为的是找到这里某个角落中匿藏着的阿比亚石。
我是一个粗莽的人,根本不懂这个破石头到底有什么用,我只知道这是我的家园,不能让那群长的像苍蝇的怪物破坏这里本应该有的和平与宁静。
战争似乎永远没有截止日期,以至于后来连村子里的姑娘们都拿起武器加入到我们的行列。结果漂亮的姑娘都被那个叫做特拉波的僵尸首领给抓去做祭品了。所以能够留在我们这里的,基本上都是粗犷的女人。

“别生气别生气,只是开个玩笑而已!”我害怕地说。我不是害怕她会攻击我,而是怕她大声哭,然后把所有人都招引过来。
她得意地哼了一声,慢慢的摘下自己的头盔。
“我叫森特罗斯,以前是个木匠。”
“木匠也会用剑么?”
“我可是个大老爷们,我怎么不会?我还要反过来问你呢,你怎么会用剑?”
“你小看我。”
“那你肯定是误会了。”
我实际上根本没有小看她。

很久以前
在夕阳下
我倾听着你的梦
到彼岸去寻找你的爱人

青涩的剑
丑陋的盾牌
不掩饰你的温柔
踩着恶魔的残骸默默哭泣

也许这就是
一场梦
不论结果是什么
也许壮丽的殿堂瞬间坍塌

此时的�
也许睡在
你所爱的人怀中
期待着像童话般被他唤醒

所有秘密藏在心
和盔甲下的美丽
还有剑梢刻着他的名字

终于在一场战役
你因为梦而离去
你的背包中掉出一件嫁衣

站立在孤独中
这天使已经飞去
自由飞向远方的彼岸

我想起多年以前
就在这片夕阳下
有个少女在叙说她的梦想

Happy Birthday, China!

五星红旗
《我的中国心》
词:黄霑

河山只在我梦里
祖国已多年未亲近
可是不管怎样也改变不了
我的中国心
洋装虽然穿在身
我心依然是中国心
我的祖先早已把我的一切
烙上中国印
长江 长城
黄山 黄河
在我心中重千斤
无论何时无论何地
心中一样亲
流在心里的血
澎湃着中华的声音
就算生在他乡也改变不了
我的中国心

3 Recommendations of Recent

Last week I bought a second hand 19″ Samsung SyncMaster 940BW from http://expo.live.com for $100. But it’s not a replacement of my old display. I just extend my desktop to it so I can have more screen space to use.

I put my HP Pavilion dv2040ca at the left hand side to make it looking cool. Then I installed Synergy from http://synergy2.sf.net . It is a great tool which allows me to further extend my mouse/keyboard input to the laptop.

Now I am playing this Quake3 based game from http://www.worldofpadman.com . At the same time I have my IMs and Outlook 2007 running at the sides. Ah, degenerated life…

乐观

说都一把年纪了,还跟一帮小 P 孩一样,Follow 个选秀节目 Follow 的那么起劲。从五月中在 Youtube 上无意看到了那个周口店人之后,然后是一不爱说话唱歌贼 Power 的厮,一直看到了最后决赛。结果最后演变到了吁吁的时候竟然也不要脸地扯着嗓子也跟着吼两句,犹如狼群闹了饥荒。

日子就这么过着,白天干活,晚上笙歌,忙得不亦乐乎。糊里糊涂地又到了最美的七月。这个时节无论是气候还是精神头,都爽得让人想找点麻烦给自己。吃饱饭的时候就跟个蛆似的从椅子上谷拥谷拥到床前,然后再谷歌谷歌地放俩饱嗝儿,乐不思蜀。

不是没有烦心事儿,而是有烦心事儿但不去想。忘了谁说过一句话:“宇宙不是空间和时间组成的,而是中间和瞬间”。极有深度。