Ubuntu/Debian 修改任意 Mac 地址

有个叫做 macchanger 的软件包, 直接 apt install 即可

其实这个也是然并卵, ethtool -P eth0 就可以查看到物理 Mac 地址

有另外一篇文章说用 ethtool 就可以修改 eeprom 从而直接修改 Mac 地址。

然而, 这个需要 supports-eeprom-access = yes (运行 ethtool -i eth0), 如果网卡不支持的话,其实还是无解的。

至于其他办法用 dmidecode 等来获取 Mac 地址, 或许有效, 但是还不如 ethtool 直接。

结论, 要真的修改 Mac 地址,需要网卡支持,其他情况下,只是意淫修改一下 Mac 而已, 一条 ethtool -P 命令就能得到真实的 Mac 地址。(ethtool 是从 eeprom 里读取的)

用 qemu-nbd 命令 rescue Proxmox 下的 vm

一台 Ubuntu VM 修改了 vgname,启动不了了。 在 Proxmox 主机上,用以下命令挂接 VM 的磁盘:

# qm show 122 --pretty|grep drive // 查看 vmid=122 的磁盘路径
# modprobe nbd
# qemu-nbd -c /dev/nbd0 /mnt/pve/vmpool/images/122/vm-122-disk-0.qcow2
# fdisk -l // 验证 nbd 盘已经可以看到
# mount /dev/mapper/xingyun02-root /mnt
# chroot /mnt 

以上步骤就进入虚拟机根文件系统,直接可以对虚拟机操作了。 之后 umount , qemu-nbd -d ,然后 qm restart 120 就可以启动虚拟机了。

[How to] 怎样把 Proxmox 主机上的 USB 设备映射到虚拟机内

参考: https://pve.proxmox.com/wiki/USB_physical_port_mapping

把 USB 设备插入 PVE 主机后, dmesg 可以看到

假定虚拟机 ID 为 120,修改虚拟机配置文件: /etc/pve/qemu-server/120.conf,添加:

usb0: host=1-1.1.4

主机上 # qm stop 120; sleep 3; qm start 120 // 不是 qm restart
Ubuntu 的虚拟机内,默认 Kernel 没有 usbserial 模块,需要

sudo apt-get install linux-image-extra-virtual
sudo reboot
lsmod|grep usbserial
ls -al /dev/ttyUSB0

定制 curl 支持 –dns-servers 也就是 c-ares 异步 DNS 解析

操作系统默认安装的 curl 是不支持指定自定义的 DNS 服务器的。我们在一台有域名过滤的服务器上, 需要跑 curl ,要绕过系统默认的 DNS 解析器,所以,需要在命令行下指定自己的 DNS 解析服务器,这个需要 c-ares 支持。

# ./configure --enable-ares --enable-https --with-nghttp2  --with-librtmp=/usr/lib/x86_64-linux-gnu --with-gssapi --with-zlib --with-libssh2
如果不想删除原先的 curl 包的话,运行一下:
# ln -s /usr/local/lib/libcurl.so.4.6.0 /usr/lib/x86_64-linux-gnu/libcurl.so.4

跑 configure 之前,当然要先安装相关的 dev 包:
libnghttp2-dev, libc-ares-dev, libssh2-1-dev, librtmp-dev

接下来我们就可以用 curl 来分析网页的 title 来大概知道某个域名是做什么的:

# /usr/local/bin/curl -sS --dns-servers "114.114.114.114" http://www.tuchong.com/|xmllint --html --nowarning --xpath '//title' - 2>/dev/null|tr -d 'a-z<>'

Pi & Kiss

Linux 的世界里, 最让人欲罢不能的就是里面的脚本的强大功能。让Windows 下的 .bat 批处理脚本实在是小巫见大巫。

然而在我们日常解决系统问题里,我们会经常用到 lsof 和 curl 这两个命令。今天要介绍的是 lsof -Pi 和 curl -kIsS ,还有一个 perl -p -i -e 很多人可能都已经听说过。

lsof 就是 list open file,查看内存中打开的文件,对于我们检查进程是否正常,特别是网络的端口占用,Unix Socket 的使用,共享库的使用等都能让我们一目了然。 lsof -i 就是用来检查打开的 Internet 侦听地址的进程的。

例如 lsof -i6 就是列出又有 IPv6 上侦听的进程,如果要检查 udp 53 端口是否打开,我们可以运行 lsof -i udp:53 ,然而这个 -i 命令的输出里,端口都不是数字,而是服务名称,这些名称其实是定义在 /etc/services 文件里的。那么如何显示端口号的数字呢? 我们只要 lsof -Pi 就可以了!

讲完 Pi , 我们讲 Kiss,当然, 提到 Kiss 你也不用想入非非。码农也好,网工也罢,curl 是个常用的 http(s) API 调用工具,当然也是文件下载的利器,如果我们仅仅只是要检查 http 头怎么办? 例如,对于饱受 QOS 困扰的国际求学的需求,我们经常需要检查 google 网站是否可以正常访问,这个时候我们只需要检查 http 是否能正常返回即可。 我们就可以用 proxychains4 curl -kIsS https://www.google.com/ 来检查我们设置在 proxychains 里的代理服务器是否能正常使用,来验证我们的国际求学之路没有被阻断。

最后提一下 perl 的 pie 替换功能。如果我们要替换一个文件里的文字,直接用 sed 是不能修改被修改文件本身的,但是 perl 的 pie 提供了这个功能。 例如我们要把文件里的“女生”修改为“美女”的话,用 perl -p -i -e ‘s/女生/美女/g’ test.txt 即可。

希望这种方式传播 Linux 知识能让你记忆更加深刻,喜欢我们的网站话,也可以拿起手机扫码屏幕右边关注我们的公众号,如果是手机搜索进入我们页面的话,屏幕底下也有公众号二维码。

FreedomBox 自由的盒子

去他们家官网下载了一个 x64 IMG,放到了 Proxmox 里,DHCP 拿到了地址,并能解析,通过 PVE Web Console 界面登录,以为有默认的 root 口令,然而我错了,原来是要通过浏览器来设置第一次登录的,这个主意好!
FAQ 介绍很详细。

然后去安全选项把限制控制台访问的打勾去掉后,就可以用创建的 Web 账号 ssh 登录操作系统了。

Web 界面上搞了一堆 App 可以下载, 但是真心不适合国内用户。


系统配置里的功能也乏善可陈

只是好奇这个产品从 2013年的 0.1 版本,到现在还在一直更新。

Proxmox VE 命令行大全 CLI Cheatsheet

说大全,其实根本就不是。 如果你通过搜索来到这篇文章一定是 Google 或者某度发挥了作用。 各个功能之间用颜色区块分开显示,有利于阅读。For better reading we are using different color block for different functions.

Proxmox 绝对是个好东东,每天在操作有很多问题,希望能积累在这篇文章里,给后来者借鉴. This will be an Biligual post for non-Chinese users to read as well.

命令行下进入虚拟机的控制台, Enter into VM console through PVE command line.
# qm terminal VMID
用 Ctr-o 退出, Use Ctr-o to exit the VM console.

查看存储上的卷,Check volumns on storage.
# pvesm list STORAGE_NAME
查看指定的存储状态,Check status of a specific storage
# pvesm status -storage STORAGE_NAME
不指定 -storage 时,显示当前节点上的所有存储

Ubuntu apparmor 导致的 Unbound DNS 服务日志文件不能读写错误

开启 Apparmor 的 debug ,我们就可以在系统日志里看到如下的记录:

Dec 19 11:56:42 localhost kernel: [45483.551927] audit: type=1400 audit(1576727802.918:1755): apparmor=”DENIED” operation=”mknod” profile=”/usr/sbin/unbound” name=”/var/log/unbound/unbound.log” pid=23316 comm=”unbound” requested_mask=”c” denied_mask=”c” fsuid=115 ouid=115

vim /etc/apparmor.d/usr.sbin.unbound
在 root hints 后添加一行:

/var/log/unbound/** rw,

重启 apparmor,重启 unbound 服务后,就可以看到日志能正确的写入了。

解决问题后关闭 Apparmor 的 debug:

echo 0 > /sys/module/apparmor/parameters/debug

在线升级 Proxmox VE 6.0 集群到 6.1

首先确认删除企业版订阅的源文件:/etc/apt/sources.list.d/pve-enterprise.list
然后在 /etc/apt/sources.list 添加:
deb http://download.proxmox.com/debian/pve buster pve-no-subscription

然后 apt update && apt upgrade;这是 39 个等待更新的包:

总共 700 多兆的下载,经过 proxychains 的“加速”,下载速度稳定在 1.6MB/s,10分钟不到一个节点就升级完成了。

为了安全起见,在我们准备重新启动升级完成的节点之前,把所有的虚拟机手工在线迁移到另外的节点: # qm migrate <VM-ID> <Node-Name> –online
在启动 pve-03 这个节点的时候,我们准备升级 pve-02,升级前的集群状态:

pve-03 节点启动完成后再看集群状态:

登录 pve-03,我们可以看到内核版本已经是 5.3 了
Linux pve-03 5.3.13-1-pve #1 SMP PVE 5.3.13-1 (Thu, 05 Dec 2019 07:18:14 +0100) x86_64 GNU/Linux
之前的版本是:
Linux pve-03 5.0.15-1-pve #1 SMP PVE 5.0.15-1 (Wed, 03 Jul 2019 10:51:57 +0200) x86_64 GNU/Linux

无缝升级大功告成!

不需要重建分区的SD 卡分区扩容方案

OpenWrt 等一些操作系统刷完 img 到 SD 卡后, 16G 的 SD 卡,只用了一点点,经常需要“扩容”。之前的做法比较傻,就是重建分区,每次还要敲很多命令,还要把删除分区的起始扇区记录下来。

现在有了这段简单的代码,三行核心的代码就把这个工作自动化了,无需关心 SD 卡容量是 8G 还是 16G 还是更多,反正既然烧了,就是整张卡都是用在操作系统上了。

代码里的 DISK 就是类似 /dev/sdb 这样的, PART 就是分区 /dev/sdb2 这样的。 这里默认是第二分区。分区文件系统格式默认是 ext2/3/4 而不是其他。

burn () {
        fdisk -l ${DISK}>> /dev/null 2>&1 || (echo "could not find device $DISK - please check the name" && exit 1)
        # 烧写
        dd if=$IMG of=${DISK} bs=4M
        [ $? != 0 ] && echo "烧写出错了!" && exit 10
        MAXSIZEMB=$(printf %s\\n 'unit MB print list' | parted | grep "Disk ${DISK}" | cut -d' ' -f3 | tr -d MB)
        echo "[ok] ${PART} Will change to ${MAXSIZEMB} MB "
        parted ${DISK} resizepart 2 ${MAXSIZEMB}
        [ $? != 0 ] && echo "扩展分区出错了!" && exit 2
        e2fsck -y ${PART}
        resize2fs ${PART}
        [ $? = 0 ] && echo "文件系统扩展成功"
}

刷机愉快!