無標題文檔

基于「树莓派」的家庭网络服务

当初组建家庭网络的时候,就考虑到自己的需求:主要是网络存储、以及跑部分比较耗时的「定时任务」,例如爬虫和下载还有部分的数据处理等。

本来考虑部署一台性能相对比较好的服务器去处理,但这样子考虑到部署太过中心化不好管理,同时硬件的成本有些高而且占地的面积太大,因此就暂时被我搁置了。

后来想到 空帷 的朋友圈,使用「树莓派」这个方案相对比较轻量,同时多出来的「树莓派」还可以用来它用,因此考虑使用「树莓派」搭建自己的家庭网络服务。

下面是简单的网络拓扑图,同时主要说明下图中的内容:

网络拓扑图

  • 其实一开始组网的时候就使用了软路由的方案,所以路由器的性能并不差,但由于网络基础的缘故,还是不想过多的在上面部署太多的服务;
  • 使用了 USB 协议的的 RAID 磁盘阵列柜,没有使用 NAS 的原因是当数据恢复的时候可以当作普通的 USB 外接硬盘来恢复、简单便捷;
  • RAID 阵列柜和一个树莓派链接,上面跑了 Netatalk、Samba 以及 Syncthing 等文件服务,速度肯定没有 SATA 协议的快,但是家庭网络中 USB 速度不是瓶颈;
  • 将下载、数据等应用服务分别使用了其他的树莓派去部署,平时如果不用直接插拔硬件即可;
  • 装修的时候就单独开了一条电路用于 UPS 不间断电源使用,因此树莓派以及无线网络放大器可以不用放在同一个地方;
  • 目前,将负责文件管理的树莓派同时用于管理 UPS 等,只要家中电源中断或者电压不稳,发送局域网广播通知应用应用服务下线,并切断 USB 阵列柜的电源;
  • 考虑加树莓派链接电视,部署视频点播等功能,淘汰目前的小米盒子(爱奇艺在盒子上还需要重复收费,这块的费用不低)。

顺便说下,基于「树莓派」我已经写好了几个 Docker 的镜像,主要是文件管理(Netatalk、Syncthing 等)。可以直接拿来部署使用,不用重复造轮子啦:

  1. https://github.com/mingcheng/raspberry-pi3-syncthing
  2. https://github.com/mingcheng/raspberry-pi3-netatalk

- 未完待续 -

扩展 Helidon 的健康检查模块

Helidon Logo

Helidon 是 Oracle 提供的轻量级的微服务框架,提供了 Router、Microprofile、Security 等必要的组件。相对 Spring Boot 等老牌框架而言,它的优势在于轻量同时源代码简单适合阅读。

由于是新出的框架,所以它的文档还不够完善,有时间需要阅读其代码才能明白具体的使用方式。例如,Helidon 的健康检查这块的文档就写得非常的简单,如果想要扩展按照文档中的例子代码将会写得很混乱。

HealthSupport health = HealthSuport.builder()
    .add(() -> HealthCheckResponse.named("exampleHealthCheck")
                 .up()
                 .withData("time", System.currentTimeMillis())
                 .build())                          
    .build();

实际上,Helidon 的 HealthChecks.healthChecks() 已经提供了三个默认的健康检查的反馈,分别是死锁、磁盘以及内存的状态:

/**
    * Built-in health checks.
    *
    * @return built-in health checks to be configured with {@link io.helidon.health.HealthSupport}
    * @see io.helidon.health.HealthSupport.Builder#add(org.eclipse.microprofile.health.HealthCheck...)
    */
public static HealthCheck[] healthChecks() {
    return new HealthCheck[] {
            deadlockCheck(),
            diskSpaceCheck(),
            heapMemoryCheck()
    };
}

分别看其代码就可以发现,这三个直接调用的方法其实就是 HealthCheck 接口的实现。因此,我们自己也可以按照 Helidon 的方式来实现自定义健康检查的项目,满足本地的具体业务的情况。

例如,下面实现了个显示本地服务器时间以及虚拟机的 UPTIME 的状态:

@Health
@ApplicationScoped
public class LocalTimeCheck implements HealthCheck {

  @Override
  public HealthCheckResponse call() {
    return HealthCheckResponse.named("localtime")
        .withData("upTime", ManagementFactory.getRuntimeMXBean().getUptime())
        .withData("currentTime", System.currentTimeMillis())
        .build();
  }
}

然后,在注册到对应的 HealthSupport 中即可:

HealthSupport health = HealthSupport.builder()
    .add(new LocalTimeCheck())
    .build();

顺便说一句,需要注意下:HealthSupport.add() 里面的回调都是同步执行的。

HealthSupport 默认绑定的路由为 /health,如果需要更改这块则根据源代码的提示,增加 .webContext() 这个方法即可,或者直接将其配置到配置文件中:

HealthSupport health = HealthSupport.builder()
    .webContext("/your-health-check-path")
    // ...

- eof -

在 Xorg 中配置苹果的蓝牙键盘

目前同时有台 MacBook Pro 以及 Thinkpad X1,所以想同时使用苹果的蓝牙键盘链接,碰到了键位映射的问题,所以记录下。这次折腾的主要原因是 Thinkpad 的左下角功能键的键位和苹果键盘是不一致,如图:

Apple Keyboard

最主要是对比 Thinkpad 的 Win(Meta) 键和 Alt 和苹果蓝牙键盘的 Apple 和 Alt 是相反的,如果同时使用会有转换的过程,因此需要转换下键位。

硬件方面链接蓝牙的过程就不复述了,Arch Wiki 中有很详细的说明。我使用的是 bluetoothctl 连接硬件,同时使用 BlueMan 作为 GUI 的前端。同时将 BlueMan 加入到 i3wm 的启动脚本中,能够做到自动链接,方便。

键盘链接成功以后,使用 xinput list 查看对应的 device id:

$ xinput list 
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Synaptics TM3072-003                        id=11    [slave  pointer  (2)]
⎜   ↳ Logitech M570                               id=14    [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                       id=12    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=9    [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                      id=10    [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated C             id=13    [slave  keyboard (3)]
    ↳ Apple Inc. Magic Keyboard                   id=15    [slave  keyboard (3)]

其中,能够看到苹果的蓝牙键盘的 device id 是 15,需要暂时记下这个值。然后使用

$ setxkbmap -option altwin:swap_alt_win -device $DEVICE_ID

就可以测试 Win 键和 Alt 键是否对调成功。顺便说一句,对应的还有个命令可以将 Caps Lock 利用起来:

$ setxkbmap -option ctrl:nocaps -device $DEVICE_ID

这样子 Caps Lock 就映射到 Ctrl 键了。具体更多的设置可以在这里 查看(我是 Arch Wiki 的搬运工 😄)。

这样子还有点不方便的地方,就是每次链接蓝牙键盘的时候都要跑下这个命令,于是还是考虑到使用 udev 脚本去自动化。下面是我的 udev 脚本,可以供参考:

ACTION=="bind", SUBSYSTEM=="hid*", DRIVER=="*apple*", RUN+="/usr/bin/sudo -i -u <user> /<path>/key-mapping.sh"

然后还需要考虑到插入 USB 键盘的情况,这再多加一条规则:

ACTION=="bind", SUBSYSTEM=="usb", ENV{ID_VENDOR}=="Apple*", RUN+="/usr/bin/sudo -i -u <user>  /<path>/key-mapping.sh"

其中,key-mapping.sh 是复制下上面命令的脚本。

然后,将这个命令保存到个 rules 文件中,例如我的文件命名是 90-bluetooth-keyboard-mapping.rules 然后放到 /etc/udev/rules.d

最后,重启 udev 规则 sudo udevadm control -R 即可。

- eof -

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章