跳转至

system

在 QEMU 中运行 OpenBMC

背景

最近想给某台机器配一个 BMC,于是调研 OpenBMC 发行版,但是还没有找到可以买到的合适的 BMC,因此先在虚拟机中进行尝试。

UnixWare 7.1.4 虚拟机安装

安装过程

https://www.sco.com/support/update/download/product.php?pfid=1&prid=6 可以看到 UnixWare 7.1.4 的相关下载,其中首先要下载 UnixWare 的安装 ISO:https://www.sco.com/support/update/download/release.php?rid=346,尝试过用 QEMU 启动,会遇到找不到 CD-ROM 的问题,虽然通过设置 ATAPI_DMA_DISABLE=YES 解决了,但是又遇到了找不到硬盘的问题。

最后换成了 VirtualBox 7.0.6。用 VirtualBox 创建虚拟机的时候,不要给太多内存,4GB 就会无法启动,2GB 可以,硬盘也不要给太多,4GB 就足够。

AIX 7.2 虚拟机安装

安装过程

宿主机环境是 Debian bookworm,不需要像其他教程那样自己编译 qemu,直接 apt install 即可。

通过 google 可以搜索到 AIX 7.2 的 ISO,下载第一个 ISO 到本地,然后在 QEMU 中启动安装镜像:

OpenBSD xonly 实现原理

背景

最近看到 xonly status,看到 OpenBSD 最近在实现 xonly,也就是让一些页只能执行,不能读不能写。以往类似的做法是 W^X,也就是可以执行的时候不能写,可以写的时候不能执行。显然,xonly 是更加严格的,连读都不可以。查了一下历史,W^X 最早也是在 OpenBSD 中实现的,说不定以后 xonly 也会被各个操作系统实现。

Solaris 11.4 安装

下载安装镜像

访问 https://www.oracle.com/solaris/solaris11/downloads/solaris-downloads.html,点击下载,登录后跳转到一个新的页面。在 Platform 下拉框选择 x86,会出现一系列可以下载的文件。以 11.4.42.111.0 为例,需要下载的是:V1019840-01.iso Oracle Solaris 11.4.42.111.0 Interactive Text Install ISO (x86) for (Oracle Solaris on x86-64 (64-bit)), 890.5 MB。可以直接在浏览器中下载,也可以点击网页中的 WGET Options,用 wget 脚本下载。

下载以后,挂载 ISO 到虚拟机,正常按照指示进行安装。

FreeBSD/NetBSD/OpenBSD/DragonFlyBSD Cookbook

背景

最近在维护 lsof 的时候,需要在 FreeBSD/NetBSD/OpenBSD/DragonFlyBSD 上进行开发和测试,于是就装了虚拟机,特此记录我在使用过程中,与 Linux 不一样的一些常用 FreeBSD/NetBSD/OpenBSD/DragonFlyBSD 命令。

NUC11 ESXi 中 iGPU 直通虚拟机

背景

之前在 NUC11PAKi5 上装了 ESXI 加几个虚拟机系统,但是自带的 iGPU Intel Iris Xe Graphics(Tiger Lake GT-2) 没用上,感觉有些浪费。因此想要给 Windows 直通。在直通到 Windows 后发现会无限重启,最后直通到 Linux 中。

步骤

第一步是到 esxi 的设备设置的地方,把 iGPU 的 Passthrough 打开,这时候会提示需要重启,但是如果重启,会发现还是处于 Needs reboot 状态。网上进行搜索,发现是 ESXi 自己占用了 iGPU 的输出,解决方法如下:

$ esxcli system settings kernel set -s vga -v FALSE

这样设置以后就不会在显卡输出上显示 dcui 了,这是一个比较大的缺点,但是平时也不用自带的显示输出,就无所谓了。

第二步,重启以后,这时候看设备状态就是 Active。回到 Windows 虚拟机,添加 PCI device,然后启动。这时候,我遇到了这样的错误:

Module ‘DevicePowerOn’ power on failed
Failed to register the device pciPassthru0

搜索了一番,解决方法是关掉 IOMMU。在虚拟机设计中关掉 IOMMU,就可以正常启动了。

第三步,进入 Windows,这时候就可以看到有一个新的未知设备了,VID=8086,PID=9a49;等待一段时间,Windows 自动安装好了驱动,就可以正常识别了。GPU-Z 中可以看到效果如下:

不过关机重启的时候会蓝屏,可能还有一些问题,有人在论坛上也说 passthrough 之后会蓝屏。这个问题一直没有解决。

再尝试 Passthrough 到 Linux:

$ sudo dmesg | grep i915
[    2.173500] i915 0000:13:00.0: enabling device (0000 -> 0003)
[    2.180137] i915 0000:13:00.0: [drm] VT-d active for gfx access
[    2.182109] i915 0000:13:00.0: BAR 6: can't assign [??? 0x00000000 flags 0x20000000] (bogus alignment)
[    2.182110] i915 0000:13:00.0: [drm] Failed to find VBIOS tables (VBT)
[    2.182541] i915 0000:13:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=none
[    2.197374] i915 0000:13:00.0: firmware: direct-loading firmware i915/tgl_dmc_ver2_08.bin
[    2.198037] i915 0000:13:00.0: [drm] Finished loading DMC firmware i915/tgl_dmc_ver2_08.bin (v2.8)
[    3.401676] i915 0000:13:00.0: [drm] failed to retrieve link info, disabling eDP
[    3.515822] [drm] Initialized i915 1.6.0 20200917 for 0000:13:00.0 on minor 0
[    3.516054] i915 0000:13:00.0: [drm] Cannot find any crtc or sizes
[    3.516144] i915 0000:13:00.0: [drm] Cannot find any crtc or sizes

OpenCL 也可以检测到:

$ sudo apt install intel-opencl-icd clinfo
Number of devices                                 1
  Device Name                                     Intel(R) Graphics Gen12LP [0x9a49]
  Device Vendor                                   Intel(R) Corporation
  Device Vendor ID                                0x8086
  Device Version                                  OpenCL 3.0 NEO
  Device Numeric Version                          0xc00000 (3.0.0)
  Driver Version                                  1.0.0

Vulkan:

$ vulkaninfo
Group 1:
        Properties:
                physicalDevices: count = 1
                        Intel(R) Xe Graphics (TGL GT2) (ID: 0)
                subsetAllocation = 0

        Present Capabilities:
                Intel(R) Xe Graphics (TGL GT2) (ID: 0):
                        Can present images from the following devices: count = 1
                                Intel(R) Xe Graphics (TGL GT2) (ID: 0)
                Present modes: count = 1
                        DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR

不过目前还没找到显示输出的方法,只能用 VMware SVGA 或者远程桌面。

吐槽

需要吐槽的是,11 代的核显不再支持 Intel GVT-g,而是提供了 SR-IOV 的虚拟化。但是,Linux i915 驱动没有做相应的支持。

参考文档:

一次从 RHEL 6 到 CentOS 7 的更新

背景

有一台 RHEL 6 的服务器,各种软件版本太老了,用起来很难受,因此想升级。一开始想升级到 RHEL 7,但是发现必须要从 RedHat 下载 ISO,比较慢,所以我就先切换到 CentOS 6,再升级到 CentOS 7

过程

RHEL 6 Pre upgrade

一开始还是打算升级到 RHEL 7,所以跟随 RedHat 的文档去做 pre upgrade check,发现有一步要跑好久,网上搜了一下,发现这个步骤会扫描已有的各种程序,检查升级以后会不会出现不能运行的问题。但是如果有很多小文件,这一个过程就会进行很久,好在可以设置 exclusion 目录。最后检查出来的结果就是 GNOME 没法升级,建议卸载。

倒腾了一下升级工具,发现需要离线安装,比较麻烦,我就干脆换 CentOS 了。

RHEL 6 -> CentOS 6

首先,把软件源都切换到 CentOS,这一步很简单,因为包都是一样的。只不过,因为 CentOS 6 在 centos-vault 里面,所以用起来比较麻烦。

CentOS 6 -> CentOS 7

由于 CentOS 6 到 CentOS 7 升级涉及的改动比较多,官方提供了一个升级工具。一开始,我想直接升级到 CentOS 7 最新版本,但是报错,看到网上说可以升级到 CentOS 7 的早期版本,试了一下,确实没问题。

一通升级以后,重启,进入更新过程,发现很多包都安装失败了。重启以后,因为找不到 rootfs,挂在了 dracut 的 initramfs 里面。

漫长的修复过程

简单试了一下,发现 dracut 的 initramfs 里程序太少了,调试起来很痛苦。所以,我在 BMC 里通过 Virtual Media 挂了一个 Arch Linux 的 Live CD。因为通过 Web 访问延迟太高,我设了一个 root 密码,然后直接 ssh 到 live cd 系统中。

接着,我发现,可以正常找到盘和里面的各个分区,所以怀疑是之前 initramfs 里缺了什么东西,导致找不到硬盘。我 arch-chroot 到 root 分区里,然后手动更新各个包,特别麻烦:我首先升级了 yum repos 到最新的 CentOS 7,然后手动删掉/升级 el6 的各个软件包。最后好不容易把 kernel 终于升级好了,又重新生成 grub2 的配置,因为 CentOS 6 是 grub1。这时候,重启进入系统,发现可以找到 rootfs 了,但是经过 selinux relabel 以后,仍然会遇到 systemd-logind 起不来的问题,伴随着一系列的 audit 报警。

最后,使出了暴力的解决办法:在 cmdline 中设置 selinux=0 audit=0,然后终于进入系统了。再继续删掉一些 el6 的包,然后升级各种包,最后终于是恢复了正常。

通过 ipmitool 配置 iLO 4 管理端口

ipmitool 自带了对 iDRAC 的支持,可以通过 ipmitool delloem 设置 iDRAC 的管理端口。但是对 iLO 的支持并没有实现。研究了一番,找到了通过 raw command 配置 iLO 4 管理端口的方法。

这篇文章 讲述了 ipmitool lan 命令实际会发送的命令:

读取配置:

$ ipmitool raw 0x0c 0x02 CHANNEL KEY SET BLOCK

一般来说 SET 和 BLOCK 都是 0。KEY 的常见取值:

  • 3: IP 地址
  • 4: IP 地址来源
  • 5: MAC 地址
  • 6: 子网掩码
  • 12: 默认网关

返回的数据中,第一个字节忽略,剩下的就是数据了。

写入配置:

$ ipmitool raw 0x0c 0x01 CHANNEL KEY DATA...

知道如何读取配置后,接下来就是找到 iLO 4 配置 NIC 的地方了。一番搜索,找到了 HPE iLO IPMI User Guide。在第 101 页,可以找到一个用于配置 iLO NIC 选择的设置:

Index: 224
iLO Dedicated/Shared NIC Selection.
data 3:
• Selected iLO NIC.
◦ 0h = iLO Dedicated NIC is selected.
◦ 1h = iLO Shared NIC is selected.
◦ All others = reserved
• To switch to another iLO NIC:
1. Write this (and possibly parameter 197) to the desired NIC selection
2. Configure all other relevant network parameters for the desin
3. Reset iLO. The desired NIC will be in use after iLO reset.
• When writing changes to data 3, NIC selection:
◦ data 1 must be AAh
◦ data 2 must be 55h
◦ data 4 must be FFh

有这样的信息以后,可以通过下面的命令来设置 Shared NIC:

$ ipmitool raw 0x0c 0x01 0x01 224 0xAA 0x55 0x01 0xFF

再读出来 224,发现它的 data 4 表示 iLO reset needed for some settings changes that have been made。于是,执行 ipmitool mc reset warm 之后,就可以看到 NIC 选择已经更新:

$ ipmitool raw 0x0c 0x02 0x01 197 0x00 0x00
11 02 01 02

数据分别表示:

  • 0x02: Shared NIC Selection = ALOM
  • 0x01: Shared NIC Port Number = Port 1
  • 0x02: Platform supports ALOM shared NIC

如果想要的端口和默认选择不一样,可以写入 197 来更新。详见上面的文档链接。

超微的机器也有类似的办法:https://www.supermicro.org.cn/support/faqs/faq.cfm?faq=15868,可以用 ipmiutil smcoem lanport 命令来读取/修改。

Update:我给 IPMITOOL 提交了 PR,来简化这个过程

静态编译 ipmitool

为了在 ESXi 上运行 ipmitool,需要静态编译 ipmitool。网上已经有一些解决方案:

https://github.com/ryanbarrie/ESXI-ipmitool https://github.com/hobbsh/static-ipmitool https://github.com/ewenmcneill/docker-build-static-ipmitool

我稍微修改了一下,用来编译最新 ipmitool:

#!/bin/bash
set -x
export VERSION=1.8.18
rm -rf ipmitool_$VERSION
curl -L -o ipmitool_$VERSION.tar.bz2 http://deb.debian.org/debian/pool/main/i/ipmitool/ipmitool_$VERSION.orig.tar.bz2
tar xvf ipmitool_$VERSION.tar.bz2
cd ipmitool-$VERSION
CC=gcc CFLAGS=-m64 LDFLAGS=-static ./configure
make -j24
cd src
../libtool --silent --tag=CC --mode=link gcc -m64 -fno-strict-aliasing -Wreturn-type -all-static -o ipmitool.static ipmitool.o ipmishell.o ../lib/libipmitool.la plugins/libintf.la
file $PWD/ipmitool.static

复制下来,编译完成后 scp 到 esxi 中即可使用。

iDRAC 各版本

iDRAC 版本

目前接触到的 iDRAC 版本有:7 8 9。一些常见的服务器型号和 iDRAC 版本对应关系:

基本上,如果是 PowerEdge R 什么的,就看第二位数字,就可以推断出版本号了。

下面列举了一下可能会用到的版本。

iDRAC 7

iDRAC 7 在 2020 年 2 月停止更新了,最新版本是 2.65.65.65。

升级路线参考:Reddit

iDRAC 8

iDRAC 9

  • 4.00.00.00: 下载页面,2019 年 12 月版本。LLDP 连接视图。
  • 4.22.00.00: 下载页面,2020 年 7 月版本。
  • 4.40.00.00: 下载页面,2020 年 12 月版本,下一代的 iDRAC virtual console 和 virtual media,支持 Infiniband。
  • 5.00.00.00: 下载页面,2021 年 6 月版本。
  • 7.00.00.00: 下载页面,2023 年 6 月版本。

在线升级

iDRAC 可以在线从 Dell 官网下载新版本升级,在网页上选择通过 HTTPS 升级,域名写 ,具体见文档

IBM Power S822LC(8335-GTB) BMC 升级

背景

最近拿到一台 IBM Power S822LC(8335-GTB)机器的访问权限,这也是我第一次碰 ppc64le 指令集的服务器。然后发现,它的 BMC 版本比较老,我想连接 Remote Control 失败了,原因是 JViewer 不支持 macOS,我就想着能不能升级一下。

升级过程

首先,在网上找了一下文档,首先用 ipmitool 找一下机器型号:

$ sudo ipmitool fru print 3
 Chassis Type          : Unknown
 Chassis Part Number   : 8335-GTB
 Chassis Serial        : REDACTED

可以看到,这台机器是 8335-GTB 型号,按照这个型号在 Fix Central 上搜索,可以找到若干个版本的 firmware,其中最老的版本是 OP8_v1.11_2.1,对比了一下,和原来的版本一致:

$ sudo ipmitool fru print 47
 Product Name          : OpenPOWER Firmware
 Product Version       : IBM-garrison-ibm-OP8_v1.11_2.1
 Product Extra         :        op-build-da02863
 Product Extra         :        buildroot-81b8d98
 Product Extra         :        skiboot-5.3.6
 Product Extra         :        hostboot-1f6784d-3408af7
 Product Extra         :        linux-4.4.16-openpower1-bc83f92
 Product Extra         :        petitboot-v1.2.4-de6cda2
 Product Extra         :        garrison-xml-3db7b6e
 Product Extra         :        occ-69fb587
 Product Extra         :        hostboot-binar

于是,我下载了比较新的版本,一个 hpm 文件,然后在 BMC 网页上进行升级。第一次升级比较保守,选择了 2017 年的版本:

$ sudo ipmitool fru print 47
Product Name          : OpenPOWER Firmware
 Product Version       : IBM-garrison-ibm-OP8_v1.12_2.72
 Product Extra         :        op-build-14a75d0
 Product Extra         :        buildroot-211bd05
 Product Extra         :        skiboot-5.4.3
 Product Extra         :        hostboot-2eb7706-69b1432
 Product Extra         :        linux-4.4.30-openpower1-084eb48
 Product Extra         :        petitboot-v1.3.2-d709207
 Product Extra         :        garrison-xml-19a5164
 Product Extra         :        occ-d7efe30-47b58cb
 Product Extra         :        hostb

这次升级比较顺利,没有遇到什么障碍。但是我发现,BMC 里面显示的 BIOS 版本和 hpm 对不上,它总是认为 BIOS 版本是落后的,需要更新,而 Firmware 部分(BOOT 和 APP)是更新后的版本。但 BIOS 版本和原来的版本也不一样。于是我重新升级了几次,都没有效果,怀疑是升级出了问题。后来仔细读文档才发现,确实是 BMC 软件的问题(文档):

Note: BMC Dashboard shows an incorrect level for the BIOS caused by improper translation of the level subfields. The Bios number should reflect the PNOR level for the system of "IBM-garrison-ibm-OP8_v1.11_2.19". In this case, the BIOS version should be 1.11_2.19 but shows as 1.17.19 instead with the "11_2" converted into the "17".

The Firmware Revision for the BMC firmware shows correctly as "2.13.58".

Here is an example output of the Dashboard with an errant BIOS Version:

Dashboard gives the overall information about the status of the device and remote server.

Device Information

Firmware Revision: 2.13.58

Firmware Build Time: Oct 26 2016 11:40:55 CDT

BIOS Version: 1.17.19

一番捣鼓之后,不知道怎么了,BMC 就挂了,怎么访问都不通。只好物理断电,重新来过。按照同样的方法,升级到了 2019 年的版本:

 Product Name          : OpenPOWER Firmware
 Product Version       : IBM-garrison-OP8_v1.12_2.96
 Product Extra         :        op-build-v2.3-7-g99a6bc8
 Product Extra         :        buildroot-2019.02.1-16-ge01dcd0
 Product Extra         :        skiboot-v6.3.1
 Product Extra         :        hostboot-p8-c893515-pd6f049d
 Product Extra         :        occ-p8-a2856b7
 Product Extra         :        linux-5.0.7-openpower1-p8e31f00
 Product Extra         :        petitboot-v1.10.3
 Product Extra         :        machine-xml-c5c3

中途也遇到了几次奇怪的问题,多次通过 IPMI reset 之后就好了。

远程访问

但是,最新版的 BMC 固件中,JViewer 依然没有 macOS 支持。我也 SSH 进去确认了一下,确实没有对应的支持文件。只好在 Linux 机器上访问,安装 icedtea 以后,就可以打开 jnlp 文件,之后一切都很正常。

一个可能的替代方案:https://github.com/sciapp/nojava-ipmi-kvm

MacBookPro 14,3 Wi-Fi 驱动问题解决方案

之前在 MacBookPro 14,3 安装 Linux 后,很多东西的驱动都有了解决方法,参考 1参考 2,触摸板和键盘等等都可以正常使用,触摸板的使用效果比我意料要好一些,虽然还是没有 macOS 原生那么好。但 Wi-Fi 一直有能扫到信号但连不上的问题,最近终于有了比较完善的解决方案,地址,也是两个月前才出来的方案,我测试了一下,确实可以很好的解决网络问题,网卡型号是 BCM43602,驱动用的是 brcmfmac。

另一方面,带 T2 的 MacBook 似乎也有了支持,见 aunali1/linux-mbp-arch,有一些尚未 upstream 的 patch,但我没有设备,就没有测试了。需要吐槽的是 ArchWiki 不怎么更新新 Model 的 MacBook 的教程,都是到处找散落的 github repo 和 gist 找别人的方案。

P.S. 可以正常工作的有:Wi-Fi,键盘,触摸板,Touchbar,内置摄像头,键盘背光,蓝牙 P.P.S MacBookPro11,2 的网卡是 BCM4360,直接用 broadcom-wl 驱动就可以。

在 Archlinux 上用 winbind 配合 pam 配置 Windows AD 认证登录

作为不清真的网络管理员,为了配置一套完整的统一认证系统,陈老师采用了 Windows AD 的方法给这里配置统一认证。重装了系统,自然要把之前的统一认证再配到新装的 Archlinux 上。

参考资料: Active Directory Integration

首先安装相应的包:

pacman -S samba

我们还没有配好 Kerberos,所以跳过。

然后配置 /etc/samba/smb.conf,以下是一个例子。可以根据文档微调。

[global]
        security = ads
        realm = YOUR-AD-HERE
        workgroup = YOUR-GROUP-HERE
        idmap uid = 10000-20000
        idmap gid = 10000-20000
        winbind enum users = yes
        winbind enum groups = yes
        template homedir = /home/%D/%U
        template shell = /bin/bash
        client use spnego = yes
        client ntlmv2 auth = yes
        encrypt passwords = yes
        winbind use default domain = yes
        restrict anonymous = 2

这样,域上的用户 user 会拿到 home 目录为 /home/YOUR-DOMAIN-HERE/user,uid 在 10000-2000 范围内的用户。在一会经过配置之后,可以通过 getent passwd 验证。

接下来,需要把本机的 samba 登入到域的管理员,并且启动服务。

net ads join -U your-user-name
systemctl enable --now smb
systemctl enable --now nmb
systemctl enable --now winbind

更改 /etc/nsswitch.conf,在 passwd, shadow 和 group 都增添 winbind:

passwd: files mymachines systemd winbind
group: files mymachines systemd winbind
shadow: files winbind

接下来,可以进一步验证配置是否正确:

wbinfo -u
wbinfo -g
getent passwd
getent group
net ads info
net ads lookup

接下来可以配置 PAM 了。这一部分踩到了一些坑,现在终于做得差不多了。

需求:

  1. 如果一个用户名既有本地用户也有域上的用户,选择前者
  2. 用户要修改密码的话,如果是域用户,则要求走 Windows AD 那套方法改密码;否则仅修改本地用户密码。

实现:

修改 /etc/pam.d/system-auth:

第一部分:auth

auth [success=1 default=ignore]         pam_localuser.so
auth [success=2 default=die]            pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass
auth [success=1 default=die]            pam_unix.so nullok_secure
auth requisite                          pam_deny.so
auth optional                           pam_permit.so
auth required                           pam_env.so

首先利用 pam_localuser.so 匹配用户名和 /etc/passwd ,如果有, success=1 代表跳过下面一条规则,故会跳到 pam_unix.so 这一行。如果失败,default=ignore 表示忽略它的结果。如果是本地用户,匹配 pam_localuser.so 成功后跳到 pam_unix.so,如果成功了则跳到第五行,pam_permit.so 代表通过,最后由 pam_env.so 配置环境变量。如果是域用户,则由 pam_winbind.so 处理,如果成功,同样跳到第 5 条。如果本地用户和域用户都失败,就 pam_deny.so 认证失败。

第二部分:account

account required                        pam_unix.so
account [success=1 default=ignore]      pam_localuser.so
account required                        pam_winbind.so
account optional                        pam_permit.so
account required                        pam_time.so

这一部分仍有疑问。留待以后来补充。

第三部分:password

password [success=1 default=ignore]     pam_localuser.so
password [default=die]                  pam_echo.so file=/etc/pam.d/messages/ad_reject_change_passwd.txt
password optional                       pam_echo.so file=/etc/pam.d/messages/local_user_passwd.txt
password [success=1 default=die]        pam_unix.so sha512 shadow
password requisite                      pam_deny.so
password optional                       pam_permit.so

这里实现了我们的需求:如果是本地用户,提醒用户当前要修改的是本地用户的密码;如果是域用户,则输出信息后直接拒绝。

这里的 /etc/pam.d/messages/ad_reject_change_passwd.txt 内容如下:

Hi %u, please go to xxxxxxx to change your Active Directory password!

第四部分:session

session   required                      pam_limits.so
session   required                      pam_mkhomedir.so skel=/etc/skel/ umask=0022
session   required                      pam_unix.so
session   [success=1 default=ignore]    pam_localuser.so
session   required                      pam_winbind.so
session   optional                      pam_permit.so

这里与 Wiki 上内容无异。

然后修改 /etc/pam.d/passwd :

password        required        pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password        include         system-auth
#password       requisite       pam_deny.so
#password       required        pam_unix.so sha512 shadow nullok

首先判断密码强度。通过后则直接用刚才更改的 system-auth 中的 password 部分规则。

这样就配好了认证。自己对这套东西的理解还不够深,以后遇到了要继续钻研。

扩展阅读: PAM 配置简介 - 王邈

在服务器上安装 Archlinux 记录

有一台服务器的 Ubuntu 挂了,我们想在上面重装一个 Archlinux。我们首先下载了 archlinux-2018.04.01 的 ISO, 直接 dd 到 U 盘上,但是遇到了问题。

首先遇到的问题是,一启动之后就会花屏。我们一开始怀疑是 NVIDIA 驱动的问题,于是想改 kernel param 但是发现,这个 ISO 是 hybrid 的,我们在 macOS 和 Windows 上都不能 mount 上这种类型的盘。于是我们选择自己搞分区表。我们把 U 盘插到电脑上,然后在 Linux 虚拟机内重新分区为 GPT,然后 mount 到 /mnt/usb,再重新下载 archlinux iso,不过此时刚好上游更新了 archlinux-2018.05.01 的影响。我们把 ISO 中根分区 mount 到 /mnt/iso 上来,然后 cp -a /mnt/iso/* /mnt/usb 。调整了 grub 中的内核参数,仍然无果。我们认为问题可能在显卡上,就把那张显卡拔下来了,果然显示就正常了,但是新的问题就来了。

一启动,fstab 尝试把 LABEL=ARCHISO_201805 挂在上来,但是失败。于是我们把 U 盘插到 mac 上,用 Disk Utility 给分区命了名,再插回去,然后这个 Live CD 的 Systemd 就成功起来了。接下来就是根据官方的 Installation Guide 进行安装各种东西。安装完后,在 /boot/EFI 的操作上也出现了一些问题,一开始忘记调用 grub-mkconfig ,导致重启以后进入 grub-rescue,所以又回到 Live CD 重新 grub-mkconfig 。同时对 systemd-networkd 也进行了相应的调整,这样开机以后可以配好网络。主要就是在网卡上配上两个 VLAN 和相应的 DHCP 和静态地址。

接下来对以前的东西进行迁移。主要就是按照十分详细的 Arch Wiki 进行相应的配置。由于空间所限,我们把原来的 home 目录直接 mount --bind 到 /home,但是不可避免地,会出现用户 id 不对应的问题。于是我们把需要用到的用户的 /etc/{passwd,group,shadow} 统统拷贝到新的系统的相应地方。然后是配置 winbind,就是按部就班地按照 Arch Wiki 和以前的配置进行更新,然后成功地把 AD 上的用户获取到。此时再次出现了 uid 不对应的问题,此时我们使用 chown -R user:user /home/user 的方法。

剩下的工作就是琐碎的安装各种常用软件。不必多说。

P.S. 我研究出了一个很好用的 mosh + tmux 的 fish function: (但是有时工作有时不工作,不明白什么回事)

function tmosh
    mosh $argv -- tmux new-session bash -c 'tmux set -g mouse on; tmux setw -g mode-keys vi; fish'
end

In macOS Sierra, Karabiner-Elements finally support complex modifications

In favor of this commit, Karabiner-Elements now supports the much welcomed yet long-lost feature, namely complex modifications that enable users to trigger complex keypress.

Now I can achieve this:

If I press <Enter>, then:
1. If <Enter> is pressed alone, then send <Enter>.
2. If <Enter> is pressed along with other keys, then send <Control> + Other.

By adding this code to ~/.config/karabiner/karabiner.json :

"complex_modifications": {
    "rules": [
        {
            "manipulators": [
                {
                    "description": "Change return_or_enter to left_control. (Post return_or_enter if pressed alone)",
                    "from": {
                        "key_code": "return_or_enter",
                        "modifiers": {
                            "optional": [
                                "any"
                            ]
                        }
                    },
                    "to": [
                        {
                            "key_code": "left_control"
                        }
                    ],
                    "to_if_alone": [
                        {
                            "key_code": "return_or_enter"
                        }
                    ],
                    "type": "basic"
                }
            ]
        }
    ]
},
in one of profiles.

Note: the snippet above is adopted from this example. You can explore more examples since the GUI is not updated accordingly yet.

Important: Until NOW (2017-06-15), this feature is only implemented in beta versions of Karabiner-Elements (at least 0.91.1).