网络寻租

Programmer, Gamer, Hacker

一天弄懂计算机科学

| Comments

2016年底我去成都参加同学聚会,在火车上和一个大学生吹牛,说只要一天就可以教会他所有计算机科学——的基础。 整理了一下,发现其实真的可以一天教会脉络,剩下的就是细化细节了。

我会用几篇文章来讲一下。我保证讲的一定是本质的东西。

所有计算机科学的领域,可以按照体,术,用三类来划分。

  • :包括如何理解信息,如何记录信息,以及最重要的:如何处理信息,都包含在信息科学里面。
  • 术:包括如何利用信息科学的知识来创造一个可以处理信息的机器。
    • 如何设计机器(计算机体系架构)
    • 如何把程序语言转换成机器语言(计算机语言原理)
    • 如何把机器管理起来(操作系统)
  • 用:
    • 如何让机器跑得更快(算法)
    • 如何存储和交换数据(数据库系统)
    • 信息如何通讯(通讯协议,互联网)
    • 还有其他细分的领域

如何一个人管理一堆服务器

| Comments

现在有一些服务器自动化配置工具,比如ansible,chef,puppet等, 利用它们,可以实现我的一个想法:用配置文件定义服务器架构,从而实现一个人管理好一堆服务器。

比如用ansible,我们可以用一个YAML文件申明一台服务器上面有什么:安装了什么应用,存在什么配置文件,跑了什么服务。 然后用命令行工具,比如ansible-playbook,就可以构建出来这样的服务器。

这样操作的优点:

  • 可视化:原先服务器手工构建,其他人,甚至构建者自己都会不清楚服务器的状况。现在有了配置文件,大家就可以知道服务器上面有什么,是如何配置的。
  • 自动化:可以一条命令构建服务器,修改配置文件之后可以批量改动影响到的服务器,增加带有同样应用的服务器也非常简单,只要拷贝配置即可。如何搭建应用的知识可以复用。
  • 版本控制架构变更:可以用git版本库管理服务器配置文件,我们可以记录每次服务器架构的变更了。

具体操作:针对一组服务器架构,比如一个Rails应用以及附属的各个服务器, 可以创建一个git版本库记录所有的ansible playbook, 然后把敏感的配置文件,放到另外一个私密git版本库里面, 加密存储,保障安全性。

我搭建了一个演示用例,包括:

里面包含几台服务器:

  • app.yml 搭建Rails服务器,包括mysql数据库,nginx,systemd自动启动和监控脚本。
  • backup.yml 自动备份mysql数据库
  • zabbix.yml 对应的监控服务器(未完工)

私密配置版本库里面存放了所有的配置文件,构建一些应用需要的用户名和密码,一些初始化数据等。 在playbook里面会去读取这些配置文件,或者拷贝这些文件到服务器上面去。

管理Rails应用还需要一些其他的功能,限于时间,我就没有实现了,包括:

  • jenkins 自动化测试
  • sandbox,staging环境
  • mysql多主从架构
  • 多app负载均衡

综上所述,一个复杂的多服务器应用架构,可以用上面的几个版本库定义出来,并且可以根据需要动态进行修改。 这种配置方式适用于几十台机器之内的半静态架构,并且可以多人同时管理。

更进一步,如果利用aws或者digitalocean的api,服务器创建也可以采用配置文件定义。 不过我觉得使用起来并不是很方便,就没有这样做了。

如果机器数量多,或者需要动态伸缩,配置文件可能就不太适合了,可以用ansible-tower这种在线配置管理工具。 不过我觉得大多数的公司都不会达到这样的级别,因此配置文件就够用了。

我们需要淘汰一些编程语言

| Comments

在IT领域,因为从业者素质参差不齐的原因,很多垃圾东西在流传,其中危害最大的一类就是垃圾编程语言。 包括但是不限于:bash,perl,javascript,php,python。

这些语言为什么烂

他们的设计者并没有受到很好的编程语言设计教育,或者没有足够的时间进行设计, 造成的结果是,这些编程语言的设计存在很多问题。比如语法设计有问题,在语法处理上存在设计错误,写法晦涩不容易弄懂影响阅读, 缺少很多保证程序安全的设计,带有性能问题,语言本身缺少很多核心功能等。 具体内容可以去看王垠的博客

我稍微列一下烂在哪里:

  • bash: 缺少大量的编程语言抽象特性,语法是程序员乱设计的,接口是基于字符串而不是定义明确的数据结构
  • perl: 语法也是程序员乱设计的,难以阅读
  • php:乱语法,现在改进了很多,但是为了兼容还是带有一堆历史问题
  • javascript:几十天做出来的一个没有完善好的类lisp语言,早就应该被淘汰掉,因为web流行危害严重
  • python:比上述语言好一些,但是也有一堆设计缺陷,比如用缩进替代定义明确的语法块,匿名函数实现烂等

烂语言的害处

编程语言是程序的组成部分,类似于房屋的原材料。一旦你选择了编程语言,以后再要替换只能全部重写。 软件后续的维护和拓展都只能基于这种语言,会延续到软件的整个生命周期。 引入了一个烂语言,他的危害会覆盖软件的整个生命周期,并且像癌症一样,随着软件的传播而蔓延, 进而伤害其他依赖这个软件的系统,同时也给这个烂语言打了广告。

如何处理

对于旧的用了烂语言的项目,尽量以维护为主,不要增加新功能延长它们的生命周期。 比如systemd替代了旧的init系统,就淘汰掉很多垃圾bash脚本。

新的项目尽量不要用这些烂语言,可以寻找一些替代品。很多语言经过了良好的设计,值得推荐,比如java,csharp。 脚本语言和Linux下系统语言我还没有找到好的选择。我现在用Ruby但是Ruby也有很多问题,不值得长期使用。 Linux下系统语言可能有Rust,D,我不确定是否足够好,但是可以尝试。 Javascript可以用高层语言替代比如TypeScript,Webassembly推广之后会有很多好语言可以使用。

加密git远端版本库

| Comments

我打算把所有服务器的配置文件用git管理起来,这样可以记录配置变更状况。 但是有一个问题是,如何多人协作?服务器配置信息非常敏感,如果这个版本库泄漏,整个公司的服务器架构就彻底泄漏了。 这个版本库只能在开发者本地电脑里面解密,远程托管版本库的服务器不应该知道文件里面的内容。

那么解决办法就是:本地git版本库是解密的,在上传过程中内容全部加密,密钥保存在本地,同时密钥可以分享给其他开发者。

考虑了几个解决方案:

git-crypt:可以加密部分文件,原理是加上了加密的fiter和diff, 但是官方说只适合加密部分文件,而不适合全版本库加密。部分文件加密很容易造成信息泄漏,一定要全版本库加密才适合。

串联sshfs和远程服务器加密文件系统encfs:首先用sshfs加载远端文件系统,然后用encfs创建加密文件系统。 我估计无法解决多人同时push情况下的竞争条件,并且encfs有安全漏洞,使用上push/pull之前需要加载两层文件系统,不是很方便。

git-remote-gcrypt用gpg进行远端加密。 比较符合我预期的模式,但是用gpg不是特别方便协作。但是别的方法走不通,只有这个方法可用。

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 安装git-remote-gcrypt和gnupg
sudo apt-get install git-remote-gcrypt gnupg

# 创建一个gpg的key,需要设置用户名,邮箱,描述等,不要设置过期时间
gpg --gen-key

# 记录一下生成的key的ID,比如2048R/A0F0B575里面的A0F0B575,2048代表加密轮数,越多越不容易破解
gpg --list-keys

# 生成一个测试版本库
mkdir test1 && cd test1
git init .
echo "test" > a.txt
git add . && git ci -m "update"

# 在你的github上面创建一个project,比如:https://github.com/halida/ttt

# 配置远端加密版本库
git remote add cryptremote gcrypt::git@github.com:halida/ttt.git
# 最好指定用哪个key加密,这样可以共享这个key给其他人用
git config remote.cryptremote.gcrypt-participants "A0F0B575"
# push到远端
git push cryptremote master
# 访问远端版本库,看看文件内容,和commit里面的信息,是不是都是加密的?

如何分享给其他人

1
2
3
4
5
6
7
8
9
10
# 导出key
gpg --export-secret-key -a "share@share.com" > secretkey.asc
# 把secretkey.asc分享给其他人,拷贝的时候记得先压缩加密一下再发送,更安全

# 别人电脑里面导入
gpg --import secretkey.asc
# 下载代码
git clone gcrypt::git@github.com:halida/ttt.git test2
# 也要指定一下用什么key加密
git config remote.cryptremote.gcrypt-participants "A0F0B575"

用这种方法,可以用git管理一些私密又需要协作的信息(比如服务器配置), 也可以把github当作私密的版本控制系统来用(commit的消息还是明文的)。

比密码登录更好的权限验证方式

| Comments

现在各个网站,工具都采用密码方式登录,我觉得很不方便,同时安全性也不能得到保障, 这里我提出一种更安全更易用的权限验证方式,彻底解决这些问题。

首先我们看密码验证的缺点,从易用性和安全性来考虑。

密码的长度取决于人类记忆力。如果是随机密码,人类很难记住,最长大概8位,而现在云计算情况下,10位以下暴力破解并不是很困难的事情。 如果是非随机密码(比如一句话),单词的概率空间也和随机密码差不多甚至更少。 为了获得更可靠的安全性,密码必须设置得更长一些,对人的负担更重。 随着现在计算力的增长,为了安全,密码必须越设越长,而人的记忆能力是很难增长的。

从使用方式上,密码会传播到远端平台,在本地/网络/远端任何一个节点被监听到,用户的密码和信息就会被泄漏掉。

对于不同的网站或者应用,应该采用不同的密码,不然一个网站的信息泄漏了,就会影响到其他网站的安全性。 但是对于普通人而言,记忆超过3个复杂密码是很困难的。这也是为什么普通人往往通用一个常用密码, 然后现在各大网站很多的用户密码信息是泄漏的,对于普通人而言,常用密码已经被泄漏出去了。

现在有第三方的密码记录工具,比如lastpass,但是它增加了单点失效的风险:如果lastpass被攻克了,用户的所有密码都会被泄漏。

综上所述,密码验证方式缺陷很多,并不能很好地保障易用性和安全性。

从原理上面思考,借鉴现成的一些安全领域经验,我觉得更好的验证方式如下:

采用RSA方式生成公钥和私钥,私钥保存在一个绝对安全的单独硬件设备上,只提供解密服务。比如做成一个芯片,挂在脖子上或者植入皮下组织。 本地电脑能够访问该设备。

网站登录和验证过程采用和SSH协议一样的方式,基本上就是用户提供公钥给网站,网站通过公钥加密共享密钥过来,建立安全通讯频道。

这种方式的好处:

  • 易用性:用户只要输入网站,在本地电脑上面刷一下芯片就可以登录了,无须繁琐的密码输入。
  • 秘密信息(私钥)保证安全,第三方除了偷窃芯片设备,没有任何办法获得私钥。
  • 本地/网络/远端通讯模型中,网络没有办法窃听通讯。就算在本地或者远端设置了木马窃听信息,也不会丢失私钥。
  • 一个网站被攻破,只代表这个网站的用户数据泄漏了,不影响该用户其他网站的安全性。

一些我还没有想明白的问题:

  • 如何保证密钥设备被电脑读取的时候不开放给不相关的网站?这样当本地电脑中了木马的时候,也不会泄漏远端网站的信息?
  • 密钥设备丢失了怎么办?可以在家里备份保存一个。如果真的全部丢失了,只有一个个通知网站更换该用户的公钥,更换协议需要思考如何保证安全同时又能够做到替换。

难点:

  • 因为涉及到硬件,比较难部署开,需要用户购买一个安全芯片,以及读取和烧录设备。
  • 需要改变用户习惯,随身携带一个安全芯片。
  • 需要各大网站支持这种登录方式。

我觉得可能布开的方式是这样:首先要有一个大公司推动(比如苹果或者谷歌),在一个销量很大的设备上(比如手机), 这个芯片也还是要做到设备独立,不能做到手机里面。后面要有一个所有大公司参与的标准化组织制定规则。 感觉难度挺大的。不过这是更安全的做法,以后应该路径到达这种方式。

考虑摩托车

| Comments

现在我用的小电驴很好用, 是爱玛摩卡, 现在已经停产了, 长得这样:

image

它的好处是:

  • 非超标, 不需要上牌.
  • 可以载两个人, 后面的座位高度适合成人, 有靠背很安全.
  • 足够小, 可以上小型电梯, 城里面开起来非常顺畅.
  • 踏板上面可以放下很大的东西, 适合运货.

但是也有以下问题:

  • 速度最高30, 不够快.
  • 续航不行, 没法出城.
  • 轮子小通过性不好.
  • 没有左右转向灯, 速度表等实用安全配置.

解决办法有两个: 短途还是小电驴, 出城就靠汽车+折叠自行车. 或者买一个摩托车.

我考虑摩托车的方案. 摩托车使用上面相对电动车来说会更复杂一些, 毕竟是机械机构. 但是动力, 续航, 安全都比电动车好太多.

摩托车和汽车类似, 质量好的一般是合资日企, 比如本田. 所以我尽量还是在合资品牌里面选, 少折腾.

摩托车的样式主要有跨骑,弯梁和踏板. 区别在这里, 主要就是跨骑速度快续航高, 但是低速不好开, 运不了货. 踏板相对容易坏, 轮子小通过性差, 弯梁不容易坏.

所以首先我看弯梁. 但是看了本田, 雅马哈, 铃木, 他们的弯梁车都挺丑的, 去店里面看实物也很丑, 实在下不去手. 看了一圈, 国内的摩托车丑的居多, 类似小电驴, 也没有什么美观的型号. 稍微好看一些的只有跨骑了. 但是各大跨骑车都挺大的, 也不方便运货, 生活上不是很方便, 并且我也不需要开太快的车.

image

后面发现还有小的跨骑车, 比如本田 MSX125, 国内很多仿制的, 但是我还是信不过质量.

还有踏板, 本田的自由Today挺不错的, 但是我不太想要踏板车了, 和电驴区别不大.

image

选来选去, 最后发现还是现在的摩卡适合我的需求, 摩托车还是算了.

如何挑选背包

| Comments

以前买的一个米黄色电脑背包已经用了很久, 一直被老婆吐槽太丑, 于是花了一些时间研究了一下买什么背包比较好.

首先看我的实际需求. 我现在在家工作, 虽然不需要通勤, 但是还是会会骑小电驴出门透气换地方工作, 偶尔出去短途旅行一下. 所以一个可以装电脑, 一周内换洗衣物的背包还是需要的. 老婆发过来的一些潮牌包包看起来不错, 但是一个耐用好用低调的包更适合我的想法.

首先看看市场上有什么可以选择的. 我去看什么值得买的原创评测, Google搜索backpack, 了解到了一些知名的背包品牌: 一部分是主流户外运动用品品牌, 一部分是数码背包品牌. 好的背包价格也不便宜.

为了能够更了解产品, 我在Youtube上面搜索大家经常提到的背包型号, 看看评测, 慢慢对于自己理想中的背包有了概念了.

首先细化我的需求: 可以带15寸笔记本, 方便长时间背着, 可以携带短途旅行的东西, 耐用, 美观, 可以背在前面防小偷.

研究出来的方案: 中等体积大小(22L-30L), 简易背负(无背负不舒服, 复杂背负太大太重), 独立电脑仓位(保护更有力), 足够体积的主仓位(放衣物以及以后运输的杂物), 带有侧袋可以放水杯. 颜色我更偏好黑色, 看起来更”商务”一些, 不浮夸.

考虑了这些品牌: Osprey, Incase, Gregory, Arcteryx, Colehaan, Wenger, 根据我的需求, 筛选了这些型号:

Osprey pixel, Incase EO Travel, Gregory SKETCH 22L.

然后就等合适的打折出来, 就可以买了.

不过我新买的笔记本到货, 急用包, 同时也看到亚马逊上面有7折优惠, 上去搜索了一下, 本来可以考虑Gregory SKETCH 22, 但是剩下的几个颜色不好看. 偶然翻到之前看到过的Osprey Momentum 26L, 感觉还可以, 就下单买了, 总价524还算可以吧.

两天就到货了, 兴奋地研究了各种配置, 包的做工比我旧包好多了, 感觉很硬实.

image

这是上身效果.

image

image

背上去舒适度算一般, 天热背还是会闷, 还算满足需求吧.

GNS3介绍,安装和使用

| Comments

GNS3是一个虚拟网络的工具,用它可以学习如何配置局域网,以及在实际进行物理配置之前测试是否工作正常.

我为什么要研究这个工具呢? 因为现在我的家用网络有一些需求需要进行复杂的路由配置, 实际配置出现问题很浪费时间, 不如用一个虚拟工具来测试研究. 如果你对如何搭建局域网或者有类似建网需求, 可以考虑用这个工具.

文档在这里, 我就不重复写怎么安装了. 在安装之前, 我先讲一下原理, 知道了原理, 后面过程会顺利很多.

原理

GNS3的底层是Dynamips, 一个虚拟Cisco路由器的模拟器. GNS3同时它也支持其他的虚拟系统, 比如Vmware, Qemu, Virtualbox, docker等, 用这些虚拟化工具来模拟路由和主机.

Dynamips是基于Linux的, 所以在Windows和MacOS下面, 为了能够正常使用, 需要安装一个GNS的虚拟机(里面安装的是Ubuntu), 因为它里面需要跑虚拟化(虚拟路由设备或者主机), 所以会出现嵌套虚拟, 推荐使用Vmware来安装, 用VirtualBox性能会比较差. 如果你是Linux系统, 建议直接用GNS Server.

GNS Server是GNS的后端, 一个python写的管理系统, 它会根据前端的配置, 创建对应的虚拟化系统, 比如你创建了2个主机(VPCS), 一个路由(比如用Qemu虚拟的RouteOS), 它会创建两个VPCS进程, 用Dynamips虚拟化一个路由, 把他们连接起来.

实际执行的命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# qemu RouteOS
/usr/bin/qemu-system-x86_64 -name RouteOS-1 -m 128M -smp cpus=1 -enable-kvm -machine smm=off -boot order=c \
  -drive file=/home/halida/GNS3/projects/routeos_simple/project-files/qemu/f280f531-91cd-4290-a61b-98d3299a2bb7/hda_disk.qcow2,if=ide,index=0,media=disk \
  -serial telnet:127.0.0.1:5000,server,nowait \
  -monitor tcp:127.0.0.1:54263,server,nowait \
  -net none -device e1000,mac=00:8f:b6:2b:b7:00,netdev=gns3-0 \
  -netdev socket,id=gns3-0,udp=127.0.0.1:10002,localaddr=127.0.0.1:10001 \
  -device e1000,mac=00:8f:b6:2b:b7:01,netdev=gns3-1 \
  -netdev socket,id=gns3-1,udp=127.0.0.1:10003,localaddr=127.0.0.1:10000 \
  -device e1000,mac=00:8f:b6:2b:b7:02 \
  -device e1000,mac=00:8f:b6:2b:b7:03 \
  -nographic

# vpc
/usr/bin/vpcs -p 5001 -m 0 -i 1 -F -R -s 10002 -c 10001 -t 127.0.0.1 startup.vpc

参数里面会做几件事情: 创建虚拟的网口, 绑定在本地机器的特定端口上面, 然后各个进程会通过这些端口来进行通讯. 同时也会把管理端口用telnet暴露出来, 方便前端用Console命令连上去配置.

安装过程

因为GNS的工具链主要在Linux, 我倾向于用Linux来装这样的测试环境. 所以里面推荐的GNS VM我就没有去装了.

安装完毕之后, GNS是不自带路由器的镜像的, 它提供一些简单的虚拟设备, 比如VPCS, 它其实就是一个单独的进程, 模拟一个主机设备, 带有设置IP, Ping等简易网络工具. 你需要自己导入路由的设备.

如果你是要模拟Cisco的设备, 可以在这里下载, 我是用来测试RouteOS的环境的, 直接在官方网站下载ISO镜像, 本地用Qemu安装.

选择虚拟系统: 如果是Cisco的路由器, 没得说, 只能用Dynamips, Dynamips一定要设置Idle-PC, 减少CPU性能消耗. 如果是其他基于Linux的路由系统, 在Linux下面, 我觉得Qemu比VirtualBox和VMWare都好用, 它性能更好一些. 当然用Docker这种内核共用虚拟性能会更好, 不过我没有尝试.

GNS下安装RouteOS, 首先要去官方下载ISO镜像文件, 然后执行命令行:

1
2
3
4
# 创建镜像文件
/usr/local/bin/qemu-img create -f qcow2 routeros-6.15.img 200M
# 跑虚拟机, 安装系统
/usr/local/bin/qemu-system-i386 -m 512 -enable-kvm -boot d -cdrom mikrotik-6.15.iso routeros-6.15.img

安装好之后, 就可以用GNS导入这个镜像, 进行使用了. 官方下载的ISO, 可以免费使用一天, 用来测试问题不大.

模拟实验

我做了两个模拟实验, 用来学习GNS的使用.

第一个是简单的RouteOS连接两个主机, DHCP分配IP地址.

image

用Console连上RouteOS-1, 进行这样的配置:

1
2
3
4
5
6
7
8
9
10
# 创建一个bridge, 把端口都连接起来
/interface bridge add
/interface bridge port add interface=ether1 bridge=bridge1
/interface bridge port add interface=ether2 bridge=bridge1
# 创建 dhcp, 给大家分配IP地址
/ip address add address=192.168.10.1/24 network=192.168.10.0 interface=bridge1
/ip pool add name=dhcp-pool ranges=192.168.10.10-192.168.10.254
/ip dhcp add name=dhcp-main interface=bridge1 address-pool=dhcp-pool
/ip dhcp network add address=192.168.10.0/24 gateway=192.168.10.1 netmask=24
/ip dhcp enable 0

然后就可以进到两台机器的Console里面, 执行ip dhcp自动获取IP地址, 用ping去看是否可以连接到另外一台机器.

第二个是简单的多路由通讯方案:

image

三个路由分别管理一个网段, 然后每个网段都可以通过路由的设置, 联系到其他网段里面的机器.

这里只列出来RouteOS-1的配置, DHCP部分和上面重复, 就不写了:

1
2
3
4
5
6
# 设置连接到其他路由器端口的IP
/ip address add address=172.16.10.1/30 network=172.16.10.0 interface=ether1
/ip address add address=172.16.12.1/30 network=172.16.12.0 interface=ether2
# 增加路由, 对方网段从哪里走
/ip route add dst-address=192.168.20.0/24 gateway=172.16.10.2
/ip route add dst-address=192.168.30.0/24 gateway=172.16.12.2

在新笔记本上安装Kdeneon

| Comments

最近我2012年底买的rmbp电脑越来越不给力,于是打算换一台新的笔记本,操作系统选回Linux. 为什么要用Linux而不继续买苹果呢,因为看新的苹果笔记本没有什么大的改进,还有我慢慢不喜欢苹果的软件锁死策略了, Linux可选性更高也更适合开发工作.

新的笔记本我选择Precision 5520 4K屏幕版本.价格比较贵(2万多). 为什么选这个呢,因为是我的主打生产笔记本,期待能够长期使用就选商用版本, 屏幕好一些可以坚持比较久,也对自己眼睛好点.

具体笔记本长什么样

见图册.

笔记本到货之后检查外观,检查系统配置是否和自己买的一样,检查屏幕是否有坏点.

安装Linux

现在回到主题,笔记本拿回来还是要安装Linux的.我选择Kdeneon作为发行版. 因为我对debian系比较熟悉,同时也更喜欢KDE桌面.KDE官方网站推荐这个版本.

官方网站下载稳定版Kdeneon, 下载之后检查了一下checksum防止下载错误,然后用UNetbootin烧录到USB闪存上面准备安装.

第一个坑:无法进入Live系统.查了一下发现是开源的nouveau驱动不支持新版的Nvidia显卡驱动,需要在启动的时候关闭,设置方法: grub里面Linux那一行尾部加上 nomodeset,之后就可以进入Live系统了.

系统安装好之后也要改,修改文件/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT后面加上nouveau.modeset=0, 之后执行sudo update-grub.

系统安装好之后,可以自动识别一下显卡驱动,执行sudo ubuntu-drivers devices,然后根据提示,安装对应的驱动版本,比如:sudo apt install nvidia-375.

第二个坑:磁盘无法识别,系统安装过程中提示Ubi-partman failed with exit code 141,发现是因为硬盘选项SATA->RAID中,用到了Intel RST driver,现在开源系统还不能很好地处理,需要换成其他设置.

第三个坑:无法休眠,我已经习惯苹果笔记本的合起来休眠功能,但是系统装好之后,却发现只有Sleep,却没有Hibernate. 找了一下, 发现是需要关闭Secure boot,不然无法控制休眠.回到BIOS关闭之后,执行systemctl hibernate成功了.

但是在KDE下面还是没有办法使用Hiberrnate,我下载了KDE的电源控制UIPowerdevil,看到原理是ibus查询org.freedesktop.login1.Manager的CanHibernate,后端是logind.根据这篇文档,增加了logind允许使用Hibernate的配置就可以了.

第四个坑:中文输入法.系统安装好之后没有UI设置如何选输入法,以及什么中文输入法比较好,找来找去,还是用ibus-pinyin吧. 安装:sudo apt-get install ibus-qt4 ibus-gtk ibus-gtk3 ibus-pinyin,启动执行ibus-setup.

但是各个窗口都没有办法输入中文,怎么办?查了以下,设置了环境变量之后,窗口才会响应输入法,环境变量设置方法如下:

1
2
3
export XMODIFIERS="@im=ibus"
export GTK_IM_MODULE="ibus"
export QT_IM_MODULE="ibus"

其实不用自己手动选择,用im-config,它会修改~/.xinputrc,增加run_im ibus,在进入桌面环境的时候设置这些环境变量. 但是终端里面的环境变量还是要手动加到自己的shell初始化脚本里面.

第五个坑:4K屏幕分辨率,因为屏幕分辨率很高,窗口都会很小,在KDE下,可以通过设置Display->Scale解决. 不过还是有很多非KDE的程序,比如Steam,TeamViewer没有办法改,他们没有用到Qt的基础架构就没有办法scale了. 我现在暂时没有找到简单的解决方案,就放着吧.

第六个坑:PPTP客户端,设置好了之后,可以连接,但是连接之后本地的DNS死活解析不到,实在找不到原因,莫非是因为本地安装的dnsmasq的问题?现在只能用kcptun加ss解决问题.

好吧弄了那么久,终于可以正常使用系统了.

常用软件

这些是我常用的工具:

  • 基础支持: build-essential openssh-server default-jre curl
  • 常用软件: tmux zsh tree etherwake
  • 开发相关: emacs git-core ack-grep mysql-server redis-server

然后一些手动安装的工具:

  • Chrome: 官方下载
  • Steam: 记得安装源里面的,官方下载的安装有问题
  • proxychains-ng: github下载编译好的可执行文件
  • ss: 源里面就有
  • Dropbox: 官方下载
  • OverDrive: Google Drive linux客户端,需要购买

开发环境相关软件:

  • Virtualbox: 官方下载就好
  • oh-my-zsh: zsh配置环境
  • rvm: ruby环境
  • prax: linux下类似pow的工具,可以输入域名:app.dev,自动启动和访问本地的ruby项目.

研究如何给本地机器绑定域名

| Comments

我家里有一些机器,这些机器上跑了一堆虚拟机,虚拟机都直接桥接网卡, 这样每台机器都可以暴露出来给局域网访问。为了访问方便, 每个机器最好用名称访问,而不是用IP地址。 例如:两个虚拟机IP: 192.168.1.11,192.168.1.12,我希望可以用vps-sql,vps-dev的方式访问。

首先设置路由器的DHCP服务器,把这些机器的IP地址固定, 然后直接改自己电脑的/etc/hosts:

1
2
192.168.1.11 vps-sql
192.168.1.12 vps-dev

但是所有需要这个列表的机器都要改一遍,有什么更好的办法呢?

我的路由器是RouteOS,可以修改默认推送的DNS设置,以及增加DNS cache。 加了DNS cache之后,就可以直接访问了。

但是又有一个问题:我的工作用机器需要翻墙,翻墙了之后,就会用翻墙服务器的DNS,本地的DNS就取不到了。 万幸的是可以手动修改DNS采用本地的,不过用了本地的DNS,会被国内的GFW投毒, 获取一些国外网站域名信息的时候,DNS数据包会被劫持掉, 那么只有在本地搭建一个加密通讯的的DNS服务器。 话说回来为什么这么重要的基础服务居然还是明文的数据包传输?

我看了一下有dnscrypt,在本地的一台机器A上面装好, 把路由器的DNS设置为这个机器A就好了。 不过这样的解决方案不是很稳定,如果本地机器A挂掉,那么局域网就没有DNS服务,大家都不能上网了。

那么还有一个办法:就是注册一个短域名,把这些机器都绑定成子域名。 虽然这样会把本地网络的信息暴露给了全世界,但是想了一下也没有什么风险。

找了半天,买了一个便宜的llj.clicks域名,配置起来,总算完美地解决了这个问题。