Category Archives: Linux

Raspberry Pi家用案例——其他篇

前言

开一个新坑,讲讲Raspberry Pi在家庭场景中的一些常见应用。

整个系列的主旨是在尽可能简化的环境和配置中实现这些应用,同时尽可能保证性能,并在一定程度上保证可靠性。内容一般不会涉及基础的命令和操作。

那么第一篇文章就要来解决一下联网的问题。

材料准备

配置文件

首先我们要准备一个支持Clash订阅的服务商。用任何一个桌面上的clash客户端把配置文件打开备用。

软件包

这里我们使用闭源的Clash Premium,可以得到相对完整的功能。在这里搞一个适合你的设备的包。我用的是64bit版本的Raspbian,可以用armv8的包,如果是一般版本的 Raspbian 直接用armv7就可以。

开工

让飞机跑起来

把下载下来的二进制文件重命名,直接扔进/usr/bin/之后赋权。

在一个你喜欢的地方做一个配置文件config.yaml:

#下面一段是基础配置配置
#服务端口随你喜欢,混合端口比http、socks分开配置简单,也可以避免引入没必要的端口监听
mixed-port: xxxx
#当然允许,迟早要用到
allow-lan: true
#可以定义你要监听的interface,但是clash的interface控制非常弱,不支持复杂的策略,不建议在这里限制
#bind-address: '*'
#bind-address: 192.168.6.253
#bind-address: 127.0.0.1
mode: Rule
log-level: info


#外部控制器的监听设置,由于原版的clash不具备任何管理UI,后续要通过外部webui进行管理
external-controller: 0.0.0.0:xxxx
experimental:
  ignore-resolve-fail: true
interface-name: eth0

#下面是一段直接把提供商配置文件proxies:后面的部分全部贴进来
#内容略

网关模式

我们知道,Apple TV没有提供代理设置选项,我们必须要让clash允许在网关模式,接管设备流量。

clash现在支持网关模式,但是文档全都糟透了,有的语焉不详,有的混乱杂糅。传统的方式涉及到ip route、ip rule、iptables的配置,是一个我就算看得懂也不想做的配置。

后来clash新增了一个基于TUN的网关模式,配置只需要非常简单的几步。

第一步,启用IP转发sudo echo "net.ipv4.ip_forward" > /etc/sysctl.conf

第二步,clash配置文件加点内容:

tun:
  #启用TUN
  enable: true
  stack: system
  #配置DNS劫持,有文档建议用更可靠的DNS,实际上用国内的也可以
  dns-hijack:
    - 114.114.114.114:53
dns:
  #启用内置DNS服务器
  enable: true
  #禁用IPv6支持
  ipv6: false
  listen: 0.0.0.0:53
  #在这里使用fake-ip模式可以简化配置。
  enhanced-mode: fake-ip
  nameserver:
    - 114.114.114.114
    - 8.8.8.8

自启动

如果你和我一样是一个懒人,直接在root的crontab里加一条@reboot clash -d "配置文件路径”就好了,这东西一般不会挂。

如果你是一个讲究人,自己写一个systemd服务就好了,这么勤快的人肯定会。

使用代理

对于Raspberry Pi本身来说,想使用这个代理,可以直接运行sudo raspi-config,在里面配置代理,或者直接创建配置文件/etc/profile.d/proxy.sh,加入下面几句:

export all_proxy='socks5h://127.0.0.1:[mixed-port]'
export http_proxy='socks5h://127.0.0.1:[mixed-port]'
export https_proxy='socks5h://127.0.0.1:[mixed-port]'

对于其他设备,直接静态IP,把网关和DNS都指向树莓派就可以。

一些说明

IPv6去哪了

看得出来,配置没有为IPv6做准备。原因是我没有在任何地方找到clash在完整运行网关模式时的 IPv6 配置文档,甚至连拼凑一个配置都做不到。

DNS增强模式

clash支持 fake-ip 和redir-host两种模式。

fake-ip模式下,不管终端请求哪个域名,clash都会把utun的地址198.18.0.1/16返回给终端,终端将去往198.18.0.1/16丢给网关,也就是树莓派的物理网卡地址,数据进到树莓派后依靠内核的IP转发丢给utun,clash就可以处理后续的分流工作,是一种0配置的方案。

redir-host模式下,clash会返回真实的IP地址,终端把请求丢给树莓派的物理网卡后,系统并不天然了解这些包要丢给utun,所以需要用到ip route、ip rule、iptables这些东西做一堆策略来引流。这是clash官方文档中推荐配合utun的模式,但我非常不推荐。

代理协议的选择

代理协议有几种选择:

http协议支持范围最广,几乎所有支持配置代理的软件都支持这个协议。http协议运行在应用层,先对于后面会提到socks代理,连接开销会大一些。由于http具备完善的加密能力,可以轻易对流量进行加密,形成https代理。

socks5协议运行在会话层,相对于http代理,连接开销更小。socks全系列协议都是毫无加密手段的,完全谈不上传输安全性,只适合在非常可控的网络环境中使用。

socks5h协议在socks5的基础上增加的远程dns解析,dns请求会直接通过socks5h连接送去代理服务器进行解析,可以面对更复杂的代理需求。

注意,并不是所有软件都支持socks类型代理,当我们把socks5h设置为树莓派的系统代理,要随时注意软件兼容性,比如aria2是没有socks支持的,python需要安装单独的包。

预告

完成了代理的配置,Apple TV就可以看在线视频了,而树莓派的其他配置也要开始了。

下一期我们来讲讲文件共享。

魔鬼的组合:OpenWrt+Dnsmasq

且不说给我的WHR-HP-G300N刷了OpenWrt之后遭遇的重重劫难,单说一个DNS给我带来的困扰。

我坚持认为我的设备必须拿到别的环境马上可用且没有多余配置,所以家用网络但凡能用dhcp解决的问题绝对不用static,那么很明显DNS也是要通过DHCP分配的,而不是写在终端上。于是…

我习惯给网络配置两个DNS,一个114dns和一个本地ISP分配的,也就是114.114.114.114和202.99.224.68,因为114dns性能更好,但是一旦遇到特殊情况,ISP的DNS作为备用,最后DNS请求统一通过路由器进行转发,为终端提供192.168.x.1的DNS服务器。这样的配置在路由器的原生系统上并没有什么不妥,但是在OpenWrt上就会出现以下情况:

1、当我把dns设置在interface wan的时候,DNS请求看起来会随机发往两个DNS服务器的其中一个,或总是发往相应更快的那个。于是总是ISP的DNS解析我的请求。

2、当我把dns设置在interface lan的时候,DNS转发的行为与配置在wan上时一致

3、当我把dns配置在dhcp配置文件的Dnsmasq区域时,不管是否禁用自动查询resolv.conf.auto文件,DNS转发的行为与配置在wan上时一致

4、当我把dns配置在interface wan,且启用自动查询resolv.conf.auto文件,且配置严格按照resolv顺序查询后,DNS请求如我所愿按顺序发到了第一行的114DNS

5、我猜测,如果把dns配置在interface lan,其他配置按照上一条进行,也可以满足需求

那么问题来了:

1、如果我希望使用dhcp配置文件的Dnsmasq区域负责DNS配置时,要如何才能实现顺序解析

2、为什么一个集成化的路由器系统可以在wan、lan和dnsmasq上分别配置dns服务器

3、option serverlist server两种配置究竟有什么鬼区别

DD-WRT 低端配置一路指西

一般来说没什么特别需求的人还是别用这类的奇怪固件了,原厂的都够用 由于 Buffalo 的路由器都是用的 DD-WRT 的定制固件,我被研究了一下这东西

很多人刚刷完 DD-WRT 之后发现无线信号比原厂固件差很多,那么我们应该研究一下这些设置
事先定义:我使用的设备是 Atheros 平台的渣渣产品,设置界面与 broadcom 芯片的界面有显著区别
事先定义2:好些文档没看懂,一下分析可能都不对

Wireless Channel

古早时代 r18000 之前的版本可能会出现选择频道 11 导致发射功率低下的问题,如果你就打算在这种古老版本上吊死的话,需要注意这个设置 而对于目前的任何版本,选择 Any 即可

Regulatory Domain(管制区域)

DD-WRT 的文档中说这东西会影响 TX Power 与 Antenna Gain 之和的最大值,全球的各国、地区的管制功率最大的就是加拿大,达到了 36dBm ,这也是 DD-WRT 所能设置最大 dBm

TX Power(发射功率)

官网文档建议将这里设置为管制区域允许的最大值,但是这个地方的功率只是最大值,一般来说设备不会一直以这个功率进行发射,而且具体功率能达到多应该是也受到了设备的硬件限制,在管制区域限制的范围内多试一试或许可以找到一个比较好的值

Antenna Gain(天线增益)

很多人误解增大这里的值可以增加发射功率,但是根据 DD-WRTBuffalo 的文档,增大这个值可以『聚焦信号』
当这个值为 0 时,无线电的覆盖范围是一个球体,而增大这个值之后,无线电覆盖范围被纵向压扁、横向扩展为一个铁饼、铜锣烧、M&M豆的形状
这个设置对于普通人家是很有用的,因为一般人的房子都是一个横向大跨度、纵向三米的空间,一个压扁的覆盖范围恰好合适
Buffalo 的某些高功率系列设备可以提供 5dbi 的天线增益,需要这个设置的可以参考该值
注意,这个值与 TX Power 之和必须小于等于 Regulatory Domain 的限制

Buffalo 文档截图
antenna_gain

TX Antenna Chains 和 TX Antenna Chains

对于多天线的设备来说,正确的选择这两个选项才能真正实现与硬件相符的 MIMO 效果,具体设置需要根据不同设备进行测试,不过一般来说两个都选最全面的那个就差不多

观察是必须的

以上设置每做一步就应该在 Status – Wireless 里观察一下当前的 TX Power 和各个接入设备的信噪比,以确定操作对性能的具体影响

其他

以上是针对信号方面的设置,而对于 11n 的设置就比较简单了,Wireless Network Mode 设置为 NG-Mixed 或者 N-Only,Channel Width 设置为 Turbo(40MHz),而加密类型应选择 WPA2+AES 的形式


好好用你们的原厂固件,别瞎 Justin Bieber 折腾这些没用的东西,真正带来的效益是几乎看不到的

绝对是个人恩怨(笑)

今天 ArchLinux 的一个更新附带了 这个 说明
尝试更新,果然提示了包冲突

grep ‘^lib/’ /var/lib/pacman/local/*/files

查看可以发现引起这个问题的是 usbmuxd-git 这个包,于是我的怨念终于再次爆发了

各种桌面环境都有包依赖 upower ,而 upower 居然依赖 libimobiledevice ,而 libimobiledevice 依赖 usbmuxd ,而 libimobiledevice 和 usbmuxd 都还是一年多前的版本…

官方源中的 libimobiledevice 1.1.1-2 是 28.04.2011 版本第二次打包
libimobiledevice 1.0.7(stable) 在 22.03.2012 更新
官方源中的 1.1.1-2 (unstable) 随即被标记过时
官方源 2012-04-23 的更新居然只是重新给 1.0.7 打了第三个包

官方源中的 usbmuxd 1.0.7-2 是 2011-03-22 版本的第二次打包
usbmuxd 1.0.8 在 2012-04-07 发布
官方源中的 1.0.7-2 在 2012-04-14 被标记过时
官方源 2012-05-05 的更新居然只是重新给 1.0.7 打了第三个包

如果 libimobiledevice 不更新是因为版本号回滚太猎奇,那么后面在 08.04.2012 发布的 1.1.4(unstable) 怎么也不更新?
更何况 usbmuxd 的版本号是很明确的,为什么也不更新?


以下开始扯淡


于是只有一个解释

usbmuxd 在 12.01.2012 被 Nikias 从 Hector Martin 手中接管
一定是因为 archlinux 官方源维护 usbmuxd 的人是 Hector Martin 的好基友才永久的保留了他开发的最后一个版本,一定是这样的!

这绝对是个人恩怨(各种意义上)!

一般用户

什么?
你不能 PPPoE over wifi ?
你不能不能玩各种游戏?
你不能…

什么都不能,干嘛不去死

管你 sunpinyin 多强大,比不上搜狗就不行
管你 mplayer 多强大,随手装上就全有硬解吗,就能自动下载字幕吗
管你 GIMP 多强大,比 PS 方便吗
管你开源不开源,代码给我有鸟用
你有迅雷吗,你有 QQ 吗,你有人人桌面端吗,你有 iTunes 吗,你有 360 吗

一般用户是很现实的,人家不关心你这是不是朝阳产业,人家要的是蛋糕,至于奶怎么挤、面怎么磨, who fucking cares

那些掌握着技术的家伙非常适合开发那些用户看不到却很重要的东西,因为这些东西不需要在意用户的感受,也不用和用户商量。他们开始的时候也就是这样做的,估计就是这样养成了不关心用户体验的毛病
我们可以注意到,真正提供最佳用户体验的软件几乎没有开源社区搞出来的,要么是私有,要么是后开源


这时候很多人就要说了

有本事自己写一个

你会踢球吗?还不是照样天天骂国足?

其实对于最终用户来说,自由软件根本不自由,他们无法改变什么,就像面对封闭软件一样

为毛 Linux 总给人糟糕体验!?

之前某天 Archlinux 把 grub2 从 1.99 更新到了 2.00beta2 ,这个更新并不是来自 testing repo ,因此可以看作是足够稳定的版本。
在印象当中,更新过程没有给出任何在更新之后需要手动操作的提示,而重启之后我看到了几个 file not found 。虽然最终系统还是可以正确引导,但明显是有问题的,于是我开始解决这个问题。
简单的问题,直接运行 grub-install 重新复制相应的文件到 /boot/grub 就好了。然后重启发现之前手动配置的 framebuffer 分辨率失效了,取而代之的是默认配置时刺瞎狗眼的 640×480 分辨率。于是继续解决新出现的问题。
grub 使用 vbe 定义的分辨率模式,而 vbe 最后一个版本出现于 1998 年,显然这货几乎不支持任何宽屏分辨率。以前如果手动定义一个 vbe 没有的 1366×768 分辨率,它会自动匹配一个 1024×768 的分辨率,虽然不能点对点显示,但是至少在 Y 轴上科学了。然而 2.0beta 严格要求定义的分辨率必须是 vbe 所支持的,否则果断瞎你狗眼。
好了,换上一个还算科学的分辨率之后顺手看了一眼 grub2 的配置文件 /boot/grub/grub.cfg ,注意到这东西并没有使用已经被安装到当前目录的字体文件,而是与以前的版本一样使用了 /usr/share/grub/ 里相同的字体,虽然接着改也是可以的,但是不知道这样的配置用意如何,就先不去管它了。

话题再回到 framebuffer 分辨率。这个东西不仅影响 grub 那个命令行界面的显示效果,还会影响之后所有终端的显示状态(不是终端模拟器),那么它理应自动适配一个点对点的分辨率;即便不能自动适配,也应该支持我所使用的烂大街的分辨率;即使不支持这个分辨率,也应该在我配置这个分辨率时帮我选择一个替代的分辨率;如果突然觉得不想再帮我找到那个替代的分辨率,你 TM 就应该在安装的时候提示我!

问题就是在这里,不知道开发者是不是认为 Linux 的用户理应了解怎么这个系统是怎么运作的。作为用户,我不仅要给开发者擦屁股,还要面对擦不完的屁股,还要研究他们的消化系统是什么结构来预测下次拉屎是在什么时候,而且他们拉屎之前还不打算通知我…

用户体验是把用户当白痴一样的照顾,不是当白痴一样耍。

ArchLinux 不错的

装 ArchLinux 已经两个月了吧,说说感受

~~~~~~希望 Linux 可以和 Mac OSX 一样免调教的现在可以出门右转了~~~~~~

如果说 ubuntu 提供的是现成的家具, arch 就是宜家,对于很多人来说确实非常麻烦,但是对于有爱的来说就是很好的体验了。
由于结构相对简单,遇到任何问题都很容易找到原因,方便解决问题对于 Linux 这样一种必然会出问题的操作系统来说是非常重要的。

虽然没有好用的 GUI ,但是 arch 的包管理系统非常简单易用,尤其是在安装 yaourt 之后。官方的 stable repo 足够稳定,软件包也非常充足。
而由用户维护的 AUR 则可以方便的获取各种尚未进入官方 repo 的包,而且还能直接抓取源码编译安装,可以方便的跟进一个经常变化的软件(比如 fcitx 和 hotot)。
不管是追求稳定还是希望尝试新鲜事物,arch 都可以提供方便的条件。

对于我这个水平的用户来说,刚刚开始安装、调教的时候确实感觉 Arch 的 Keep It Simple, Stupid 很 stupid ,需要调教的部件实在太多了,配置好 arch 实在是很辛苦,但是一旦配置好就会比 ubuntu 这种系统稳定的多。
现在来说除了 linux 没有正经游戏、 emule 、 iTunes 之外, arch 已经可以完成各种任务了,当然考虑到 GIMP 、 audacity 这种标准的软件的“重功能、轻体验”的 linux 图形界面软件,这类的操作还是回到 windows 比较靠谱。

强力推荐 Hotot

Hotot 是一个 linux 平台的 twitter 客户端软件,基于 python 和 webkit 。
非常轻量化,目前的的大小只有 2mb 左右,但是可以提供非常全面的功能,如果认为功能不足,还可以使用扩展。同时,这家伙对 twip4 的支持非常完善。
目前这款客户端仍在测试的状态,还不是很稳定,但是已经可以胜任日常使用。

这个项目是由一位有爱的推友 @shellex 主导的。

更具体的介绍、截图可以看 Hotot 的 官网 和 google code 上的 项目页面
另外我在 这里 抢先提供一下 Hotot for amd64 的 deb 包,这个包随时都会更新

强烈推荐 ubuntu tweak 的清理 PPA 功能

ubuntu tweak 最新 0.5.5 加入了一个清理 PPA 的功能,这个功能不是简单的从软件源里删除一个 PPA ,而且附加了自动降级的功能

我之前多次吐槽过一个 PPA ,ppa:nvidia-vdpau/cutting-edge-multimedia ,这个倒霉的 PPA ,从来没靠谱过,源里的 mplayer 能用 vaapi 却不能用 vdpau , ffmpeg 安装之后各种使用相关库的软件找不到库,后来 VLC 全面悲剧,在后来导致 ubuntu 的媒体预览失效。然而,这个 PPA 相关包太多,依次降级简直是摧残生命。

终于 ubuntu tweak 清理 PPA 功能,自动降级,全面解决问题

同样,如果你对 ppa:telepathy/ppa 深恶痛绝,也来试试吧

最近的一些研究

上回说到有一个神奇的 PPA 提供支持 vaapi 的 mplayer ,但是最近这个源的一个更新导致源里的 VLC 和 mplayer 集体报销,一气之下自己 svn 了一个 mplayer ,目前用起来十分舒适,我主要说一下关于字幕的问题。

有些字幕在 mplayer 上播放的时候会出现 “too long” 的报错,这个时候就可以把字幕当作 ass 字幕进行处理,使用 -ass 参数进行播放,当然如果直接写进配置文件也可以,但是这样也有后遗症,字幕字体大小不受 mplayer 控制,而是按照字幕自身设置,结果就是某 cucn201 放出的 mkv 内嵌字幕显示超大,如果定义 0.5 倍大小,某 Halo: legend 外挂字幕又太小,所以这个参数还是按照需要添加好了

昨天折腾了一下 ubuntu 的字体,终于能按照自己的需要分别定义中文、英文字体了。去修改 /etc/fonts/conf.avail/69-language-selector-zh-cn.conf ,每个字体族只留需要的两个字体,第一个为英文,第二个为中文,重启。

因为 ubuntu 里面的通知区使用的是衬线体, google 的搜索结果也是衬线体,而中文的衬线体一般都很难看,所以这里就是设置的关键,我这里的衬线体用的是文泉驿正黑,这个字体内嵌还了点阵,优化小字体的显示效果




serif


DejaVu Serif
WenQuanYi Zen Hei




sans-serif


DejaVu Sans
WenQuanYi Micro Hei




monospace


DejaVu Sans Mono
WenQuanYi Micro Hei Mono


当然如果对其他非 zh-cn 字体有需求,还需要改其他的几个 69 文件

除此之外,还要选择合适的抗锯齿类型,在我这里 轻微(slight)的效果就很好

fx 也要挨个设置字体

效果图两张