作者: mk

  • 你的计算机是如何通过IPv6上网的

    在成熟的IPv4网络中,对于家庭用户,一般都是DHCP获取IP地址、网关地址和DNS地址,这样你的计算就能够上网,但是在IPv6网络中,这些又有些些许不同。

    第一是IPv6地址,在IPv6网络中,虽然有DHCPv6,但一般不建议这么做,IPv6通过ICMPv6的SLAAC协议获取IP地址前缀,然后主机根据网卡MAC地址计算出IPv6地址,由于MAC地址数量很庞大,所计算出来的IPv6地址在局域网中基本是唯一的。

    第二是DNS,IPv6获取纯DNS服务器有两种途径,一种是通过SLAAC协议的DNS options选项获取,另外一种是DHCPv6下发纯IPv6 DNS地址。如果两者没有,那么就需要IPv4的DNS服务器返回AAAA记录

    第三是网关,下发SLAAC地址的路由器就是你上网的网关

  • OpenZFS的持久化L2ARC配置

    在OpenZFS 2.0版本中已经支持了持久化L2ARC(开机启动缓存再也不消失了),配置方法为:
    Linux:编辑/etc/modprobe.d/zfs.conf,加入如下行:
    options zfs l2arc_headroom=0

    FreeBSD(需要安装OpenZFS2.0):编辑/etc/sysctl.conf,加入如下行:
    vfs.zfs.l2arc_headroom=0

  • ubuntu/debian diskless(iSCSI无盘系统制作)

    说明:此博文以Ubuntu20.04 desktop为基础制作无盘,非liveCD方式以及非DHCP分配IP地址看文章末尾的我参考的英文原版链接

    1.首先进入Ubuntu live系统,选择试用,并且打开终端,然后安装open-iscsi

    sudo apt install open-iscsi

    2.执行以下命令进入root用户

    sudo -s

    3.修改iSCSI的initiator name并且重启iscsid服务(这一步指定本地initiator name,有些iSCSI需要验证initiator name,比如windows server的iSCSI Target)

    echo "InitiatorName=ubuntu" >/etc/iscsi/initiatorname.iscsi
    
    /etc/init.d/iscsid restart

    4.发现iSCSI Target硬盘

    iscsiadm -m discovery -t sendtargets -p 192.168.1.1

    5.映射到本地磁盘

    iscsiadm -m node -T 'iqn.ubuntu' -p 192.168.1.1 -l

    6.执行ubuntu安装程序,选择相应的硬盘安装
    7.安装之后我们需要修改安装的目标硬盘的一些配置以便能够从iSCSI中引导(这里假设iSCSI映射到本地的硬盘为/dev/sda,系统分区为/dev/sda1)
    8.挂载/dev/sda1

    mount /dev/sda1 /mnt

    9.映射本地设备文件到chroot环境

    mount -t proc none /mnt/proc
    mount -t sysfs none /mnt/sys
    mount --bind /dev /mnt/dev
    

    10.chroot到分区

    chroot /mnt

    11.安装open-iscsi

    sudo apt install open-iscsi

    12.修改chroot iSCSI的initiator name

    echo "InitiatorName=your_initiator_name" > /etc/iscsi/initiatorname.iscsi

    13.修改/etc/default/grub文件,像如下这样

    GRUB_CMDLINE_LINUX="ISCSI_INITIATOR=ubuntu ISCSI_TARGET_NAME=iqn.ubuntu ISCSI_TARGET_IP=192.168.1.1 ip=dhcp"
    

    14.更新引导以及initramfs

    update-grub
    update-initramfs -u
    

    15.使用iPXE的iSCSI引导功能,参考代码如下(注意这里的iPXE具体用法不详细介绍,并且这里的代码也只是部分,要想使用iPXE,请阅读iPXE的官网手册)

    #!ipxe
    
    set initiator-iqn ubuntu
    sanboot --no-describe iscsi:192.168.1.1::::iqn.ubuntu
    

    16.重启系统使用iPXE引导进入即可
    如果是非桌面liveCD方式,这里是我参考的文章地址

    https://backreference.org/2013/12/23/diskless-iscsi-boot-with-pxe-howto/

  • Rust中的macro_rules!宏用法

        rust lang的宏可能有些人学习比较困难,我自己也是花了很多时间才看懂,这里把认为最难理解的公布出来,希望让更多的人能够减少学习难度,更好的学习rust

        首先在说明rust lang宏的用法的时候,记住一个要点:rust lang的宏思想基于匹配(match),实际上这门语言的基本思想都是基于匹配.

    rust lang的宏规则写法是:

    macro_rules! macro_name {
        () =>{{
            ...
        }}
    }

    上面的基本规则怎么理解呢,我们知道rust调用宏的语法是 macro_name!() ,那么这里”()”代表上面宏规则的”()”,”{}”代表宏块.
    先看一个简单的例子:

    macro_rules! MyMacro{
        ($x:expr)=>{{    
            $x   
        }}
    }
    

    上面怎么理解呢:”$”读作匹配 , “$x:expr”可读作匹配x,并且x是一个表达式,”$x”后的”:”表示”$x”的属性,rust的宏匹配有很多属性,这里可以看官方手册,”{$x}”表示返回匹配的x的值(注意这里的$x没有分号),
    然后我们可以这样使用:

    let z=MyMacro!(10000); //z的值将会是10000

    看这个官方的例子:

    let x: Vec<u32> = vec![1, 2, 3];

    宏展开之后应该是这样子的:

    let x: Vec = {
        let mut temp_vec = Vec::new();
        temp_vec.push(1);
        temp_vec.push(2);
        temp_vec.push(3);
        temp_vec
    };
    

    那么实现的代码如下:

    macro_rules! vec {
        ( $( $x:expr ),* ) => {
            {
                let mut temp_vec = Vec::new();
                $(
                    temp_vec.push($x);
                )*
                temp_vec
            }
        };
    }
    

    上面的代码怎么理解呢:我们知道正则表达式的”*”表示匹配0个或者多个,”+”表示匹配一个或者多个,”?”表示匹配0个或者一个,上面的
    “*”就代表匹配0个或者多个的”$x:expr”,$(temp_vec.push($x))*表示匹配0个或者多个push方法,然后这个宏返回Vec对象。

    我们再来看另外一个不同的例子:

    macro_rules! MyMacro{
        (x=>$v:expr) => ($v)
    }
    

    这个例子可能有些人会疑惑,右边不是”{ }”吗,为何变成”( )”了,这里说明一下,rust lang宏块可以是”[ ]”,”{ }”和”()”,具体看官方手册,
    我这里不详细说明,这个文章重点在于列出难理解的部分。其实右边的”( )”换成
    “{ }”也可以.
    上面的宏使用例子如下

     let z=MyMacro!(x=>1000);
    /*注意这里不能写成 y=>1000,因为之前讲过,rust的宏思想是基于匹配*/
    /* 上面的宏如果是这样 */
    macro_rules! MyMacro2{
        (1,x=>$v:expr) => ($v)
    }
    // 调用时如下
    let zz=MyMacro2!(1,x=>1000);
    

    读到这里,你或许知道rust macro的用法了吧😊,更多详细说明请观看官方的教程,
    链接如下:
    https://doc.rust-lang.org/1.7.0/book/macros.html

  • 如何构建自己的FreeBSD发行版

    FreeBSD的源代码目录非常简单明了,各个源码目录基本对应系统组件各个部分,这里不做介绍,如果需要去除一些定制组件或者增加组件,只需要修改每个父级目录的Makefile即可。
    在定制完成自己的FreeBSD发行版之后,执行以下命令

    cd /usr/src
    make buildworld buildkernel -j4 KERNCONF=CUSTOM
    make distributeworld distributekernel -j4 KERNCONF=CUSTOM DISTDIR=/your_directory
    

    这里的KERNCONF为自定义的内核配置文件名称,编译完成后即可生成目标的内核文件以及基本文件系统,
    如果要定制其他软件可以chroot到生成的根文件系统。
    下面讲述如何制作一个可引导镜像:
    生成一个镜像文件:

    dd if=/dev/zero of=my_freebsd.img bs=4M size=2048
    

    创建一个md文件,mdconfig命令会返回一个设备名,比如md0

    mdconfig my_freebsd.img
    

    创建的md文件相当于一个磁盘,然后就可以创建引导分区等操作了,请看官方文档

    https://wiki.freebsd.org/UEFI
    
  • FreeBSD12 AMD显卡配置

    最近购置了一台家用服务器 HPE MicroServer Gen10,给服务器装上了FreeBSD,但是安装图形界面特别麻烦,花了我差不多一天多时间,这里给出一些操作步骤避免很多人遇坑。

    安装图形界面(以fvwm-cystal为例子):

    首先安装xorg,pkg命令一下就行,然后在 /etc/rc.conf 加上 dbus_enable=”YES”,图形界面需要dbus通讯。

    安装fvwm-crystal命令就不说了,pkg一下就行,然后安装。

    最后安装xdm登录管理器,至此图形界面已经基本安装完毕。

    此刻你用root用户敲startx发现是无法启动的,因此需要在/usr/local/etc/X11/xorg.conf.d/增加一个文件,比如 amd.conf文件,文件这么写,

    这里有个FreeBSD官方的参考链接:

    https://www.freebsd.org/doc/zh_TW/books/handbook/x-config.html

    Section "Device"
    	Identifier "Card0"
    	Driver     "radeon"
    EndSection

    然后 pkg install drm-kmod,安装drm模块,编辑/etc/rc.conf文件,添加如下行

    kld_list="/boot/modules/amdgpu.ko"

    如果是HD7000或者更老旧的GPU,添加如下行

    kld_list="/boot/modules/radeonkms.ko"
    

    我的是AMD R7 显卡,那么是amdgpu.ko,

    这里特别强调的是如果机器是UEFI启动并且是AMD显卡,EFI framebuffer和AMD显卡驱动是有冲突的,你需要在 /boot/loader.conf 增加下面一行,如果文件没有那么创建一个

    hw.syscons.disable=1

    这里的配置方式可参考

    https://wiki.freebsd.org/Graphics

    重启显卡就能够正常使用显卡驱动(重启卡在FreeBSD logo引导界面大约1分钟才能正常进入系统)

  • 信仰以及人生思考

    自从我几年前归入基督耶稣以来,我一直在思考人生,这里谈论一些我个人的看法,希望能够对自己也对别人能够有所帮助。
       一.什么是信仰,从何处而来      

          信仰是从造天地万物的神那里来,遵守造物主的规矩,而不是遵循人肉体的欲望。信仰也包含了对神的崇拜。

          可能很多人认为这是迷信,这里我讲讲自己的经历,因为曾经也很多人一样,认为这是迷信。

          曾经的我,觉得什么事情都讲科学,现在想想自己是多么的愚笨。什么是科学?,科学是人对已知事物的了解,用科学解释未知事物是极其不合理的,如果说人类的起源是依靠进化分子碰撞,以及周围的所有环境都依靠偶然,那么基本是不可能的事情,不然怎么没有自然的产生的手机等各种电子产品或者相似的东西?人体以及自然的复杂度远远超过手机等各种我们所认为的高科技设备,在看到分子原子乃至宇宙的运行规律的时候,无不感叹这并不是一个巧合,这个世界必定存在一个造物主。人对造物主的赞美以及遵守造物主给这个世界的人们所定下的规矩,人才能平安快乐的生活下去。

       二.遵守造物主的规矩,人类才能够繁衍生息

           造物主在创造这个世界的时候,就给人类定下了规矩,要让人类遵守这些规矩,我们称为律法、道德或者天道等。纵观全世界,造物主给人类定下的规矩都是很相似的,我们也可以称为普世价值。当人类犯了造物主定下的规矩时,造物主总会给人类带来灾祸,如果人类不自知,继续越来越作恶,那么面临的就是灭亡的结局。其实说造物主给人类带来灾祸也不恰当,只能说这是天地规矩,让人类能够延续的规矩。如果每个人陷入在欲望中,相互残害,试问人类能够延续下去吗,你能够健康安心的生活吗?造物主给人类的规矩是在给人类指明延续的道路,可悲可叹有些人不明白,一切为了自己,自己遭难而不自知是自己害自己。

       三.一颗平常心,一颗仁慈真诚的心才能度过大劫难

           纵观世界总是有那么几个邪恶势力迷惑人心智,创世主主说人要相互友爱,要懂得付出爱,邪恶势力说一切都是为了利益,没有永生,只有今生,今朝有酒今朝醉,别人对你好都是为了利益。人都是为了自己的欲望,因此夫妻之间可以相互出卖,相互不遵守婚姻的誓言,朋友可以相互出卖。所造成的后果就是人类道德急剧下滑,其结果就是灾难来临,毒食物,毒奶粉等等,很多人还在迷雾中,殊不知这是自己给自己带来的灾难,接着随之而来的就是传染病等各种莫名其妙的病毒,没人知道从哪里来的,很多人还吹嘘科技,殊不知人类所谓的科学是如此的不堪一击。

          纵观历史上辉煌的文明,如此辉煌为何后来都消失了?我们在感叹古文明辉煌的时候是否应该反思他们为何会消失?纵观结论要么是人类迫害正信,要么是人类堕落:到处充满谎言,淫荡,欺骗。事实证明,如果人类的辉煌文明没有道德支撑,那么文明越辉煌,人类走向灭亡也就越快。但是总有那么一批人他们在大劫难中能够活下来,不管他们如何不愿意活,但是就是死不了,比如欧洲黑死病与病人亲密接触,但是就是不会得瘟疫。

       四.总结

            无论你今天或贫或富,你都应该保持一颗平常心,这些不过是今生眼目的东西,生不带来死不带去,有人现在富有,将来可能贫穷,有人现在贫穷,将来可能富有。如果顺着自己的欲望追求自己的东西,那么未来可能带给你的是更大的麻烦。真正的贫富贵贱是看你的心,有人有一颗善良平和的心,那么他就是高贵的,与他相处也会很舒服。有些人即使再漂亮帅气,内心丑陋那么你看着也不会舒服。造物主既然给这天地立了规矩那么我们就应该遵守这些规矩,因为这是造物主给人类的指明灯,唯有遵守造物主的规矩人才能幸福生活下去。如果放纵自己的欲望,那么等待你的可能就是永生地狱。

     

  • FreeBSD优点以及技巧

    FreeBSD添加自定义动态库(.so)路径:

    路径在 /usr/local/libdata/ldconfig  目录下,自己创建一个文件,添加库路径即可,然后运行 service ldconfig restart

    FreeBSD新系统如何恢复软件安装:

    拷贝备份的 /usr/local 目录以及自己安装的软件目录比如 /opt 目录到新系统上即可,然后恢复自己修改的非/usr/local以及/opt目录的其他文件

     

  • Debian/Ubuntu PHP编译(根据版本不定期更新)

    说明:

            缺少的包请自行安装,这里只描述一些可能的问题和编译参数,一些支持的路径请根据自己的情况修改,比如–prefix,mysql以及postgresql的PDO路径

    PHP7.3编译:

    ./configure  --prefix=/opt/php7.3 --with-pdo-mysql=/opt/mysql8.0  --with-pdo-pgsql=/opt/pg12 --with-curl --with-gd --with-gettext --with-iconv-dir --with-kerberos --with-xmlrpc --with-mysqli  --with-pcre-jit  --with-pdo-mysql --with-pdo-sqlite --with-pear --with-xmlrpc --with-xsl --with-zlib --with-bz2 --with-mhash --enable-fpm --enable-bcmath  --enable-inline-optimization --enable-gd-jis-conv --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --enable-zip --with-ldap --with-openssl --enable-gd-jis-conv
    

    PHP7.4编译:

    ./configure  --prefix=/opt/php7.4 --with-pdo-mysql=/opt/mysql8.0  --with-pdo-pgsql=/opt/pg12 --with-curl --enable-gd --with-gettext --with-iconv-dir --with-kerberos --with-xmlrpc --with-mysqli  --with-pcre-jit  --with-pdo-mysql --with-pdo-sqlite --with-pear --with-xmlrpc --with-xsl --with-zlib --with-bz2 --with-mhash --enable-fpm --enable-bcmath  --enable-inline-optimization --enable-gd-jis-conv --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --with-zip --with-ldap --with-openssl --enable-gd-jis-conv

    PHP8.0编译:

    ./configure  --prefix=/opt/php8.0 --with-pdo-mysql=/opt/mysql8.0  --with-pdo-pgsql=/opt/pg13 --with-curl --enable-gd --with-gettext  --with-kerberos  --with-mysqli  --with-pcre-jit  --with-pdo-mysql --with-pdo-sqlite --with-pear  --with-xsl --with-zlib --with-bz2 --with-mhash --enable-fpm --enable-bcmath  --enable-gd-jis-conv --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --with-zip --with-ldap --with-openssl --enable-gd-jis-conv

     

    友情提醒:最后别忘记了拷贝源代码的php.ini文件😊

  • 在不支持BSD的VPS上安装BSD系统

    很多人可能像我一样喜爱着BSD系统,比如最受欢迎的FreeBSD系统,但是我们在租用服务器的时候会发现很多VPS厂商并不提供BSD系统,大多是Linux和Windows,这里提供一些解决方法,在VPS上安装上BSD系统,比如我测试过的FreeBSD和OpenBSD系统。

    前提条件(满足一条即可,注意:所有VPS可VNC查看)

    1.服务商提供Linux拯救系统盘或者系统自带拯救功能启动。

    2.支持自定义下载ISO,这个就不需要向下面看了,直接装就行。

    第一种方式(FreeBSD 自己尝试过,通过mfsBSD安装):

    进入临时系统后使用

    wget -qO- https://mfsbsd.vx.sk/files/images/12/amd64/mfsbsd-12.1-RELEASE-amd64.img | dd of=/dev/sda bs=1m

    或者使用CURL

    curl -s https://mfsbsd.vx.sk/files/images/12/amd64/mfsbsd-12.1-RELEASE-amd64.img | dd of=/dev/sda bs=1m

    上述”/dev/sda”换成你自己的VPS硬盘名,还有建议像我一样使用管道符,一边下载一边写入磁盘,当然VPS内存很大就可以忽略了,写入完成之后重启运行 bsdinstall 命令即可,如果需要登录,root用户名的密码是mfsbsd