0%

嗯,这篇是转帖的,因为GFW blocked this post,又没有再写一篇的必要。

Homebrew 是一套在 Mac OS X 下使用的套件管理工具,以往大家會使用 Mac Ports ,但是 port 的套件相依性太深,常常會為了裝個小套件而跟著裝上一堆用不到的相依套件,甚至造成套件版本衝突…… 因此 Homwbrew 甫一推出立刻受到大家的歡迎。

今天早上我剛好重裝 readline 套件,安裝完成後訊息提示我 readline 套件是 「keg-only」。我為了查出「keg-only」到底是指什麼意思,結果解開一連串的謎題,真相終於大白! Homebrew 的所有命名真的非常有邏輯~~

首先, brew 本身是釀造、釀酒的意思,會用這個字的原因是 homebrew 的安裝方式為下載 source code 回來做編譯,由於是在自己電腦做 local complie 編譯套件,所以這個工具叫做 homebrew 自家釀酒。

釀酒需要有配方 formula ,當你需要安裝套件時,流程就是下 brew 命令去根據配方 formula ,釀造出一桶(keg)酒來。所以 keg 指的是整個編譯完成的套件資料夾。

再來,放置套件的位置在 /usr/local/Cellar , Cellar 就是地窖,一桶一桶釀好的酒當然要存放在地窖裡囉!所以編譯完成的套件資料夾 keg 預設目錄在 /usr/local/Cellar 。

最後回到「keg-only」這個詞,字面上意思現在就很清楚,表示這個套件只會存放在桶子裡,不會跑出桶子外;實際上的行為是 brew 不會幫你做 symlink 到 /usr/local ,避免你的原生系統內還有一套 readline 而打架,所以訊息提示說 readline 套件是 keg-only 。

至此謎題全部解開啦! Homebrew 的命名邏輯真是超有趣的~

===
[erq]

传统的eth0,eth1,wlan0,wlan1等网络接口名字,在多网络接口卡的环境下,有多种因素会导致网络接口的名字与实际对应的网络设备发生变化,比如这次的eth0,可能下次系统重新启动后会变成eth1,这自然会导致很多很多问题。

当然出现了很多解决方案来避免这个问题,比如udev可以使一个网络接口的名字与网络接口的MAC地址绑定,从而只要还是那块网卡,对应的网络接口的名字就还是那个名字。

还有一种解决方案为”biosdevname”,当然systemd认为这些方案都有各种各样的问题,于是又有了它自己的解决方案。

systemd果然像有些人所言,想要控制一切!

systemd自v197开始使用自己的命名方案,但是只有全新安装的系统才默认使用这个命名规则,系统升级而来继续使用原先的方案。

所以这次系统重装后,发现wlan接口名字变成了

1
2
3
4
5
6
7
8
$ iw dev
phy#0
Interface wlx2016d803b954
ifindex 2
wdev 0x1
addr 20:16:d8:03:b9:54
ssid xxxxxxxx
type managed

竟然用的是MAC地址,如果MAC地址改变了呢?

查看内核信息:

1
2
$ dmesg grep wlan0
\[ \] rtl8723au 1-1.4:1.2 wlx2016d803b954: rename from wlan0

原来是systemd给改了名字,各种不适应,名字各种长。

可以禁用这种命名方式:

1
# ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules

或者给内核传递启动参数:

1
net.ifnames=0

随便吧。

References:
[1]Predictable Network Interface Names
[2]network interface naming with systemd 197

===
[erq]

  • 查看设备名

    1
    2
    3
    # iwconfig
    # iw dev
    # ip link
  • 启动接口

    1
    2
    # ifconfig wlan0 up
    # ip link set wlan0 up
  • 关闭接口

    1
    2
    # ifconfig wlan0 down
    # ip link set wlan0 down
  • 扫描热点

    1
    2
    # iwlist wlan0 scan
    # iw dev wlan0 scan
  • 连接到WPA/WPA2加密热点

    1
    2
    # wpa_supplicant -i interface -c <(wpa_passphrase your_SSID your_key) -B
    -B参数使wpa_supplicant背景运行
  • 动态获取IP地址

    1
    # dhclient wlan0
  • 设置静态ip地址

    1
    2
    # ip addr add 192.168.0.2/24 dev wlan0
    # ip route add default via 192.168.0.1
  • 查看接口状态

    1
    2
    3
    # iw dev wlan0 link
    # iwconfig wlan0
    # ifconfig wlan0

References:

[1]: Wireless network configuration

===
[erq]

系统重装了一次,本来Debian installer已经支持UEFI安装了,但是可能是这台机器兼容性的问题,UEFI安装时,字符和图形安装界面都是花屏,根本无法安装。只好设置成legacy模式(BIOS兼容方式)来安装。

安装完后,Debian是使用GRUB-PC来启动的,也就是legacy模式启动的。注意,legacy模式的GRUB是无法引导UEFI启动方式的其他系统的。

当然也可以切换到UEFI启动方式,其原理就是临时以UEFI方式引导Debian,然后安装配置grub-efi,因为只有UEFI方式启动的系统才能更改系统固件(NVRAM)中的UEFI Boot Manager配置。

可以使用live CD/USB来引导系统访问当前的Debian,此时需要chroot来安装配置grub-efi。另一种方法为使用rEFInd来直接引导当前的Debian系统,此时无需chroot。

下面是使用rEFInd引导管理器的操作步骤:

  • rEFInd USB启动盘制作

Getting rEFInd页面下载A USB flash drive image file,将下载的zip文件解压后,进入refind-flashdrive-x.x.x文件夹,将img文件写入usb盘

1
# dd if=refind-flashdrive-x.x.x.img of=/dev/sdb

注意自己usb闪存的设备名

  • 挂载ESP分区

使用rEFInd引导usb盘以UEFI方式引导系统,进入rEFInd界面,选择引导硬盘上的Debian系统。
然后,将GPT硬盘上的ESP分区,也就是EFI System Partition挂载到/boot/efi目录下

1
# mount /dev/sda2 /boot/efi
  • 安装grub-efi
    1
    2
    # apt-get install --reinstall grub-efi
    # grub-install /dev/sda

grub-install最后会向UEFI Boot Manager写入启动项,而只有UEFI方式启动的系统才能更改系统固件(NVRAM)中的UEFI Boot Manager。

不过,参考[2]介绍了一个trick,legacy启动方式下,将grub的镜像拷贝一份为efi/boot/bootx64.efi,这路径是相对于ESP分区的根。

1
# cp /boot/efi/efi/debian/grubx64.efi /boot/efi/efi/boot/bootx64.efi

然后重新启动系统会自动以UEFI方式引导Debian系统,然后重新执行grub-insall就可以了。

为什么这样可以呢?据说是因为UEFI Boot Manager如果没有配置指定的efi镜像,会自动寻找efi/boot/bootx64.efi来引导。没有实验到底是否可行,如果本来就存在多系统,这trick也就不太好用了。

  • 重新生成grub配置
    1
    # update-grub
  • 确认安装
1
2
# file /boot/efi/EFI/debian/grubx64.efi 
/boot/efi/EFI/debian/grubx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows

bootloader已正确安装

1
2
# efibootmgr --verbose grep debian
Boot0003* debian HD(2,GPT,80d7a129-458e-4395-a20d-edd18f128d19,0x1f4800,0x82000)/File(\\EFI\\debian\\grubx64.efi)

系统UEFI boot manager固件(NVRAM)中debian引导项已正确创建

去掉rEFInd启动盘,重新启动系统,UEFI中设置debian优先启动即可。

References:
[1]GrubEFIReinstall
[2]Debian: switch to UEFI boot
[3]

==
[erq]

rEFInd is a boot manager, not a boot loader. GRUB is a boot manager, also a boot loader. The Linux kernel built in an EFI boot loader for itself from version 3.3.0, called “EFI Boot Stub”.

grub2中的几个变量名gfxmode,gfxterm,gfxpayload中的gfx前缀就是graphics的简写/缩写: graphics => g(ra)fx(phics)

感觉proxychains比tsocks还好用,二者有一样的功能。

M$的LDAP实现叫Active Directory,Apple的LDAP实现叫Open Directory,Oracle的LDAP实现叫Virtual Directory,还有一个开源开放的LDAP实现叫OpenLDAP

pandoc转换中文markdown文档为pdf文档:

1
$ pandoc manual.mkd --latex-engine=xelatex -V mainfont="Noto Sans CJK SC" -o manual.pdf

pdflatex是不支持中文的