终究奶奶还是走了。

在昨天,我下班后还是直接过去了姑妈家,在去到之后看到奶奶的第一眼就已经感觉不是很对了,呼吸太用力了,仿佛已经竭尽全力的呼吸让我感到估计活不过当晚,或者隔天。果然,在昨天晚上,在我和爷爷的注视下,奶奶咽下了最后一口气。她的呼吸和昨天相比变得非常的粗重,吃完饭后我回到床前和爷爷一起注视着,几个姑妈姑丈稍微看了一下奶奶还活着之后决定先离开,因为奶奶的脑萎缩开始严重之后就开始不喜欢别人在旁边聊天,他们怕吵着奶奶。我不是很喜欢聊天,所以打算和爷爷一起坐一下,如果没什么情况的话就准备等一下回家,这决定让我感到无比庆幸,因为我看到奶奶咽下的最后一口气,虽然不是什么美好的画面,因为那只是一下咳嗽,但是也是非常珍贵的回忆。可以想象到,在连续几天都没力气吃饭之后,奶奶已经连呼吸的力气都没有了。我看到有一次有好长时间没了呼吸,估计有将近个10秒,刚提起心,“咳”的一下咳嗽让我吓一跳又把心放了下来。

然而在一次咳嗽之后,奶奶的呼吸就终止了,好长的静默,我死死的盯着盖在奶奶胸前的被子,等待着起伏的再一次到来,然而终究还是没有再多一次的起伏了。我有点茫然,已经接近二十秒没动静了,这正常人也该喘一下气了,会又有一次咳嗽吗?我摸了摸奶奶的太阳穴,昨天还是能摸到脉搏的,然而这次,没动静了。这时候爷爷走了过来,把手掌放到了奶奶的鼻尖前,等了几秒,又把手掌放到了奶奶的额头上,然后,手指轻轻拂过奶奶已经闭起的眼帘,然后又轻轻的用纸巾擦了擦奶奶双眼眼角的一丝湿润。我瞬间意识到,这下真是最后一下了。于是瞬间,我的眼泪开始止不住了,我坐回椅子,眼泪无法阻止的涌出,仔细的看着眼前的一幕,有点想用手机拍下这一幕,但是又感觉这样坐似乎有点不妥,于是只能用力的将这一幕印在脑海里。奶奶躺在床上已经没有了生息,爷爷站在床前,弯着本来已经驼背的腰,让他看起来更加的矮了。他静静的站着,一手按在盖在奶奶身上的被子上。我并没有看到他的表情,但他并没有哭,没发出什么声音,就那么静静的站着,和陪伴了他几十年的老伴告别。

然后不知道谁进来了屋子,大概是看到了爷爷和我的样子,瞬间飞奔出去,把几个姑和叔和我的父亲都叫了过来,瞬间一帮人呼啦的过来了,一时间,“妈!”、“婆婆!”的叫声都爆发了出来,随之而来的就是各种的啜泣声,然而我这个渣渣,那句“啊嫲”都叫不出来,只能在旁边徒劳无功地强忍着无法阻挡的泪水。三姑妈还很用力的摇了一下奶奶,二姑妈一边哭着一边说“不敢看”,还有大姑妈在扶着柜子毫无形象的哭嚎“妈,我对不起你,我明明说过不会哭出来的”。自家老爹也是满眼通红的默默擦着眼泪,说起来,这大概是我第一次见他哭了罢。

接下来就是一番鸡飞狗跳,把几个亲属叫上,各自请假等一轮殡葬准备,没啥好说的了。要么就完全不遵守什么迷信传统,自己想怎搞就怎搞,要么就请个有相关知识的神婆来指挥,大家听指挥就是了。

几位长辈很快就止住了眼泪,除了后来把棺材送进活化车间的时候,就像平常的家庭聚会一样。我也只能强忍着,至少不要在其他人面前哭得这么丢脸。至少我把“我的奶奶”这个概念强行换成“一具尸体”这种情况下可以止住泪水,但是这种简陋的措施在火葬场我看到奶奶的脸的时候崩塌成了碎片。什么“只是一具尸体”啊,这是从小到大最疼我的奶奶啊,这上面带着我多少的回忆啊!然而我只能无力地哭着,把脑袋防空,压制着自己的情感。在观赏火化车间的时候我也想喊一句“奶奶”啊,但是无能的我开口就只有呜咽。

整个过程中爷爷并没有哭,只是一脸的沉重,并没有以往的笑容。他心里的难过绝对不会比我们少,但是他并没有掉眼泪。爷爷对奶奶估计是最照顾的人了,奶奶身体不好以来,爷爷一直都非常耐心的照顾,别人偶尔劝身体还是不错的爷爷出门走走,去一下旅游,到处走走,回故乡看看。这时候爷爷都会说“我要照顾啊妈/婆婆/老伴,哪里走得开?”对于奶奶的去世,爷爷是做足了心理准备了,姑妈也说到,爷爷前两天让人把奶奶从房间移到了厅里,大概也是知道最后的日子到了,毕竟有种说法是死人不能过两重门。

奶奶的逝世,让过去的回忆全部忘了味,那些愉快的记忆都没有了欢乐的味道,反而都变成了牵动泪腺的元素。我不知道有什么办法止住这种哀伤,大概只有暂时的忘却能让我好一点。或许在被时间冲淡以后,我才能直视这段回忆吧。

最近由于路费的原因开始开车上下班,这两天听到奶奶最近身体变得非常差,于是今天下班后过去了一趟看望了一下。今天看到的奶奶已经是面色苍白,听说已经完全吃不进去食物了,我当时心里就想,这人,没吃饭多久会饿死?然后接下来的事情我就再也不敢想下去了。

奶奶卧床不起已经有相当长时间了,之前也不是不能起来,只是大概觉得她坐着也是辛苦,于是长期让她睡在床上。或许我这个不负责照顾的做评论似乎有点在说风凉话,但是我还是觉得长期躺着,不去想什么东西,不去做什么东西,又没什么交流的话,人很快就会废掉。奶奶也很可能是差不多的原因,只是脑萎缩开始,这身体就如雪崩一样往下走下坡路了。

去探望奶奶,这是看着她身体越来越糟糕,也是不久前网购了张气垫床过去(虽然姑妈还是塞了买东西的钱给我),希望她那褥疮没那么痛,之前偶然间瞥到那个褥疮,黑色一个,直径怕是有接近10cm,我就感觉不寒而栗,那黑黑的褥疮仿佛一脸嘲讽的在指责我的漠不关心,然而我只懂得逃避。

今天看的奶奶,已经把假牙取出来了,两片嘴唇深深的陷进了口腔了,模样颇有一丝滑稽,但是这背后的无法进食也是让我非常的揪心。姑妈在聊天中也提到了之前一阵,奶奶突然清醒的一阵子,她问奶奶有什么东西向吃的,奶奶说,想吃猪肉,想吃鱼,于是又急急忙忙的买来些猪肉,剁碎了煮了些粥去喂奶奶,然后完全吃不进去,甚至还把吃进去的吐了出来。这让我感到悲哀,以前奶奶总是省吃俭用,好多好东西都不舍得吃,现在都吃不了了。现在爷爷的身体还算好,没啥病痛的,但是脚掌肿得很厉害,也常常和爷爷说有啥好吃的就吃多点,不用省。(一边打字一边掉眼泪的感觉真糟糕)

一圈人围在一起聊天的时候,瑞叔说着奶奶那样子,想必是还有什么心愿未了,我又想起之前的一次,奶奶偶尔清醒过来,悄悄地和我说着话,说她那身体估计撑不了多久了,希望我能赶紧给找个老婆,让她能喝个孙媳妇茶。而我……并没有对此放在心上,这算是不孝么?现在回想起来,那大概是我奶奶人生中和我的最后一次对话了。就算是偶尔下去看望,和她东扯一下西扯一下,问一下她是否知道时间和日期,希望让她进行一下简单的思考,似乎也并没有什么效果。还记得一次,回去看望,姑妈跟她说“钧仔翻黎睇你啦”,她立马睁大眼睛,到处寻找我的身影。姑妈让我和奶奶说点什么,我却因为口拙而哑口无言,现在回想起来,非常讨厌当时不会说话的自己。

估计奶奶也撑不了多久了,在一群子女的照顾下饿死似乎有点讽刺,但是因为无法进食而饿死,这似乎也是正常的寿终正寝?除了褥疮,似乎奶奶也没其他病痛,这不得不说是万幸。又想到,这要不要靠吊针来续命?对于本人来说一片混沌的续命有没有意义?就我自己而言,一片痛苦的未来和轻松的去死,我大概是会选择轻松的去死?不过这也不知道是不是奶奶的选择,或许她连选择的意识都没有了,脑萎缩已经摧毁了她的一切。

想多回想一下以前的奶奶,但是一动念头眼泪就止不住,连字都打不了,于是又开始畏缩起来。

因为骨干路由从OpenWRT换到了RouterOS,所以pxe服务器也得从新搭建。

过程不是很麻烦,但是RouterOS并没有nfs服务器,所以有些linux发行版的netboot需要nfs的,就需要什么额外的机器来当这个nfs服务器了,当然,kvm是个好东西。

可以参考之前的老文https://ferrets.space/2014/04/07/在家里做了个pxe服务器/,有些东西还是自己动手丰衣足食。

目前拿了个debian来做实验:

首先,去下载必要的文件,然后,找到

pxelinux.0
ldlinux.c32
vesamenu.c32
libcom32.c32
libutil.c32
pxelinux.cfg/default
linux
initrd.gz

接下来首先就是要编辑pxelinux的配置文件pxelinux.cfg/default,内容可以参考之前的文章,大概像这样子:

DEFAULT vesamenu.c32
PROMPT 0
MENU TITLE RouterOS PXE-Boot Server

label Ubuntu
        MENU LABEL Debian
        KERNEL debian/linux
        APPEND initrd=debian/initrd.gz
        TEXT HELP
                Starts the Debian Net installer
        ENDTEXT

至于各字段怎么自定义那就自行Google了,保存好配置文件之后呢,就将这么几个文件,丢到RouterOS的文件系统(真他么的不好用)里,比如说这样:

好了之后,就在ip/tftp菜单下面增加tftp文件的配置,比如说像这样:

请求文件名可以和实际文件名不一样,实际文件名是给RouterOS看的,请求文件名是给客户端看的,所以实际文件名可以自行决定。这里要主意的是ip地址填的是客户端的ip地址,而pxe服务器嘛,基本上并没有固定ip,所以ip地址最好还是填ip段。

配置就这么多,接下来只要在客户端执行pxe启动就行了。

参考:
https://a.iwshare.me/?p=48
https://plus.google.com/+GhostAssassin/posts/bMBbFYD6JZ3
https://www.liquidweb.com/kb/how-to-install-pip-on-centos-7/

 

最近听闻了一个模糊协议,叫做obfs,是开发Tor那群人搞出来的东西,用来模糊流量避免GFW的深度包检测,我尝试了一下可以做port forward,于是顺手再搭个梯子,感觉效果似乎比shadow socks好一点(心理作用?)。

搭建过程不算太麻烦,只需要一个叫做obfsproxy的软件就可以了,在ubuntu和debian似乎可以直接安装,不过pip安装的方法更加通用。

debian系的需求包

apt-get install gcc python-pip python-dev

redhat系的需求包

yum install python-pip python-devel gcc pycrypto

其中出现了我的CentOS软件源里并没有pip这种情况,可以实用python脚本来安装,方法如下:

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py

搞定之后可以用pip来安装obfsproxy

pip install obfsproxy

安装完毕后用法如下:

服务器端:

obfsproxy --data-dir ~/.obfs/ scramblesuit --dest 127.0.0.1:1194 --password ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 server 0.0.0.0:1234 &

客户端:

obfsproxy scramblesuit –dest serveraddress:1234 –password ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 client 127.0.0.1:56789 &

至此通道就搭起来了,例子中,客户端访问127.0.0.1:56789就相当于在服务器端访问127.0.0.1:1194。另外要注意的就是,obfsproxy似乎并不能保证数据加密的效果,最好搭配一个更加好的加密通道来使用。

不得不承认,不愧是服务器血统,这权限管理真的严格的,搭建好的owncloud报告没法发邮件,经过一番bing之后,找到了答案。

参考:http://stackoverflow.com/questions/25517281/swiftmailer-connection-could-not-be-established-with-host-smtp-gmail-com-conne

解决办法如下:

  1.  检查httpd_can_sendmail 是否设置为on
    getsebool httpd_can_sendmail
    • 如果返回的输出是 httpd_can_sendmail –> off , 运行
      setsebool -P httpd_can_sendmail 1
    • 如果你看到 httpd_can_sendmail –> on 那么跳到下一步
  2.  检查 httpd_can_network_connect 是否为on
    getsebool httpd_can_network_connect
    • 如果返回的输出是 httpd_can_network_connect –> off ,运行
      setsebool -P httpd_can_network_connect 1
    • 如果你看到 httpd_can_network_connect –> on 那么就跳到下一步
  3. 在服务器地址直接填ip而不是域名。

第三步感觉是另外的问题,而不是SELinux的权限阻止了邮件发送。

参考:https://blog.lysender.com/2015/07/centos-7-selinux-php-apache-cannot-writeaccess-file-no-matter-what/

一般的文件读写权限,所属用户和组这些先不讨论,毕竟这些相关的文档太多,也相对基础了点。这里记录的是CentOS种由SELinux引起的权限问题。

刚在家重新搭建了owncloud,这时候出现了一个非常诡异的权限问题,文件和文件夹的所有权都是apache(CentOS中默认的所属用户和用户组),但是访问owncloud的安装程序的时候却提示没有写权限。我试过用sudo切换到apache用户来执行touch创建文件,没问题,甚至写一个简易的php脚本来测试文件的读写,都没有遇到权限的问题,但是在使用浏览器访问的时候,php脚本就遇到了权限的问题。

经过一番Google,确定时SELinux的问题。

ls -Z可以看到一些额外的属性,像这样

drwxr-xr-x. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 application
-rw-r--r--. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 index.php
修复的办法是
# SELinux serve files off Apache, resursive
sudo chcon -t httpd_sys_content_t /data/www/html/sites/mysite -R
# Allow write only to specific dirs
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/logs -R
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/uploads -R

httpd_sys_content_t – 允许apache读取文档
httpd_sys_rw_content_t – 允许apache读写文档
更加详细的标记说明,可以参考https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/sect-Managing_Confined_Services-The_Apache_HTTP_Server-Types.html

最近在折腾RouterOS,发现了一种相当有趣的用法,可以基于域名来选择路由。
首先,在ip/firewall/address lists中添加地址,地址可以是ip地址或者是域名,如果是域名,则RouterOS会自动进行一次域名解析,例如这样:
ip.firewall.addresslist
可以看到域名被自动解析成了ip地址,而解析出来的记录前面有个D标记,这意味着这是动态的,ip地址记录会随着dns解析记录而变更。

例子中,我就创建了一个叫做twitter.com的address list,这就可以在mangle中做点手脚了,就像这样:

我在prerouting链中添加了一个mangle,对目标地址在twitter.com列表中的路由都进行一个标记,打上一个叫做gfw的路由标记,在打上标记之后呢,就可以在路由表中,添加一个新的路由:

例子中,我有一个名字叫做gfw的接口,作用就不多说,因为是一个ppp的链接,所以gateway可以不填地址,直接填一个接口的名字,RouterOS可以处理这种情况。上图中,就是说所有打着gfw标记的路由,默认路由是走gfw这个接口。至此,全部基本设置已经完成。

这种addresslist配合mangle的用法除了策略路由还有很多其他的用法,比如说想要屏蔽某些网站,不让用户访问,这就可以在route中,选择这个unreachable的类型,这可比用web-proxy什么的实用多了,屏蔽掉的就不仅仅是80端口了,而是整个ip,无论是http还是https或者其他协议之类的,都会屏蔽掉。当然,在一些比较精细的控制方面,比如说允许访问http://www.helloworld.com但是不允许访问http://www.helloworld.com/something这种就无能为力了,只能向L7方面寻求帮助。


这种方法还有类似的,比如说传统一点,在address lists中,不用域名,而是用地址块,比如说这样:

把一整块地址加进去address lists里面,也是可以的,这样更加容易绕开方法里面的一种缺陷,因为这种方法只能对应一个域名,无法处理子域名或者使用通配符,如果是大量的域名,这会让工作变得相当的麻烦,需要脚本来进行处理。

这种方法有另外一种缺陷,就是面对着同一个域名会有大量ip地址或者是使用CDN网络的网站的时候,容易出问题,RouterOS本身缓存的dns解析地址一般来说只有2条,如果客户端使用了其他dns服务器而不是RouterOS本身作为DNS服务器的话有可能会存在这样一种情况:

RouterOS解析域名A,得到ip地址1ip地址2,并对ip地址1ip地址2进行了策略路由,客户端从dns服务器解析域名A,得到ip地址3ip地址4,这种情况下,客户端访问域名A就没法得到正确的策略路由。

对应的方法很简单,只要指定RouterOS作为客户端的dns服务器就可以了。如果是有客户端想使用其他dns服务器绕过策略路由,可以使用dnat进行劫持,如果是使用dnscrypt之类的软件的话,似乎没什么好对策,毕竟就算是gfw也只能阻挡而不能污染或者劫持dnscrypt。

前阵子打算把手里的垃圾平板刷个RemixOS来玩玩,稍微研究了一下fastboot刷机的方法,在这里做一下记录。
首先想办法进入fastboot模式,详情咨询各Android设备的提供商,装好驱动,连接Android设备与电脑。

fastboot oem write_osip_header
fastboot flash /tmp/partition.tbl partition.tbl
fastboot oem partition /installer/partition.tbl
fastboot erase factory
fastboot erase cache
fastboot erase system
fastboot erase config
fastboot erase logs
fastboot erase misc
fastboot erase data
fastboot oem stop_partitioning
fastboot flash boot boot.img
fastboot flash recovery recovery.img
fastboot flash fastboot droidboot.img
fastboot oem start_partitioning
fastboot flash system system.img
fastboot continue

只有第一句不知道是干啥的,其他的命令都很明显了,其实这部分是我从一个脚本和其他的刷机log里面总结出来的,仔细研究了一下,把命令补全和修正了。

最近耍了一个RouterOS的x86版,自带kvm虚拟机,看起来碉堡了,但是使用了之后只能吐槽说各种bug,就连官方的建立img都会报个“failed to copy files to image(s)”,结果我还是用ultraiso建立了一个空的img文件才能用。openwrt的镜像倒是方便,把kernel也放出来了,启动参数也提供了,在routerOS中一填就OK,没什么大问题。至于安装其他的linux。。。。目前我只成功安装了CentOS7。

在目前的RouterOS版本(6.36.2)中,kvm虚拟机的vnc是用不了的,这让我安装windows的企图破灭了,没GUI玩个蛋蛋。剩下一种可行的链接方式就只有console,这让安装linux变得可能。

但是下载下来的iso镜像不能直接使用,因为很多发行版发布的镜像的grub是默认没有console输出的,这让我们需要重新打包iso镜像。

首先,找到grub的配置文件,视情况而定,有可能是grub.cfg、grub.conf、isolinux.cfg几种,ubuntu的配置文件更加复杂,详细去官方的wiki慢慢研究。

在grub的配置文件中全局的位置(大概是在那一堆label前)插入一句

serial 0 115200

就能够让grub输出到console,至于这时候有没有视频输出,我没试过。这时候routerOS就可以用过console看到grub的输出了。

然后就是kernel的参数,这让kernel启动之后输出到console,这段写在kernel的后面,像这样。

label linux
  menu label ^Install or upgrade an existing system
  menu default
  kernel vmlinuz console=ttyS0,115200
  append initrd=initrd.img

之后就像正常安装linux一样安装就行了,不过只能够用文本的安装向导,详细查询各大发行版。

之前自己做了ec的key做csr的时候,startcom跟我说密钥长度太短,不给我用,现在看来是支持了。

ec的证书制作方法参见这个,现在startcom支持一个证书5个域名,基本上一个证书可以搞定。不过部署之后在ssllab检测的时候发现很多平台不支持,不知道为何,还真要认真的修整一下才行。

handshake-simulationChrome居然不支持,真是太让我吃惊了,IE系列基本上全跪,Android4.4.2和Android5都支持反而到了Android6又有问题,真是奇怪。