LiteServer Project Minecraft 主站
LiteServer Project Minecraft 国际站
友链: 白天的小站
问题现象:
Windows 11 + WSL2 + Ubuntu分发, 主机上启动VPN. WSL2内使用docker运行容器. curl http站点没问题, curl https站点显示 Connected to...
并且header已发送, 但是收不到响应.
推测是MTU导致的. 因为curl http的响应是301, body很小, header也很小, 但是curl https要返回的内容可能比较多所以丢包了.
分别在wsl2下安装tcpdump
并监听eth
和docker0
接口, 在windows下安装wireshark并监听VPN网卡(tun模式).
在docker内发起http请求, 可以看到docker0
接口正常, eth
接口正常, wireshark能看到请求和响应.
在docker内发起https请求, 可以看到docker0
接口有请求报文, eth
接口只有握手报文, wireshark
能看到请求报文.
通过 ip a
命令查看接口, 可以发现WSL2内eth
接口mtu为1370, docker0
的mtu为1500. 推测MTU不匹配且没开启PMTU导致丢包.
解决方法是配置docker使其mtu变为1370, 方法如下:
1 | sudo vim /usr/lib/systemd/system/docker.service |
在配置文件中, 将ExecStart=...
这一行改为:
1 | ... |
然后重新启动docker服务:
1 | sudo systemctl daemon-reload && sudo systemctl restart docker |
再访问https就正常了.
注意:请务必做好数据备份,本文的前提是对Proxmox中的VM操作, 利用了PVE的备份和还原能力.
创建一个一样大小的硬盘并挂载到VM.
选择一个live系统,这里我们选择 Ubuntu Desktop 24.04.1 LTS
将live盘设置为启动盘,启动系统,选择 Try Ubuntu 进入 live 环境
由于我原来的LVM系统盘有三个分区 1M, 1G的/boot, 199G的lvm数据分区,所以需要先拷贝系统,再把boot部分的补上, 具体操作如下:
1 | ... |
切换至root用户 sudo su
由于是live系统不需要输入密码
创建几个mount点:
1 | mkdir /mnt/src |
初始化新磁盘(这里 /dev/sda是原来的磁盘, /dev/sdb 是新的磁盘)
1 | gdisk /dev/sdb |
如果原来的磁盘不是GPT格式可以尝试如下命令:
1 | fdisk /dev/sdb |
在新的磁盘上创建文件系统
1 | mkfs -t ext4 /dev/sdb2 |
挂载磁盘
1 | mount -o ro /dev/sda2 /mnt/srcboot |
安装pv工具以便查看复制进度
1 | apt update && apt install pv |
开始拷贝数据
1 | tar -C /mnt/src --preserve-permissions --xattrs --xattrs-include=*.* --numeric-owner -c . | pv | tar -xf - -C /mnt/dst --preserve-permissions --xattrs --xattrs-include=*.* --numeric-owner |
其中 --perserve-permission
是为了保留权限, 对于 root 用户来说是默认的, 但是为了保险起见还是加上
--xattrs
, --xattrs-include=*.*
启用额外属性支持, 并拷贝全部属性. 这样类似/usr/bin/ping
等文件的 capability 也会被保存下来.
--numeric-owner
要求 tar 使用数字UID/GID 而不是用户名
给新磁盘文件系统下挂载分区
1 | cd /mnt/dst |
修改 /etc/fstab,保证里面 /dev/disk/by-uuid/
对应的磁盘和新磁盘一致. 通过 lsblk -o NAME,uuid
来查看磁盘的uuid
1 | nano /mnt/dstetc/fstab |
切换rootfs,安装grub. 再运行 update-grub
更新 grub 配置
1 | cd /mnt/dst |
退出 chroot, 关闭系统 shutdown now
弹出 live CD 和原来的磁盘 (在PVE中对应remove和detach)
重新启动新的系统,可能会遇到几个问题:
grub 菜单展示了 Ubuntu
但是回车进去报错 you need to load kernel first
这种情况应该是因为当前grub标签 (hd0,gpt2)
跟现实不匹配导致的. (也可能是前面忘记执行了update-grub)
在选择页面按下 c
进入 grub shell
1 | ls -l 确认当前磁盘列表和磁盘的UUID |
此时应该就会进入系统了
/etc/fstab
此时进入新系统后会卡在两个任务上:1 | Reached target .... |
这个没什么好办法,会卡两次,等三分钟就好了。进入系统后记得把 /etc/fstab
改了,运行 sudo grub-install && sudo update-grub
然后再重启应该就没问题了.
Live-cloning a running Linux installation to a new machine
grub error: you need to load kernel first
How do I list my devices in GRUB?
VMware workstation似乎有个bug, 当添加新的SCSI磁盘时VM内不会显示新的 /dev/ 块设备, 例如:
1 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS |
此时通过VMware控制台添加一个200G的磁盘, 再运行 lsblk
并不会有任何变化.
需要执行以下脚本”刷新”:
1 | for h in $(ls /sys/class/scsi_host); do |
再运行 lsblk
就可以看到磁盘了:
1 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS |
[SOLVED] Virtual Hard Disk is added, but not showing using lsblk -d command
开发机从 Ubuntu Server 20.04.6 升级到 Ubuntu Server 24.04.1 LTS 版本, 没遇到什么大问题. 但是发现 podman
变成了 [installed,local]
版本, 没有被自动升级. 但是看了一下容器,镜像,Volume还在.
我之前用的是kubic社区的podman源, 需要先卸载 sudo apt remove podman
再删除掉apt能识别出来不再需要的依赖: sudo apt autoremove
此时如果直接安装新版本 podman 可能会有问题, 提示 /etc/containers/containers.conf 被包 containers-common
使用.
可以尝试: sudo apt remove containers-common buildah crun
. 卸载前通过 sudo apt list --installed | grep installed,local
确认是否为本地版本.
还是不行的话就只能手动逐个卸载了:
1 | sudo dpkg --remove crun |
总之需要保证之前的版本都卸载掉. 不需要(也不要)运行 purge
. 会丢失数据.
sudo apt install podman golang-github-containernetworking-plugin-dnsname
其中 golang-github-containernetworking-plugin-dnsname
这个不清楚为什么在 Ubuntu 24.04 源里名字这么奇怪, 根据文档来看应该是 podman-plugins
或者 podman-dnsname
才对. Podman 4.x 版本删除了 dnsname
这个插件, 导致通过 compose 拉起的容器组之间不能直接通过 service 名字做寻址.
这个名字是通过 sudo apt search dnsname
找到的.
如果不安装这个包, 可能会看到类似下面的错误:
1 | WARN[0000] Error validating CNI config file /home/kiritow/.config/cni/net.d/wgop-net-wg0.conflist: [failed to find plugin "dnsname" in path [/usr/local/libexec/cni /usr/libexec/cni /usr/local/lib/cni /usr/lib/cni /opt/cni/bin]] |
装完之后在 /usr/lib/cni
下应该会看到 dnsname
插件.
由于Docker Compose V2已经从pip包升级合并到docker
命令了, 因此我们需要使用docker官网提供的docker-compose
独立安装包: Install Compose standalone
注意: 之前提到的 Ubuntu 22.04 里面 containernetworking-plugins
的问题似乎已经解决了, 现在安装 podman
会正确的安装这个依赖包. 参考之前的文章
containers/dnsname: name resolution for containers 这个插件现在已经archive了.
下面的参考没太大价值, 更多感觉还是要看 dnsname
这个插件的文档: Using the dnsname plugin with Podman
Podman network dns option not working with the DNS plugin enabled #20911
Impossible to override container’s DNS with network #17499
sudo vim /etc/fstab
把带有 /swap.img
的一行注释掉, 然后重启 sudo reboot
不想重启的话可以适用这条命令关闭swap sudo swapoff -a
1 | # 安装Containerd |
在root下执行 sudo su
1 | mkdir /etc/containerd/ |
编辑配置文件 vim /etc/containerd/config.toml
修改
1 | ... |
保存后重启服务 sudo systemctl restart containerd
sudo vim /etc/sysctl.d/k8s.conf
1 | net.ipv4.ip_forward=1 |
使其生效: sudo sysctl --system
1 |
|
1 | sudo systemctl enable --now kubelet |
这里的 --pod-network-cidr
需要跟下面的flannel配置一样, flannel默认是 10.244.0.0/16
1 | sudo kubeadm init --pod-network-cidr=10.77.0.0/16 |
看到这个就是创建成功了
1 | Your Kubernetes control-plane has initialized successfully! |
如果需要将其他节点加入到集群内但是忘记复制了安装之后的命令, 可以创建一个新的 bootstrap token, 有效期为1天. 会打印出用于加入集群的命令.
1 | kubeadm token create --print-join-command |
1 | mkdir -p $HOME/.kube |
1 | wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml |
查看状态 kubectl get nodes
1 | NAME STATUS ROLES AGE VERSION |
注意 Flannel 在新版Ubuntu Server (24.04)上可能会安装失败, log报错如下:
1 | Failed to check br_netfilter: stat /proc/sys/net/bridge/bridge-nf-call-iptables: no such file or directory |
参考以下方案解决:
1 | modprobe br_netfilter |
1 | curl -L https://istio.io/downloadIstio | sh - |
整合脚本是我在写完前面内容之后一段时间才整理出来的, 因为一直忙活GKE所以忘了整本地的集群. 这里面的版本可能跟前文的不太一样.
这个脚本需要在所有节点上运行. 创建集群, 加入集群命令不一样就不放到这里了.
1 | #!/bin/bash |
注意, PVE环境下如果图省事用Clone VM创建更多节点, 需要使用这样一个脚本来确保Clone出来的机器能够正常使用. 需要在上面的脚本之前执行并重启. 参考 Proxmox如何完整的复制一个VM
1 | set -xe |
Creating a cluster with kubeadm
Fix sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables.
Ava Max - Salt (Lyrics) oh, oh oh oh oh oh↑ I’m all out of salt, I’m not gonna cry
Kelly Clarkson - Stronger (What Doesn’t Kill You) [Official Video]
突然的自我 伍佰AndChinaBlue ♫「等不完守候,如果仅有此生 又何用待从头」♫ 動態歌詞Lyrics Music ♫ White_Lyric
谭咏麟 - 卡拉永远Ok『不想归去挂念你 对影只得我自己』【動態歌詞Lyrics】
Press Play Walk Away - S3RL & Synthwulf Laptop DJ
Will Sparks - Untouchable (feat. Aimee Dalton) [Official Music Video]
Blasterjaxx & Marnik - Heart Starts to Beat (Official Music Video)
《苹果香》狼戈 (哈族民歌) Apple Scent - Langge 六星街里还传来, 巴扬琴声吗
最近在阿里轻量云买了一些机器, 同样都是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 |
添加分钟级任务 sudo crontab -e
1 | @reboot swapon -s | grep -q swap || swapon /swap.img |
Terminate unattended-upgrades or whatever is using apt in ubuntu 18.04 or later editions
How to Remove Snap Packages in Ubuntu Linux
How do I configure swappiness?
How to read oom-killer syslog messages?
How can I check if swap is active from the command line?
Linux Partition HOWTO: 9. Setting Up Swap Space
How to Clear RAM Memory Cache, Buffer and Swap Space on Linux
设备是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进行数据的备份, 此处不再赘述.