LiteServer Project Minecraft 主站
LiteServer Project Minecraft 国际站
友链: 白天的小站
最近在阿里轻量云买了一些机器, 同样都是1C/0.5G, Ubuntu 20.04 的机器运行非常正常, Ubuntu 22.04 的机器却隔一段时间就没有响应了. 具体表现为能ping通, 但是ssh登录会超时失败, 宿主机监控CPU/磁盘IO大涨. 登录VNC能看到类似这样的提示:
1 | [44211.553196] Out of memory: Killed process 95466(apt-check) ... shmem-rss:0KB, UID:0 pgtables:300KB dom_score_adj:0 |
而这台机器已经关闭了apt自动更新, 一番搜索之后发现snapd可能会引起这个问题:
snap list
1 | Name Version Rev Tracking Publisher Notes |
1 | sudo snap remove --purge lxd |
1 | sudo apt remove snapd |
sudo vim /etc/apt/preferences.d/nosnap.pref
1 | Package: snapd |
sudo apt clean && sudo apt update
在完全删除掉snapd之后, 目前机器已经正常运行了两三天…
后来发现还是不太行, 解决方案是给这个内存超级小的机器加上Swap. 因为阿里云没创建swap, 而且还把swappiness设置成了0! 为防止奇怪的事情发生, 弄成crontab脚本每分钟跑一下好了.
创建并启用swap
1 | dd if=/dev/zero of=/swap.img bs=1M count=1024 |
@reboot swapon -s | grep -q swap || swapon /swap.img
@reboot echo 60 > /proc/sys/vm/swappiness
### 参考
[Terminate unattended-upgrades or whatever is using apt in ubuntu 18.04 or later editions](https://askubuntu.com/questions/1186492/terminate-unattended-upgrades-or-whatever-is-using-apt-in-ubuntu-18-04-or-later)
[How to Remove Snap Packages in Ubuntu Linux](https://www.debugpoint.com/remove-snap-ubuntu/)
[How do I configure swappiness?](https://askubuntu.com/questions/103915/how-do-i-configure-swappiness)
[How to read oom-killer syslog messages?](https://serverfault.com/questions/548736/how-to-read-oom-killer-syslog-messages)
[How can I check if swap is active from the command line?](https://unix.stackexchange.com/questions/23072/how-can-i-check-if-swap-is-active-from-the-command-line)
[Linux Partition HOWTO: 9. Setting Up Swap Space](https://tldp.org/HOWTO/Partition/setting_up_swap.html)
[How to Clear RAM Memory Cache, Buffer and Swap Space on Linux](https://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/)
[Swappiness: What it Is, How it Works & How to Adjust](https://phoenixnap.com/kb/swappiness)
设备是HP Ultrium 6-SCSI, 使用LTO-6磁带进行备份, 磁带空间大约为2TB
安装 mt-st
工具管理磁带
1 | sudo mt -f /dev/nst0 status |
返回大概是这样的
1 | SCSI 2 tape drive: |
tar工具备份出来的tar包没有对文件顺序有明确的要求, 最终顺序由 readdir 决定, 某些情况下可能不符合要求, 可以提前生成一个文件列表提供给tar.
1 | find tobackupdirname -print0 | sort -z > /tmp/filelist.txt |
如果等待tar打包的文件总大小超过了磁带总大小, 需要启用MultiVolume支持 (建议在tmux内执行保证复制不会中断)
1 | sudo tar -cvf /dev/nst0 -M --no-recursion --null -T /tmp/filelist.txt |
这样tar就会在空间写满的时候提示换盘:
1 | ... |
更换磁盘后回车, tar就会继续进行备份了
当然也可以尝试使用LTFS进行数据的备份, 此处不再赘述.
有一台很久之前创建的Windows VM, 使用OVMF UEFI作为引导, 但是主盘是通过IDE挂载的, 而且因为系统没有安装Virtio驱动所以直接改为SCSI挂载会报错 INACCESSABLE_BOOT_DEVICE. 换成SATA也是一样的.
一番搜索后找到了一个靠谱的答案:
dir C:\
, dir D:\
之类的命令确定当前系统盘和Virtio驱动盘.dism /image:C:\ /add-driver /driver:E:\vioscsi\w10\amd64
wpeutil shutdown -s
整个流程走下来之后VM顺利更换掉了IDE磁盘. 同时我还升级了Machine的定义, 目前暂时没看到什么异常.
Change disk type (IDE/SATA to SCSI) for existing Windows machine
PVE 8.2.4 ISO安装, 由于同一台机器上其他的磁盘上原来已经安装了 PVE 7.4 所以安装过程中提示是否要rename到pve-OLD
而且不能跳过.
安装之后原来磁盘上的PVE会被保留, 但这也造成了我们没法把原来的磁盘用作其他用途 (Disk Manage会报错占用了, 没法Wipe Disk
)
参考以下步骤删除掉 pve-OLD
删除lv
1 | lvdisplay |
删除vg
1 | vgdisplay |
删除pv
1 | pvdisplay |
这样原来的磁盘就可以用作其他用途了.
PVE 8.2.4 版本iso安装之后 syslog里一直报错:
1 | ... |
如果直接操作 ipset
, iptables -vnL
命令会提示:
1 | ipset v7.10: Cannot open session to kernel. |
看起来是因为新版本启用了ebtables
但是某些地方还是有问题, 没找到特别好的解决方案, 目前的解决办法是 Datacenter -> Firewall -> Options, 设置 ebtables
为 No
. 重启后错误日志就消失了.
另外还有个奇怪的问题, 默认安装启用 ebtables
的情况下, CIFS mount会失败, 但是 dmesg 和 journalctl 里看不到错误. 目前也没有找到比较可靠的解决方案, 关闭 ebtables 之后正常了.
WebUI 上只有添加 Storage 的地方, 没有删除的方式, 需要手动进入Node Shell 进行删除
这里假设要删除的存储是 localssd
1 | systemctl status mnt-pve-localssd.mount |
1 | ls -al /mnt/pve/localssd |
1 | rm /etc/systemd/system/mnt-pve-localssd.mount |
1 | nano /etc/pve/storage.cfg |
找到localssd
这一段并删除
1 | dir: localssd |
[SOLVED] Removing old Storage from GUI
Proper way to remove old kernels from PVE 8.0.4 & which are safe to remove
制作一个Ubuntu Desktop启动盘, 使用这个U盘启动系统
备份全盘内容
1 | dd if=/dev/nvme1n1 of=/mnt/download/diskbackup/diskc.raw bs=4M |
其中 of
参数指定的输出文件位置可以在网络上, 例如SMB共享. 需要提前通过类似这样的命令 mount
1 | sudo mkdir /mnt/download |
如果中间不小心中断了的话, 也可以重新引导进入Ubuntu Desktop, 使用如下命令继续备份
1 | dd if=/dev/nvme1n1 of=/mnt/download/diskbackup/diskc.raw bs=4M seek=123456789 skip=123456789 iflag=skip_bytes oflag=seek_bytes |
其中 123456789
是已经备份生成出来的文件的长度, 建议稍微减小一些数值, 比如已经备份了157GiB (168577466368), 那就可以选择 150GiB作为继续点 (161061273600)
skip_bytes
, seek_bytes
表示skip
和seek
的数值是字节, 而不是bs
的数量. 否则实际上跳过的字节会变成 123456789 * 4M
. iflag
, oflag
不要写反了
1 | qemu-img convert -O qcow2 diskc.raw diskc.qcow2 |
因为源物理机是Windows系统, 此处按照Windows系统创建.
不挂载ISO, BIOS选择OVMF (UEFI), EFI Disk 正常创建即可.
把文件放到Proxmox指定路径下. 如果该路径在SMB上则需要保证磁盘文件的owner正确, 而且权限正确, 否则vm无法启动报错Permission denied
(此处跟stackexchange上遇到的情况不太一样, 我只需要chown+chmod 644就可以让vm正常启动了)
虽然不知道是什么原因导致的, 但是可以通过在Grub下输入这些来引导windows. 其中 (hd0,gpt1)
是通过grub下 ls
命令得到的.
1 | insmod part_gpt |
Translating bash to python; “dd” command “iflag=skip_bytes” how can be converted?
Determine the size of a block device
Resuming a DD of an entire disk
How to output file from the specified offset, but not “dd bs=1 skip=N”?
2.4. Converting Between RAW and QCOW2
How to use QEMU/KVM virtual machine disk image on SMB/CIFS network share: Permission denied
只讨论Linux VM
在PVE界面上操作Clone之后, 检查一下网卡MAC是不是不一样. 老版本PVE似乎有bug, clone VM的时候会把mac也复制. IP一样没问题, 只要都是DHCP等下重启就可以了.
sudo vim /etc/hostname
sudo vim /etc/hosts
1 | echo -n | sudo tee /etc/machine-id |
1 | sudo rm -rf /etc/ssh/ssh_host* |
sudo reboot
此时还不能配置BGP对话, 需要先建立起连接才可以
安装 Strongswan (IPSec VPN)
1 | sudo apt install strongswan strongswan-pki |
配置ipsec, 配置文件路径 /etc/ipsec.conf
1 | config setup |
其中vti脚本内容如下, 路径 /var/lib/strongswan/ipsec-vti.sh
(源自网络,见参考)
1 | #!/bin/bash |
注: 此处VTI也适用于Route-based/Policy-based IPSec, 对应的vti local ip 写自己的eth0网卡ip, remote ip写GCP的公网IP, 跟right=
那个参数保持一致即可, 不使用脚本也可以通过命令手动操作:
1 | sudo ip tunnel add ipsec0 local <eth0 IP> remote <GCP IP> mode vti key 1 # 这里的key需要跟ipsec status里面提到的key一样. 也可以在配置ipsec隧道的时候加上key参数来指定. |
调整 charon 配置, 不要安装路由 (下一步由bird2配置具体的路由, 否则会像WireGuard一样安装一个0.0.0.0/0的路由) /etc/strongswan.d/vti.conf
这里其实有点像wg的Table=off
1 | charon { |
配置PSK, 编辑 /etc/ipsec.secrets
. PSK最长可以有63个字符 (strongswan的限制, RFC标准比这个长)
1 | # This file holds shared secrets or RSA private keys for authentication. |
配置防火墙/端口转发(如有需要), ipsec使用: 500/udp,4500/udp,4510/udp,4511/udp
通过命令启动/关闭/查看ipsec隧道
启动: sudo ipsec start
关闭: sudo ipsec stop
查看状态 sudo ipsec statusall
(也可以使用 sudo ipsec status
)
看到ESTABLISHED
字样就表明已经建立连接了 (这里只能看到一个因为写文章的时候已经开始回收测试环境了)
1 | Status of IKE charon daemon (strongSwan 5.9.5, Linux 5.15.0-107-generic, x86_64): |
创建高可用VPN, 本质是一个隧道组,要实现HA,最少需要 2 中的两个网卡每个网卡配置一条隧道到1,最多可以配置 n*m 个隧道
安装BIRD2 sudo apt install bird2
编写bird2配置 /etc/bird/bird.conf
1 | log syslog all; |
重加载bird配置 sudo birdc configure
查看bird协议状态 sudo birdc show protocol all
1 | BIRD 2.0.8 ready. |
没问题的话就能看到GCP推送过来的路由了 ip route
1 | ... |
How to set up a VPN between strongSwan and Cloud VPN
Using Strongswan to setup site to site IPsec VPN between GCP and Digital Ocean
Configuring Site-to-Site IPSec VPN on Ubuntu using Strongswan
Route-based VPN - strongswan Documentation
Figuring out how ipsec transforms work in Linux
Establish VPN tunnel for in-house machine to access GCP network
KB: Connecting OpenWRT/LEDE router to Azure Virtual Network Gateway (IKEv2)
Secure site-to-site connection with Linux IPsec VPN
Google Cloud HA VPN interoperability guide for AWS
How does IPsec VPN really work?
Google史一样的文档: Create two fully configured HA VPN gateways that connect to each other | Establish BGP sessions
GCP Networking: Part 2 Cloud Router
howto/Bird2 - dn42 虽然是dn42的教程但是非常管用
Multiple connections with longer than 64 byte PSK keys fail with “MAC mismatched”