使用PXE从NFS服务器启动Debian Linux

一、开篇

首先,我使用的是debian的linux,版本是stretch,其他发行版的话只能作为参考,无法照搬。

然后上参考:https://blog.csdn.net/politefish/article/details/4444417

在网上搜无盘系统,全部都是指导怎么启动安装器的,这个我之前已经做过了,没什么问题,但是如何做一个能直接运行的linux,倒还是第一次。上边这边文章里面洋洋撒撒一大串,不过还是指引了我找到了比较核心的内容。

二、组件部署

首先PXE启动系统我这边就不说了,参考有很多,比如说这个这个,还有这个。总所周之,PXE启动linux需要3个组件,一个DHCP服务器,一个tftp服务器,还有一个NFS服务器。因为我家的路由器系统都比较的有好,DHCP服务器方面都支持设置PXE的引导,所以不需要额外的架设一个DHCP服务器。

tftp服务器和NFS服务器我是使用我家的一台QNAP的NAS来做的,性能和整合度不错,由于是同一份文件的不同共享,所以就不需要每次更新了kernel之后还需要单独将kernel拷贝到tftp服务器去了。

 

首先是tftp服务器,先把tftp服务器开起来,指向目标,限制好来源

然后参考这个,把所需的文件放到目标

看起来像是这样:

PXE
├── debian
│ └── #这里放Debian的系统
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── pxelinux.0
├── pxelinux.cfg
│ └── default
└── vesamenu.c32

再然后就是NFS系统,在系统中调整NFS分享,让/PXE能够以NFS的形式挂载,这就可以了,如何建立NFS服务器并且建立共享,这里不多说。

三、系统安装

然后先安装好基本系统,再回来修改default的配置文件

参考了网上搜出来的文章,我发现他用的方法就是使用debootstrap来安装系统。嗯?看着眼熟,不就是我当年做过的事情吗?哎呀,这就容易了嘛。

这里我选择的方法是用containerstation跑个LXC容器,将文件夹挂载到容器中。如果手边只有windows的机器,可以选择上虚拟机,然后挂载NFS共享。

假设将目标挂载到/mnt,就可以使用这样的方式来安装基本的debian系统

 

debootstrap –arch=amd64 stretch /mnt/ http://ftp.cn.debian.org/debian/

然后稍作等待,你就获得了一个debian系统了。当然,推荐使用同一个架构的CPU,因为这样接下来的后续安装就会方便很多。

chroot到新系统之后就可以向刚安装的系统一样去做后期的调整了。注意至少有一下这么几个

1.修改root的密码

2.新增用户

以下几个我是当时做了的配置但看起来并不是必须的,酌情参考

3.修改fstab和mtab,详细看参考链接,但是我登录系统之后看mount表完全不是那么一回事

4.配置网络,参考链接里面还是用的eth0,但是我登录系统后看到的接口都不是eth0而是en0了,又是一个过期的文档

5.调整时区,这个最好做一下,还有用timedatectl set-local-rtc 1 设置将RTC时钟设为本地时间而不是UTC时间,避免和windows来回切的时候导致windows时间混乱

然后把你想安装的东西都安装上。duang,系统就安装好了。

四、调整PXE启动配置

最后回来调整一下PXE的启动文件,这里是最精华的地方:

DEFAULT vesamenu.c32
PROMPT 0
MENU TITLE Home PXE-Boot Server
label Diskless Debian
MENU LABEL Diskless Debian
KERNEL debian/vmlinuz
append vga=normal initrd=debian/initrd.img ramdisk_size=14332 root=/dev/nfs nfsroot=NFS服务器地址:/PXE/debian rw --
TEXT HELP
Starts the Diskless Debian
ENDTEXT

需要注意的是,这里是系统的根目录下存在两个指向boot的链接,所以kernel和initrd才是这个位置,至于其他的参数,我暂时还没了解到如何使用,先保留着,看以后是否再需要优化。

配置完成后,就可以启动主机,然后选择从LAN启动了,启动之后,可以看到根目录是从nfs服务器挂载的。

 

在运行ArchlinuxARM的PogoPlug上打开CPU的AES硬件加速

参考:

https://archlinuxarm.org/forum/viewtopic.php?f=30&t=2452

https://archlinuxarm.org/forum/viewtopic.php?f=7&t=2451#p13657

 

最近把在吃灰的PogoPlug又重新捞出来丢到出租屋那边,刚才在网上瞎逛的时候突然发现Archlinux的论坛上有个家伙po了个帖子,说在研究能不能打开他手里的pogoplug的AES硬件加速,然后发现可行并且有点效果,于是我也尝试着试了一下,发现确实ok,于是先记一下。

由于好心人(pklaus)的付出,现在不需要重复 firefoxPL先生的老路了,现在只需要安装特定的软件包,并且创建文件让系统能够在启动的时候自动加载kernel mod就可以用了。

根据原po的说明以及大胆的猜测,初步推测不仅仅是pogoplug,其他使用kiriwoodCPU的设备都可以用相同的方法来开启硬件加速。

先安装所需的kernel header:

pacman -S linux-kirkwood-headers

然后安装cryptodev-dkms以及其所需的软件包:

pacman -S cryptodev-dkms

然后就会根据安装脚本自动编译kernel mod,由于是需要编译的,可能会出现其他的软件包需求。

安装完毕之后,就把openssl给替换掉:

pacman -S openssl-cryptodev

由于openssl-cryptodev会自动引用一个openssl,其版本不一定会是最新,所以要是提示有openssl可以更新的时候请不要在意,保持openssl-cryptodev是最新的即可。当然openssl和openssl-cryptodev会有冲突,安装的时候会有提醒的。

顺便贴一下我测试的开了硬件加速和没开硬件加速的区别:

这个是没开

[root@alarm ~]# openssl speed -evp aes-128-cbc
Doing aes-128-cbc for 3s on 16 size blocks: 1360545 aes-128-cbc's in 2.78s
Doing aes-128-cbc for 3s on 64 size blocks: 489186 aes-128-cbc's in 2.99s
Doing aes-128-cbc for 3s on 256 size blocks: 133567 aes-128-cbc's in 2.99s
Doing aes-128-cbc for 3s on 1024 size blocks: 32897 aes-128-cbc's in 2.88s
Doing aes-128-cbc for 3s on 8192 size blocks: 4273 aes-128-cbc's in 2.98s
Doing aes-128-cbc for 3s on 16384 size blocks: 2143 aes-128-cbc's in 2.99s
OpenSSL 1.1.0h 27 Mar 2018
built on: reproducible build, date unspecified
options:bn(64,32) rc4(char) des(long) aes(partial) idea(int) blowfish(ptr)
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DHAVE_CRYPTODEV -DHASH_MAX_LEN=64 -DOPENSSLDIR="\"/etc/ssl\"" -DENGINESDIR="\"/usr/lib/engines-1.1\"" -Wa,--noexecstack -D_FORTIFY_SOURCE=2 -march=armv5te -O2 -pipe -fstack-protector-strong -fno-plt -Wl,-O1,--sort-common,--as-needed,-z,relro
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-128-cbc 7830.47k 10470.87k 11435.84k 11696.71k 11746.45k 11742.78k

这个是开了

[root@alarm ~]# openssl speed -evp aes-128-cbc
Doing aes-128-cbc for 3s on 16 size blocks: 36940 aes-128-cbc's in 0.11s
Doing aes-128-cbc for 3s on 64 size blocks: 37466 aes-128-cbc's in 0.07s
Doing aes-128-cbc for 3s on 256 size blocks: 33812 aes-128-cbc's in 0.07s
Doing aes-128-cbc for 3s on 1024 size blocks: 20341 aes-128-cbc's in 0.08s
Doing aes-128-cbc for 3s on 8192 size blocks: 5133 aes-128-cbc's in 0.01s
Doing aes-128-cbc for 3s on 16384 size blocks: 2984 aes-128-cbc's in 0.02s
OpenSSL 1.1.0h 27 Mar 2018
built on: reproducible build, date unspecified
options:bn(64,32) rc4(char) des(long) aes(partial) idea(int) blowfish(ptr)
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DHAVE_CRYPTODEV -DHASH_MAX_LEN=64 -DOPENSSLDIR="\"/etc/ssl\"" -DENGINESDIR="\"/usr/lib/engines-1.1\"" -Wa,--noexecstack -D_FORTIFY_SOURCE=2 -march=armv5te -O2 -pipe -fstack-protector-strong -fno-plt -Wl,-O1,--sort-common,--as-needed,-z,relro
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-128-cbc 5373.09k 34254.63k 123655.31k 260364.80k 4204953.60k 2444492.80k

这效率差距不是一星半点。不过根据原po的另外一个测试,在使用openssh传输文件的时候,速度和带宽的差距并不明显,只是在打开了硬件加速的时候,CPU占用会下降。

增大mysql/mariadb的最大连接数

最近在部署一个大型的zabbix监控,遭遇了mysql连接数不足的情况,在增加mysql的最大连接数的过程中,发现还是有点繁琐的,于是在这里记录下来。

参考:https://pjstrnad.com/mariadb-raise-number-of-connections/

首先,去编辑/etc/my.cnf,或者相应的mysql服务器配置文件。

在[mysqld]一节下方增加以下内容:

open_files_limit=12000
max_connections=10000

对应的两个参数可以根据实际需要修改。此时重启mysql服务器,发现设置并未生效,或者说生效了一半,只增加到了214,原因是systemd本身存在限制导致的。
接下来修改/etc/security/limits.conf,如果没有,就新建一个,插入以下内容。

mysql soft nofile 4096
mysql hard nofile 10240

然后创建systemd启动文件的配置

mkdir -p /etc/systemd/system/mariadb.service.d
vi /etc/systemd/system/mariadb.service.d/limits.conf

然后插入以下内容

[Service]
LimitNOFILE=infinity

完成后就可以重启MySQL服务器了

systemctl daemon-reload
systemctl restart mariadb

又发现一个神器—个人CalDAV/CardDAV服务器

主页在这里:http://radicale.org/

显着无聊,在LEDE的软件源里面到处找有什么有趣的服务,结果发现了一个叫做radicale的个人CalDAV/CardDAV服务器,直接装了跑起来之后总有点问题,于是稍微研究了一下,大概是由缺失了htpasswd的原因导致的,抓log也没报任何错误,但就是没法正常工作。最后还是去官网直接看部署过程才终于搞起来。

软件使用python编写,最新的版本使用python3,目前就我所知,软件包的需求最少也有python3、pip、htpasswd,及其所有所需软件包。功能上非常简陋,但核心的功能一个不漏,源码包不到100K,还自带一个简陋的web控制页面,可以用来新增文件夹。

安装过程就和官网所说,非常简单,最少只需要2条命令就能跑起来,不过想要用得好一点就还是需要进行一些配置。

先安装radicale

python3 -m pip install --upgrade radicale

然后pip就会搞定全部的需求,官方同时推荐对密码使用bcrypt进行加密,如果使用bcrypt加密,同时使用pip安装bcrypt。同时,根据不同的发行版,把htpasswd装上,LEDE由于没有将htpasswd从apache中拆出来,所以我就把apache装上就可以用了。

好了,服务器已经安装完,进入配置环节,radicale会自动尝试从“/etc/radicale/config~/.config/radicale/config或者是尝试从系统变量中读取RADICALE_CONFIG来找到配置文件,所以直接放在/etc/radicale/config就好,当然,可以直接加参数来运行,不过我觉得没有多少人会每次都加上一堆参数来运行的吧(笑)。

创建好配置文件,就向里面填入以下内容:

[auth]
type = htpasswd
htpasswd_filename = /path/to/users
htpasswd_encryption = plain
delay = 1

[server]
hosts = 0.0.0.0:5232
max_connections = 20
max_content_length = 10000000
timeout = 10
daemon = True
pid = /var/run/radicale.pid
ssl = True
certificate = /path/to/cert
key = /path/to/key
realm = Radicale - Password Required

[storage]
filesystem_folder = /path/to/storage

[rights]
type = authenticated

根据个人需求,可以酌情修改,比如说想要规模大一点,可以对权限进行更加详细的设定,比如说哪些人能读哪些人能写,参考这里
同时可以根据需要,抓取更加详尽的log,可以参考这里
在这个例子里面,我就参考LEDE默认的那个,直接用plain存储用户名和密码,同时使用SSL对通信进行加密,证书的做法有太多,这里就不详述。
users文件可以使用htpasswd来创建,大概的格式就是用户名:密码,如果用明文的话可以直接编辑users文件来修改密码。

创建好用户名和密码之后,可以尝试使用浏览器来访问https://your.domain:5232/,会自动跳转到一个非常简陋的web控制页面能够创建、编辑、删除包括地址簿、日历、todo清单等文件夹,根据我的测试来说暂时是没法在客户端创建这些文件夹的,所以现在web控制页面建好,然后就可以到客户端添加详细的条目了。

在使用动态ip的情况下使用tunnelbroker

最近我家不知为啥,pppoe拨号基本上每天晚上都会断一次,而重连之后由于ip地址变更,6to4的tunnel就中断了,一次两次就算了,每天都一次的话就不能靠手动,等靠自动化来维护。

参考:

https://wiki.mikrotik.com/wiki/Manual:Scripting-examples

https://gist.github.com/pklaus/960672

最开始是打算看看RouterOS能不能在接口启动之后触发运行一次脚本,但是ppp的profile里面的那个up down的scripts触发并没有效果(或许是我用法不对?)于是只能换一种思路,定时检查ip有没有变更,如果变更了,就触发一次配置更新。

两个脚本大概是这样:

脚本check_ip_change:检查ip有没有出现变更:

:global currentIP;
:local newIP [/ip address get [find interface="wan"] address];
:if ($newIP != $currentIP) do={
 /system script run update_sit;
 :set currentIP $newIP;
}

脚本update_sit:执行更新interface属性以及向tunnelbroker通知客户端节点地址变更:

local ipaddr
local users "someuser"
local key "somekey"
local tunnelid "sometunnelid"
:set ipaddr [/ip address get [/ip address find interface=wan] address]
:set ipaddr [:pick $ipaddr 0 ([len $ipaddr] -3)]
/interface 6to4 set sit1 local-address=$ipaddr
/tool fetch url="https://$users:[email protected]/nic/update?hostname=$tunnelid&myip=$ipaddr" mode=https keep-result=no

然后定制每分钟执行一次check_ip_change,然后在下次ip地址变更之后,就可以在1分钟内完成自动修复了。

在RouterOS上使用Tunnelbroker的ipv6服务

参考:https://my.oschina.net/CandyMi/blog/500882

首先,你需要一个公网的ipv4地址,至少是能ping通的,那种能ping得到但是在防火墙后面的情况,我也没试过,这里就不多说。

以下是步骤:

1:前往https://www.tunnelbroker.net/注册一个账号,操作过程不详述;

2:登陆成功后在左侧选择新增一个tunnel

在ipv4的节点上填写你的ipv4地址,截图我是直接扒原博文的,看来他是已经搭好了tunnel再去访问的

根据你的链接速度来选择对应的服务器,选好后create tunnel就可以完成创建了。

3:完成tunnel的创建,接下来就是配置,在example configurations页可以选择大部分系统的配置命令,选择mikrotik的,可以直接给出配置的命令,方便的很。

到此,RouterOS已经能得到一个/64的地址块,可以用这个地址块来分ipv6给内网的设备了。

4:现在你手里已经有了一个/64的地址块,需要注意的是分配给你的地址块和tunnel的客户端地址不属于同一个/64地址块,tunnel的信息页面上有加粗标识,不要搞混了,Routed IPv6 Prefixes才是给子网用的。

在/ipv6/pool新增一个地址池,名字随便起一个,比如说sit,然后把你得到的这个/64地址块拷进去,保存。

5:然后就可以新增一个ipv6的dhcp服务器,pool选择sit,选好应用的接口,至此,RouterOS就可以承担dhcp服务器的作用了,给客户端分配公网的ipv6地址。

6:最后,在/ipv6/route中添加ipv6的默认路由,然后RouterOS以及下面的整个子网都可以访问ipv6网络了。

家里又少一宝

终究奶奶还是走了。

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

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

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

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

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

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

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

今天去看了一下奶奶

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

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

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

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

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

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

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

RouterOS上的pxe服务器

因为骨干路由从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启动就行了。