一个自由职业程序员的树莓派:基础准备篇

关于未来的工作,全职员工将成为少数人,更多的人趋向于过多元化的人生,这种多元化包括生活、工作、收入等方方面面。作为用科技去驱动未来工作时代到来的程序员,应当意识到,不能被自己创造的时代所遗忘。这里,我试着从这条不确定的道路上,尝试着探索一下,基于当下触手可得的资源,如何装备自己,逐步成为一个面向未来工作的自由职业程序员。
我选择树莓派为基础装备,用一系列的文章,介绍我的实战成果。希望这些对你在尝试过多元化人生而做自己的准备时,也能有所启示和行动。

《一个自由职业程序员的树莓派》系列文章包括:

采用树莓派作为自由职业程序员的基础装备,我主要基于这几点来考虑:

  1. 树莓派设备流行,支持的公司众多,社区丰富,容易获得支持;
  2. 可以自己搭建个人私有的网盘,随时随地访问自己的照片、文档和数据;
  3. 可以自己管理数据,即使在网络不可用时,依然可以回到家获取资料;
  4. 一次投入即可,不用买那些昂贵的包年包月服务;
  5. 可以随时随地存取代码,设计、开发、部署、调试、测试和演示自己的软件程序(当然,这需要一台最低配置的云主机做内网穿透使用);
  6. 低功耗,可以7x24小时在线,也可以随时随地按需开关机。

如果你也认同这些想法,那么我们就开始来亲手打造吧。

  • 购买必要装备
  • 下载并安装操作系统
  • 配置网络连接
  • 挂载移动硬盘
  • 配置其它

购买必要装备

很显然,在开始之前我们需要买一些必要的装备,才能完成这个愿望。主要包括以下:

  1. 树莓派:必备微型电脑,也就手掌那么大;
  2. TF 存储卡:用来安装设备的操作系统;
  3. 移动硬盘:用来存放数据(可选,因为也可以把数据存放在 TF 卡上;当然如果要确保数据尽可能安全,可以购买支持 RAID1 的移动硬盘盒,用双硬盘做镜像备份);
  4. WiFi 插座:用来随时控制电源,长期不用时可以关机,需要同步或获取资料时,远程开机就是。

某东某宝上,都很容易买到树莓派 4B。我买的树莓派 4B 是 4GB 内存版本,基本够用了,现在新推出了 8GB 内存版本,大家可以考虑入手。如图所示(我这个是已经贴了散热片的)。


TF 存储卡,买个 32GB 容量左右的就合适了,如果你不想买移动硬盘来单独存放数据,也可以买大一点的,我现在用的是 64GB。

移动硬盘,我买的是低速版 1TB (M.2 Nvme)的 SSD 硬盘,外加一个硬盘盒。低速的一般意味着低功耗,发热量小,不用安装散热壳,适合用来专门存放照片、文档等数据。选个这样单独的移动硬盘,也可以避免重装系统的时候,忘记备份 TF 卡,把数据清除的尴尬。


另外,如果觉得自己的东西特别重要,也可以换成一个组装双 SATA SSD 硬盘的 RAID1 硬盘盒(这种硬盘运行功耗也不大,我测试过,大概就 1.5瓦左右)。

把这几个东西算在一起,整体待机和运行功耗大概在 5~8 瓦左右,按照这个推算,一个月的耗电量大概在4.5度左右,也就 2元多钱,可能也就跟坐一趟公交车差不多,完全可以接受。

下载并安装操作系统

因为树莓派官方还没有推出 64-bit 版本的操作系统,所以一般来说对于 3GB 以上内存的树莓派设备,都建议使用 Ubuntu on Raspberry Pi。访问 Ubuntu 的树莓派 镜像下载 网站,下载最新的 LTS 64-bit 版本的镜像包。

镜像下载好后,可以参考 官方教程,根据你电脑的操作系统(Ubuntu, Windows, macOS),选择下载和安装对应的 Raspberry Pi Imager 工具,用于写入系统镜像到 TF 卡上。

  • Raspberry Pi Imager for Windows
  • Raspberry Pi Imager for macOS
  • Raspberry Pi Imager for Ubuntu

启动 Imager 工具,点击 CHOOSE OS 按钮,在弹出的对话框中,点击 Use custom,选择前面步骤中下载的操作系统镜像包。

同时,将你要写入 Ubuntu on Raspberry Pi 操作系统的 TF 卡插入电脑,点击 CHOOSE SD CARD 按钮,选择这张刚插入的存储卡后,点击 WRITE 按钮,并等待写入完成。


写入完成后,拨下 TF 卡,退出 Imager。

配置网络连接

重新将写好镜像的 TF 卡插入电脑,找到根目录中的 network-config 文件,用记事本工具打开。

  • 如果你的树莓派是有线连接网络,则修改 ethernets 段的内容,例如:
# ...
ethernets:
  eth0:
    dhcp4: false
    optional: true
    addresses: [192.168.31.33/24]
    gateway4: 192.168.31.1
    nameservers:
      addresses: [192.168.31.1, 211.137.96.205, 8.8.8.8]
  • 如果你的树莓派是无线连接网络,则修改 wifis 段的内容,例如:
wifis:
  wlan0:
    dhcp4: false
    optional: true
    access-points:
      "my home wifi":
        password: "12345678"
    addresses: [192.168.31.33/24]
    gateway4: 192.168.31.1
    nameservers:
      addresses: [192.168.31.1, 211.137.96.205, 8.8.8.8]

其中:

  • dhcp4:是否获取动态分配的 IP 功能,为了后续连接方便,我建议配置固定 IP 地址,所以设置为 false。
  • access-points
    • "<wifi network name>":将其中的 "my home wifi" 变更为你的 wifi 网络名称(名称中有空格,需要加上引号);
    • password: "<wifi password>",将"12345678" 变更为你的 wifi 密码。
  • addresses:树莓派的固定 IP 地址。
  • gateway4:路由器网关地址。
  • nameservers
    • addresses:DNS 服务器 IP,可以配置所在城市的 DNS 服务器地址,我参考网上资料,分别配置了路由器、城市和国际相关的3个 IP 地址。注意:中间那个城市的 IP,自己在网上搜索并更换为自己所在城市宽带运营商的 DNS 服务器 IP。

另外,如果后续要安装 microk8s 或 k3s 等 kubernetes 工具,可能需要在 cmdline.txt 追加 cgroup 相关参数(遇到问题时再加吧)。

cgroup_enable=memory cgroup_memory=1

备注:有的 Linux 系统的启动参数是在 nobtcmd.txt 文件。

配置完后,就可以将 TF 卡插入到树莓派设备中,并将移动硬盘插入蓝色的 USB3.0 接口上,然后上电开机。

注意:如果你的树莓派是通过 wifi 连接,而没有使用有线连接,需要在首次开机,也就是 Ubuntu 成功运行后(大约半分钟左右),再重启一下树莓派,才能正常连接 wifi。

如果已正常连接网络的话,我们就应该可以在电脑上通过 MAC 地址查询到树莓派的 IP 地址。

  • Ubuntu and macOS 上,使用命令:
arp -na | grep -i "dc:a6:32"
  • Windows 上,使用命令:
arp -a | findstr dc-a6-32

如果是老一代的树莓派,请将查询关键词替换为 "b8:27:eb" 或 "b8-27-eb" 。

如果连接还是遇到问题,你可能需要重新排查你前面步骤的参数是否配置正确,或者找台 HDMI 显示器和 USB 键盘,接上树莓派来开机,检查问题出在哪里。

首次成功连接网络并开机后,就可以通过 ssh 工具登录到树莓派的 Ubuntu 系统了。默认的登录账号和密码均为 ubuntu。

sudo ssh ubuntu@192.168.31.33

如果你没有用过 Linux 或其它类 UNIX 系统,要提权执行命令的话,记得在执行的命令前加 sudo;或者是通过 sudo su 命令直接用 root 用户来操作。

首次登录 Ubuntu 成功后,会提示你重新设置新的密码,按要求操作即可。

如果后续还需要调整相关的启动配置,可以到 /boot/firmware/ 目录下进行相关的修改,然后用 reboot 命令重启一下 Ubuntu 即可。

系统默认的主机名为 ubuntu,我通常为了好识别,都改为树莓派的简称:raspi,使用 vi 工具来编辑一下即可。

sudo vi /etc/hostname

如果你没有用过 vi 工具,进入后请按键盘上的字母 i 进入 INSERT 模式,才能进行编辑,编辑好后按 ESC 退出编辑模式。然后,再按 :wq 来保存并退出 vi。

挂载移动硬盘

我们插入到树莓派设备上的 USB 移动硬盘,不像在桌面电脑上那样会自动识别并挂载,而是需要自己来操作的。下面就介绍一下对新买的移动硬盘进行分区、格式化和挂载的操作。

先查看一下磁盘列表:

sudo fdisk -lu

可以看到还没有挂载的 1TB 的移动硬盘设备 /dev/sda

首先我们对磁盘进行分区。如果你已在其它电脑上对移动硬盘分区格式化了,就跳过以下部分,直接看最后的挂载操作。

通常来说,为了方便以后存储,做成 1个分区就行了。执行命令,根据提示输入:n p 1 再加一路回车,Y,然后 w 保存即可

sudo fdisk /dev/sda
Command (m for help): n
# ...
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

安装 exfat-utils,将分区格式化为 exfat 格式。

推荐使用 exfat 分区格式来格式化移动硬盘,这些方便以后 Ubuntu, Windows, macOS 几大桌面系统都可以使用。

sudo apt install exfat-utils
sudo mkfs.exfat /dev/sda1
mkexfatfs 1.3.0
Creating... done.
Flushing... done.
File system created successfully.

接下来,创建挂载目录,并将移动硬盘在 Ubuntu 系统启动时就挂载上。这需要在 /etc/fstab 文件中配置挂载参数。

fstab 文件中 mount 硬盘时,尽量使用 UUID,而不应该使用 /dev/sda1 这样的驱动文件。 因为,每次重启时,驱动都会更新这个文件对应的硬盘分区。如果你使用 /dev/sda1 这样的格式,那么在你的树莓派上再插入优盘、其它移动硬盘等重启时,有可能就会 mount 错误的分区,就尴尬了。

这里需要注意的是,因为后面的云盘同步软件访问移动硬盘会出现无权限问题,所以需要为当前用户 ubuntu 设置大一点的权限。

先查看各个分区对应的 UUID。

ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 15 Oct 23 16:13 483efb12-d682-4daf-9b34-6e2f774b56f7 -> ../../mmcblk0p2
lrwxrwxrwx 1 root root 10 Apr  1  2020 5F8A-B54A -> ../../sda1
lrwxrwxrwx 1 root root 15 Apr  1  2020 B726-57E2 -> ../../mmcblk0p1

可以看到我的 sda1 的 UUID 是 5F8A-B54A

再查看一下登录账号 ubuntu 的信息(用户 UID 和 组 GID):

cat /etc/passwd
# ...
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash

可以看到 UID 和 GID 都是 1000。

那么我就在挂载的时候,使用 UUID,并且权限 777 赋予账号 ubuntu。

sudo mkdir -p /volumes/mydisk
sudo su
echo UUID=5F8A-B54A /volumes/mydisk exfat defaults,nls=utf8,umask=000,uid=1000,gid=1000 0 0 >> /etc/fstab
exit

注意

  1. 其中的 UUID=XXXX-XXXX,就更换为你自己的。
  2. 采用 UUID 方式挂载exfat 分区格式的盘时,必须安装 exfat-utils 工具。
  3. umask 配置为 000,代表权限就是 777 了(全部权限)。

刷新一下所有挂载。

sudo mount -a

查看最新的挂载情况:

df -lh

如果想取消启动时挂载,请 vi 编辑 /etc/fstab 文件,将相应的配置行删除即可。

对于其它需要临时挂载一下的优盘,可以使用以下命令来进行。

sudo mkdir -p /volumes/udisk
sudo mount -t exfat /dev/sdb1 /volumes/udisk

用完之后 ,取消挂载即可。

sudo umount /volumes/udisk

配置其它

配置 NTP 网络时间服务器
为了确保树莓派的系统时间更准确,可使用国内自己的网络时间服务器。修改相关的配置文件 /etc/systemd/timesyncd.conf 中的 NTP 服务器。

NTP=ntp.ntsc.ac.cn cn.ntp.org.cn

配置时区
设置自己的时区,以便更方便地查看系统时间:

sudo timedatectl set-timezone 'Asia/Shanghai'
# 查看当前时间,也就是按国内标准时间 CST 显示了。
date

配置定时清理缓存
树莓派的内存资源有限,系统不会自己清理,我们可每天定时清理一下。
先创建一个 /root/script/cleancache.sh 脚本文件:

sync && echo 1 > /proc/sys/vm/drop_caches && echo 2 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches

然后创建定时任务:

sudo crontab -e

选择 1) nano 编辑文档,在文件末尾增加下面的任务项:

* 0 * * * /root/script/cleancache.sh

然后按 Ctrl + X 退出并保持文件,再回车即可。

补充1

很多程序的运行都依赖随机数生成,比如 hash、加密解密等过程。申请随机数就会消耗系统的 entropy(熵),当 entropy 低到一定阈值,程序就运行缓慢,等待随机数种子。比如,日志输出缓慢,排查 entropy,发现可用值非常低,低到会阻塞程序运行(通常小于 1000 程序就会卡住)。

cat /proc/sys/kernel/random/entropy_avail

一般来说,kernel 可以从硬件运行信息中收集噪声来补充 entropy,但树莓派毕竟硬件能力有限,无法从硬件层面快速生成 entropy,可以安装 haveged 软件提供模拟算法进行补充:

sudo apt install haveged
sudo systemctl enable haveged
sudo systemctl start haveged

补充2

如果安装 apt 软件包时,出现 Could not get lock /var/lib/dpkg/lock-frontend,说明之前使用apt时出现异常,没有正常关闭,需要手动 kill。

先使用ps 和 grep 查找 apt 的 pid,根据查询返回的编号,使用 kill 命令干掉,例如:

ps afx|grep apt
kill 16215

或者,手动删除。

sudo rm -rf /var/lib/dpkg/lock-frontend

如果出现 Could not get lock /var/lib/dpkg/lock,类似处理。

sudo rm -rf /var/lib/dpkg/lock

恭喜您,树莓派的基础工作就准备完了,您可以根据需要继续阅读后续篇。

我是几昆虫,一个追求终身成长的努力者。感谢您完整阅读这篇文章,期待与你的思想相遇。

推荐阅读更多精彩内容