蜻蜓的窝 https://dragonfly.fun/ zh-CN 蜻蜓特派员的小窝 Mon, 03 Mar 2025 10:39:16 +0800 Mon, 03 Mar 2025 10:39:16 +0800 Visual Studio 2022 Build Tools 下载地址 https://dragonfly.fun/archives/vs2022.html https://dragonfly.fun/archives/vs2022.html Mon, 03 Mar 2025 10:39:16 +0800 蜻蜓特派员
  • 2017: https://aka.ms/vs/15/release/vs_buildtools.exe
  • 2019: https://aka.ms/vs/16/release/vs_buildtools.exe
  • 2022: https://aka.ms/vs/17/release/vs_buildtools.exe
  • ]]>
    0 https://dragonfly.fun/archives/vs2022.html#comments https://dragonfly.fun/feed/archives/vs2022.html
    Xubuntu 24.04 体验笔记 https://dragonfly.fun/archives/xubuntu.html https://dragonfly.fun/archives/xubuntu.html Fri, 22 Nov 2024 13:05:00 +0800 蜻蜓特派员 本文记录了安装使用 xubuntu 24.04 minimal 中遇到的问题

    xubuntu.png

    1. 语言缺失

    即便从安装开始选择了中文,部分菜单和应用因为是基于 gnome 的还是英文的样子,运行以下命令后重启启动即可解决

    sudo apt install -y language-selector-gnome
    1. 安装搜狗拼音输入法

    因为搜狗输入法是基于 fcix4 开发的,所以需要首先卸载掉系统自带的 fcix5,相关命令如下

    sudo apt purge -y fcitx5*
    
    # Additional dependencies (refer to: https://shurufa.sogou.com/linux/guide)
    sudo apt install fcitx libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2 libgsettings-qt1 
    sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/
    
    # Download deb installer from https://shurufa.sogou.com/linux
    sudo apt install -y <sogou_xxx.deb>

    最后重启即可生效

    1. xfce 桌面美化
    1. 安装非Snap版 Thunderbird
    # 删除预装的 Snap 包
    sudo snap remove --purge thunderbird
    sudo apt remove -y thunderbird
    
    # 添加 PPA 源
    sudo add-apt-repository ppa:mozillateam/ppa

    创建规则文件 /etc/apt/preferences.d/99mozillateam 内容如下

    Package: *
    Pin: release o=LP-PPA-mozillateam
    Pin-Priority: 900

    最好就应正常安装非 Snap 版的邮件客户端了

    sudo apt update
    sudo apt install thunderbird
    1. 修复更新 Edge、VSCode 失败
    wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/microsoft.gpg
    echo "deb [arch=amd64] https://packages.microsoft.com/repos/code/ stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
    echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge/ stable main" | sudo tee /etc/apt/sources.list.d/microsoft-edge.list
    1. 禁用 IPV6
    sudo tee /etc/sysctl.d/disable_ipv6.conf << EOF
    net.ipv6.conf.all.disable_ipv6=1
    net.ipv6.conf.default.disable_ipv6=1
    EOF
    sudo sysctl -p /etc/sysctl.d/disable_ipv6.conf
    1. 编译安装 Python 3.8
    sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev
    wget https://www.python.org/ftp/python/3.8.20/Python-3.8.20.tar.xz
    tar xf Python-3.8.20.tar.xz && cd Python-3.8.20
    ./configure --enable-optimizations --without-ensurepip --prefix=/usr/local/python38
    make -j$(nproc)
    sudo make altinstall
    参考文章
    xubuntu language support
    Ubuntu_24.04_Install_Sogou_Pinyin.md
    如何在 Ubuntu 24.04 中将 Thunderbird 安装为 DEB
    ]]>
    0 https://dragonfly.fun/archives/xubuntu.html#comments https://dragonfly.fun/feed/archives/xubuntu.html
    小米AX3000开启SSH 暴露IPV6公网IP https://dragonfly.fun/archives/miwifi.html https://dragonfly.fun/archives/miwifi.html Mon, 04 Dec 2023 13:47:00 +0800 蜻蜓特派员 随着IPV4的资源枯竭和IPV6的普及,通过IPV6在公网上暴露自家NAS成为更为更好的方式。
    但是自家购买的 小米AX3000 官方固件固件 IPV6 相关的功能十分简陋,只有一个防火墙开关。如果单纯的关闭防火墙,势必会让局域网所有设备都暴露到公网中,十分危险。又不像高端型号(如小米AX9000)提供的 SSH 功能,引出了此文

    本文使用 小米路由官方固件 实现自定义IPV6防火墙的高级功能

    1.开启路由器的 SSH 服务

    首先到 https://github.com/openwrt-xiaomi/xmir-patcher 下载最新的脚本,Windows 用户直接运行 run.bat 即可

    确认 IP 设置正确后,选择 2 后按提示开始安装并设置密码

    安装完成后即可通过如下命令连接

    ssh -o HostKeyAlgorithms=+ssh-rsa [email protected]

    2.放行特定设备的端口

    SSH 进入小米官方固件,可以看到系统是由 OpenWRT 修改而来,所以放行端口的方式类似原版 OpenWRT, 打开配置文件 /etc/config/firewall 并添加如下内容

    config rule
        option name 'Allow-NAS'
        list proto 'tcp'
        option src 'wan'
        option dest 'lan'
        list dest_ip '::设备的后缀/::ffff:ffff:ffff:ffff'
        option dest_port '端口号'
        option target 'ACCEPT'
        option family 'ipv6'
    路由器下级设备某个IPV6后四位IP固定不变的设备,例如::11aa:22bb:33cc:44dd/::ffff:ffff:ffff:ffff,该设备11aa:22bb:33cc:44dd固定不变)

    保存后运行 /etc/init.d/firewall restart 即可生效

    3.开机启动脚本设置

    uci set firewall.aliddns=include
    uci set firewall.aliddns.type='script'
    uci set firewall.aliddns.path='/data/aliddns.sh'
    uci set firewall.aliddns.enabled='1'
    uci commit firewall

    4. 其他 SSH 管理

    • 自定义 hosts 配置

    官方的自定义 hosts 功能通过修改文件 /etc/custom_hosts 实现

    • 配置 Dnsmasq 实现 DNS 泛解析

    修改 /etc/dnsmasq.d/custom.conf 为如下内容

    address=/hismarttv.com/127.0.0.1

    保存后运行 /etc/init.d/dnsmasq restart 即可生效

    • 停用访客 WiFi
    ifconfig wl3 down
    ]]>
    8 https://dragonfly.fun/archives/miwifi.html#comments https://dragonfly.fun/feed/archives/miwifi.html
    从零制作 Ubuntu 20.04 LiveCD https://dragonfly.fun/archives/livecd.html https://dragonfly.fun/archives/livecd.html Fri, 14 Jul 2023 13:23:00 +0800 蜻蜓特派员 为什么要构建自己的 LiveCD
    1. 进行一些本地化修改;
    2. 对默认设置不满意;
    3. 对镜像的预装不满意。

    Ubuntu-LiveCD.png

    构建条件

    1. 一个运行 Ubuntu 的设备(虚拟机也是可以的,但不推荐 WSL1/2,因为 WSL2 经过实际测试会出现一些问题)。
    2. 确保已经安装 dosfstoolssquashfs-toolsxorrisogrub-commongrub-pc-bingrub-efi软件包。还有 nano 文本编辑器。
    sudo apt-get install --no-install-recommends -y debootstrap squashfs-tools  xorriso dosfstools mtools grub-efi grub-pc-bin nano
    1. 全程终端操作,需要 sudo 权限。

    准备目录

    准备一个空文件夹作为工作目录。这个空文件夹所在分区不能是 NTFS、FAT32 格式。

    然后在这个文件夹中创建 target、livecd 这两个文件夹。target 里面是目标系统,livecd 是 ISO 文件夹目录。

    livecd 里面要创建 casper boot EFI preseed 等文件夹

    export CHROOT=$PWD/target
    sudo mkdir -p $CHROOT livecd/{casper,boot/grub,EFI/boot}

    准备镜像

    • 基础系统

    构建基础系统有两种方式:

    1. 利用 debootstrap 构建一个基础系统。
    2. 解压 Ubuntu Base。

    debootstrap 是 Debian 系发行版的一个实用工具,允许您基于在线的软件源构建一个属于自己的 Debian 系发行版的基本系统。

    Ubuntu Base 是 Ubuntu 的基本系统,说通俗点,就是 Ubuntu 帮你打包好的 debootstrap 后的基本系统。

    如果你想使用 debootstrap 工具构建一个基本系统,请运行:debootstrap focal chroot https://mirrors.aliyun.com/ubuntu

    sudo debootstrap --no-check-gpg --variant=minbase --arch=amd64 --exclude=gcc-9-base,gcc-10-base --components=main,restricted,universe,multiverse \
       --include=bash-completion,systemd-sysv,locales,nano,casper,console-setup,netplan.io,whiptail focal $CHROOT https://mirrors.aliyun.com/ubuntu
    • 配置软件源,因为默认是不完善的。
    sudo chroot $CHROOT tee /etc/apt/sources.list << EOF
    deb https://mirrors.aliyun.com/ubuntu focal main restricted universe multiverse
    deb https://mirrors.aliyun.com/ubuntu focal-security main restricted universe multiverse
    deb https://mirrors.aliyun.com/ubuntu focal-updates main restricted universe multiverse
    EOF
    • 挂载特殊文件系统

    你需要先挂载一些特殊的文件系统。比如 dev proc sys run。

    sudo mount -B /dev $CHROOT/dev
    sudo chroot $CHROOT mount none -t proc /proc
    sudo chroot $CHROOT mount none -t sysfs /sys
    sudo chroot $CHROOT mount none -t devpts /dev/pts
    
    sudo chroot $CHROOT bash -s << EOF
    truncate -s 0 /etc/machine-id
    ln -fs /etc/machine-id /var/lib/dbus/machine-id
    dpkg-divert --local --rename --add /sbin/initctl
    ln -s /bin/true /sbin/initctl
    EOF
    • 更新软件源

    我们先更新一下软件源,升级一下基础系统里的软件包。

    sudo chroot $CHROOT apt-get update
    sudo chroot $CHROOT env DEBIAN_FRONTEND=noninteractive apt-get upgrade -y
    • 安装 Linux 内核

    这一步是必要的,安装的内核还将用于 ISO 镜像的引导。

    sudo sed -i 's|COMPRESS=lz4|COMPRESS=lzma|' $CHROOT/etc/initramfs-tools/initramfs.conf
    sudo chroot $CHROOT apt-get install -y linux-image-generic-hwe-20.04 grub-*-
    • 复制内核到光盘镜像
    sudo mv $CHROOT/boot/vmlinuz-**-**-generic livecd/casper/vmlinuz
    sudo mv $CHROOT/boot/initrd.img-**-**-generic livecd/casper/initrd.img
    • 给目标系统安装最小化桌面
    sudo chroot $CHROOT env DEBIAN_FRONTEND=noninteractive apt-get install -y fonts-noto-cjk-extra language-pack-gnome-zh-hans ubuntu-desktop-minimal \
       networkd-dispatcher netplan.io firefox- gedit- eog- evince- gnome-characters- gnome-user-docs- gnome-font-viewer- gnome-online-accounts- \
       gnome-disk-utility- gnome-screenshot- gnome-logs- ubuntu-docs- fonts-deva- snapd- cups- cups-*- ibus- ibus-*-
    sudo tee $CHROOT/etc/netplan/01-network-manager-all.yaml << EOF
    # Let NetworkManager manage all devices on this system
    network:
      version: 2
      renderer: NetworkManager
    EOF

    自定义配置

    到这里结束之后,你可以在这个 chroot 容器里面进行自定义的设置,你想要预装什么软件,也可以操作。在容器里的操作和在本机操作的命令是相似甚至一致的。

    • 添加额外 apt 源
    # 添加 VSCode 源
    curl -sL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o $CHROOT/etc/apt/trusted.gpg.d/microsoft.gpg
    echo "deb [arch=amd64] https://packages.microsoft.com/repos/code stable main" | sudo tee $CHROOT/etc/apt/sources.list.d/vscode.list
    echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" | sudo tee $CHROOT/etc/apt/sources.list.d/microsoft-edge.list
    
    # 添加 cmake 源
    curl -sL https://apt.kitware.com/keys/kitware-archive-latest.asc | sudo gpg --dearmor -o $CHROOT/etc/apt/trusted.gpg.d/kitware.gpg
    echo "deb https://apt.kitware.com/ubuntu/ focal main" | sudo tee $CHROOT/etc/apt/sources.list.d/kitware.list
    
    curl -sL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o $CHROOT/etc/apt/trusted.gpg.d/docker.gpg
    echo "deb https://mirrors.aliyun.com/docker-ce/linux/ubuntu/ focal stable" | sudo tee $CHROOT/etc/apt/sources.list.d/docker-ce.list
    • 安装字体
    sudo unzip $HOME/fonts.zip -d $CHROOT/usr/share/fonts/truetype/microsoft
    sudo chroot $CHROOT env DEBIAN_FRONTEND=noninteractive apt-get install -y gnome-tweaks
    
    # 额外字体
    echo msttcorefonts msttcorefonts/accepted-mscorefonts-eula select true | sudo chroot $CHROOT debconf-set-selections
    sudo chroot $CHROOT apt-get install -y ttf-mscorefonts-installer
    sudo chroot $CHROOT debconf-show ttf-mscorefonts-installer
    • 个性化设置
    sudo sed -i 's|\\w|\\W|g' $CHROOT/etc/skel/.bashrc
    
    sudo mkdir -p $CHROOT/etc/dconf/profile $CHROOT/etc/dconf/db/local.d
    
    sudo tee $CHROOT/etc/dconf/profile/user << EOF
    user-db:user
    system-db:local
    EOF
    
    sudo tee $CHROOT/etc/dconf/db/local.d/01-desktop << EOF
    [org/gnome/desktop/media-handling]
    automount=false
    
    [org/gnome/desktop/interface]
    font-name='微软雅黑 11'
    document-font-name='微软雅黑 11'
    
    [org/gnome/desktop/wm/preferences]
    titlebar-font='微软雅黑 Bold 11'
    EOF
    
    sudo chroot $CHROOT dconf update
    
    sudo mkdir $CHROOT/etc/docker
    sudo tee $CHROOT/etc/docker/daemon.json << EOF
    {
      "data-root": "/opt/docker",
      "registry-mirrors": [ "https://docker.1ms.run" ],
      "log-driver": "journald",
      "log-level": "warn",
      "bridge": "none",
      "debug": false
    }
    EOF

    清理容器

    到这一步,目标系统已经配置完毕了,下面应当进行清理。

    sudo chroot $CHROOT apt-get autoremove --purge -y
    for i in /dev/pts /dev /proc /sys; do sudo umount $CHROOT$i; done
    sudo chroot $CHROOT bash -s << EOF
    cat /dev/null > /etc/machine-id
    rm /sbin/initctl
    dpkg-divert --rename --remove /sbin/initctl
    EOF

    打包容器

    # 建立清单
    sudo chroot $CHROOT dpkg-query -W --showformat='${Package} ${Version}\n' | sudo tee livecd/casper/filesystem.manifest
    # 打包目标系统
    sudo mksquashfs $CHROOT livecd/casper/filesystem.squashfs -noappend -wildcards -e "var/cache/*" -e "var/log/*" -e "var/lib/apt/lists/*" -e "usr/share/man/*"

    ISO 镜像的制作

    • 创建 GRUB 引导文件
    # 生成引导菜单
    sudo tee livecd/boot/grub/grub.cfg << EOF
    search --set=root --file /casper/vmlinuz
    insmod all_video
    set timeout=30
    menuentry "Ubuntu Live" {
       linux /casper/vmlinuz boot=casper net.ifnames=0 locale=zh_CN.UTF-8 toram fsck.mode=skip quiet splash --
       initrd /casper/initrd.img
    }
    menuentry "Ubuntu persistent" {
       linux /casper/vmlinuz boot=casper net.ifnames=0 locale=zh_CN.UTF-8 persistent fsck.mode=skip quiet splash --
       initrd /casper/initrd.img
    }
    EOF
    
    # 创建 GRUB EFI 引导文件
    sudo grub-mkstandalone --format=x86_64-efi --output=livecd/EFI/boot/bootx64.efi --locales="" --fonts="" \
       "boot/grub/grub.cfg=livecd/boot/grub/grub.cfg"
    sudo LC_CTYPE=C bash -s << EOF
    dd if=/dev/zero of=efiboot.img bs=1M count=3 && \
    mkfs.vfat efiboot.img && \
    mmd -i efiboot.img efi efi/boot && \
    mcopy -i efiboot.img livecd/EFI/boot/bootx64.efi ::efi/boot/
    EOF
    
    # 创建 GRUB LEGACY 引导文件
    sudo grub-mkstandalone --format=i386-pc --output=core.img \
       --install-modules="linux16 linux normal iso9660 biosdisk memdisk search tar ls" \
       --modules="linux16 linux normal iso9660 biosdisk search" --locales="" --fonts="" \
       "boot/grub/grub.cfg=livecd/boot/grub/grub.cfg"
    cat /usr/lib/grub/i386-pc/cdboot.img core.img > bios.img
    • ISO 的生成
    sudo xorriso -as mkisofs -iso-level 3 -full-iso9660-filenames -volid "UBUNTU" -output Ubuntu-20.04-LiveCD-x86_64.iso \
       -eltorito-boot boot/grub/bios.img -no-emul-boot -boot-load-size 4 -boot-info-table \
          --eltorito-catalog boot/grub/boot.cat --grub2-boot-info --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
       -eltorito-alt-boot -e EFI/efiboot.img -no-emul-boot -append_partition 2 0xef efiboot.img \
       -graft-points "livecd" "/EFI/efiboot.img=efiboot.img" "/boot/grub/bios.img=bios.img"
    参考资料
    https://github.com/mvallim/live-custom-ubuntu-from-scratch
    https://manpages.ubuntu.com/manpages/focal/man7/casper.7.html
    ]]>
    2 https://dragonfly.fun/archives/livecd.html#comments https://dragonfly.fun/feed/archives/livecd.html
    Office 家庭和学生版 官方下载地址 https://dragonfly.fun/archives/o365.html https://dragonfly.fun/archives/o365.html Sun, 18 Sep 2022 12:10:00 +0800 蜻蜓特派员 现在的品牌机都预装了 Office 家庭和学生版,但是重装系统后从哪里获取预装版本的Office安装包呢?
    一般来说,可以浏览器打开 服务和订阅 ,在已购买产品中获取安装包下载连接。

    office365.jpg

    下载连接

    如何转换为 VLK 版本

    用“管理员”打开命令提示符,以此运行以下命令

    cd /d "C:\Program Files\Microsoft Office\Office16"
    for /f %x in ('dir /b ..\root\Licenses16\StandardVL_KMS_*.xrm-ms') do cscript ospp.vbs /inslic:"..\root\Licenses16\%x"

    如何选择安装的组件

    打开 https://config.office.com/deploymentsettings 下一步下一步选择适合自己的选项,并导出为 xml 文件,示例如下

    <Configuration>
      <Add OfficeClientEdition="64" Channel="Current">
        <Product ID="O365ProPlusRetail">
          <Language ID="zh-cn" />
          <ExcludeApp ID="Access" />
          <ExcludeApp ID="Groove" />
          <ExcludeApp ID="Lync" />
          <ExcludeApp ID="Teams" />
          <ExcludeApp ID="OneDrive" />
          <ExcludeApp ID="OneNote" />
          <ExcludeApp ID="Publisher" />
          <ExcludeApp ID="Bing" />
        </Product>
      </Add>
      <Updates Enabled="TRUE" />
      <RemoveMSI />
      <Display Level="Full" AcceptEULA="TRUE" />
    </Configuration>

    然后通过 OfficeSetup.exe /configure 配置.xml 进行安装

    ]]>
    1 https://dragonfly.fun/archives/o365.html#comments https://dragonfly.fun/feed/archives/o365.html
    基于 containerd 运行时的 Kubernetes 环境搭建 https://dragonfly.fun/archives/kubeadm.html https://dragonfly.fun/archives/kubeadm.html Sat, 23 Apr 2022 18:03:00 +0800 蜻蜓特派员 众说周知,Kubernetes 从 1.24 起就删除了 Dockershim 相关代码,现在整理了一下国内网络环境下使用 containerd 作为运行时的集群搭建步骤

    1. 系统准备

    # 允许 iptables 检查桥接流量
    sudo tee /etc/modules-load.d/containerd.conf << EOF
    overlay
    br_netfilter
    EOF
    
    sudo tee /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables  = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
    # 使设置生效
    sudo modprobe overlay br_netfilter
    sudo sysctl --system
    
    # 禁用虚拟内存
    sudo swapoff -a

    2. 安装 Kubernetes 组件

    2.1 Debian/Ubuntu

    # 安装 containerd
    curl -sL http://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-ce.gpg
    echo "deb http://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
    sudo apt update
    sudo apt install -y containerd.io
    
    # 安装 kubeadm
    curl -sL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg
    echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
    sudo apt update
    sudo apt install -y kubeadm=1.21.14-00 kubectl=1.21.14-00 kubelet=1.21.14-00

    2.2 CentOS

    # 安装 containerd
    sudo curl https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
    sudo yum install -y containerd.io
    sudo systemctl enable containerd
    
    # 安装 kubeadm
    sudo tee /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=0
    gpgcheck=1
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    sudo yum install -y --enablerepo=kubernetes kubeadm-1.21.14 kubelet-1.21.14 kubectl-1.21.14
    sudo systemctl enable kubelet

    2.3 配置容器运行时

    # 配置容器运行时
    sudo tee /etc/containerd/config.toml << EOF
    version = 2
    [plugins."io.containerd.grpc.v1.cri"]
      sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
        runtime_type = "io.containerd.runc.v2"
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
          SystemdCgroup = true
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
        endpoint = ["https://hub-mirror.c.163.com"]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
        endpoint = ["http://registry.lan:5000"]
    EOF
    sudo systemctl restart containerd
    
    # 添加自动填充
    sudo tee /etc/profile.d/kubectl.sh << EOF
    source <(kubectl completion bash)
    source <(crictl completion bash)
    export KUBECONFIG=/etc/kubernetes/admin.conf
    EOF
    
    # 配置 crictl
    sudo tee /etc/crictl.yaml << EOF
    runtime-endpoint: unix:///run/containerd/containerd.sock
    image-endpoint: unix:///run/containerd/containerd.sock
    EOF

    3. 使用 Kubeadm 引导集群

    sudo kubeadm init --kubernetes-version=1.21.14 --token=abcdef.0123456789abcdef \
      --apiserver-advertise-address=$(ip addr show dev eth0 | grep -Po 'inet \K[\d.]+') \
      --cri-socket=unix:///run/containerd/containerd.sock \
      --image-repository=registry.aliyuncs.com/google_containers

    稍等几分钟,K8S 的 Master 节点就启动起来了

    # 其他节点加入集群
    sudo kubeadm join node1.lan:6443 --token=abcdef.0123456789abcdef --discovery-token-unsafe-skip-ca-verification

    3.1 kubernetes 组件安装

    # 链接 kubeconfig
    sudo chmod +r /etc/kubernetes/admin.conf
    
    # 配置网络插件
    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
    
    # 去除污点
    kubectl taint node --all node-role.kubernetes.io/master-
    
    # 安装 Helm
    curl -sL https://get.helm.sh/helm-v3.9.2-linux-amd64.tar.gz | sudo tar zxf - --strip-components=1 -C /usr/local/bin
    
    # 安装 Traefik Ingress Controller
    helm install traefik -n kube-system --repo https://helm.traefik.io/traefik traefik

    3.2 集群清理

    sudo kubeadm reset --cri-socket=unix:///run/containerd/containerd.sock -f
    sudo rm -rf /var/lib/{calico,etcd,kubelet,kubernetes,cni} /etc/cni/net.d /etc/kubernetes /opt/cni/bin/*

    参考资料

    1. 弃用 Dockershim 的常见问题
    2. 生产环境
    ]]>
    0 https://dragonfly.fun/archives/kubeadm.html#comments https://dragonfly.fun/feed/archives/kubeadm.html
    联想笔记本的 Debian 之旅 https://dragonfly.fun/archives/debian.html https://dragonfly.fun/archives/debian.html Sun, 04 Jul 2021 18:42:00 +0800 蜻蜓特派员 Debian 11 Bullseye 已正式发布,借此机会整理了一下关于 Bullseye 在笔记本上的安装记录,遇到的主要问题是:无线网卡驱动、触摸板手势、电源管理

    1. 准备 Debian 安装盘

    首先到 Debian 官网 下载网络安装镜像 debian-11.0.0-amd64-netinst.iso

    • 制作 Ventoy 启动U盘

    Ventoy 的便利性这里不做赘述,下载最新版 Ventoy2Disk 一键制作启动盘
    然后将刚在下载的 ISO 文件拷贝到U盘根目录下面

    • 无线网卡固件

    博主的笔记本是没有有线网卡的,首先需要下载网卡 固件文件 驱动无线网卡,可以根据自己的网卡型号选择不同的固件,博主为了安装黑苹果,已经将笔记本自带的无线网卡更换为 D1830A,此处使用的是博通的固件

    厂商固件文档
    英特尔(Intel)firmware-iwlwifihttps://wiki.debian.org/iwlwifi
    博通(Broadcom)firmware-brcm80211https://wiki.debian.org/brcmfmac
    瑞昱(Realtek)firmware-realtek
    高通(Atheros)firmware-atheros

    使用 ar x firmware-xxx.deb 命令解压得到 data.tar.xz 得到固件压缩包。

    下面使用 Ventoy 文件注入插件 把固件文件注入到安装盘中,
    编辑 U盘中的 ventoy\ventoy.json 为如下内容

    {
        "injection": [{
            "image": "/debian-testing-amd64-netinst.iso",
            "archive": "/firmware-brcm80211.tar.xz"
        }]
    }

    重启电脑按 F12 进入启动选单,选择 EFI USB Device 即可进入 Ventoy 启动界面

    Debian-00-boot.png

    2. Debian 安装

    安装器的语言选择 简体中文

    Debian-01-language.png

    Debian-03-mirrors.png

    2.1 最小化桌面安装

    Debian 可以搭配多种 桌面环境 安装,大多数时候在选择组件时候勾选其中一项桌面环境即可,如果不是折腾党可以跳过此节。

    Debian-04-tasksel.png

    由于通过 tasksel 安装的桌面环境会预安装 浏览器、播放器、libreoffice等组件,虽然可以事后通过 sudo apt purge -y libreoffice? firefox-esr h3v 命令卸载,但是作为重度强迫症患者实在不能忍。

    Debian-05-complete.png

    当安装程序提示完成的时候,不要重启,按 Ctrl+Alt+F2 快捷键输入以下命令,然后安装桌面必要组件以及网络管理器

    mount /dev/pts /target/dev/pts
    chroot /target bash
    
    sudo sed -i 's/bullseye main/bullseye main contrib non-free/g' /etc/apt/sources.list
    sudo sed -i 's/security.debian.org/mirrors.163.com/g' /etc/apt/sources.list
    sudo apt update

    Debian-06-chroot.png

    WiFi 连接

    XFce 桌面环境 sudo apt install -y xfce4 network-manager-gnome fonts-wqy-zenhei

    LXDE 桌面环境 sudo apt install -y lxde-core connman-ui fonts-wqy-zenhei

    LXQt 桌面环境 sudo apt install -y sddm lxqt-core lxqt-admin cmst fonts-wqy-zenhei

    Cinnamon 桌面环境 sudo apt install -y cinnamon-core

    Budgie桌面环境 sudo apt install gdm3 budgie-desktop budgie-network-manager-applet fonts-wqy-zenhei

    安装过程中可以通过 Ctrl+Alt+F2 组合键进入中断, Ctrl+Alt+F1 返回安装界面

    2.2 系统固件配置

    cat > ~/.Xresources << EOF
    Xft.dpi: 130
    EOF
    • 处理 Wifi 显示 “设备未托管” 问题

    修改 /etc/NetworkManager/NetworkManager.confmanaged=false 改为 managed=true

    2.3 配置触摸板多指手势

    LXQt 桌面的用户可以通过开始菜单中的 首选项 -> LxQT 设置 -> 键盘与鼠标 中的 鼠标与触摸板 配置多指手势。但是LXDE 的用户就没有这么方便了,可以通过配置 libinput 的方法达到效果

    运行 sudo apt install -y xserver-xorg-input-libinput 安装 Libinput
    编辑 /usr/share/X11/xorg.conf.d/40-libinput.conf 修改如下内容

    Section "InputClass"
            Identifier "libinput touchpad catchall"
            MatchIsTouchpad "on"
            MatchDevicePath "/dev/input/event*"
            Driver "libinput"
            Option "Tapping" "true"
            Option "NaturalScrolling" "true"
            Option "TapButton1" "1"
            Option "TapButton2" "2"
            Option "TapButton3" "3"
    EndSection

    重启后即可使用触摸板的 轻点、双指右键等功能

    2.4 升级内核

    运行 sudo apt edit-sources 将如下内容添加到最后

    deb http://mirrors.163.com/debian/ bullseye-backports main
    deb-src http://mirrors.163.com/debian/ bullseye-backports main

    安装内核文件

    sudo apt -t bullseye-backports install -y linux-image-amd64
    • 免密 sudo
    echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/90-cloudimg

    3. 应用安装

    3.1 Google Chrome 浏览器

    wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
    sudo apt install -y ./google-chrome-stable_current_amd64.deb

    3.2 良心国产 Linux 应用

    WPS Office for Linux 是由金山软件股份有限公司自主研发的一款办公软件套装,可以实现办公软件最常用的文字、表格、演示等多种功能。具有内存占用低、运行速度快、体积小巧、强大插件平台支持、免费提供海量在线存储空间及文档模板。

    3.3 Visual Studio Code 编辑器

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/microsoft.gpg
    echo "deb [arch=amd64] http://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
    sudo apt install -y code
    • 个性化配置

    选择 File -> Prefernces -> Setting,Window 下的 Title Bar Style 选择为 custom

    • 编辑器字体

    https://packages.debian.org/bullseye/ttf-mscorefonts-installer

    修改 /etc/apt/source.list 增加 contrib

    sudo apt install -y ttf-mscorefonts-installer 

    修改 editor.fontFamilyCourier New

    3.4 开发相关

    sudo curl -sL https://mirrors.163.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
    echo "deb [arch=amd64] http://mirrors.163.com/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker-ce.list
    apt update && apt install -y docker-ce

    3.5 使用 Deepin Wine 安装 Windows 软件

    • 修复 Debian 11 依赖

    即将推出的 Debian Bullseye 中,由于 deepin-wine-plugin-virtual 所依赖的 python-dbuspython-gobject 两个基于 Python2.7 的包被砍掉了,所以没办法像 Debian 10 一样简单的补充一个 udis86 包就能解决依赖问题。Debian 10 用户可以只看下一节的 安装 Wine
    此处采用了重新打包两个 deb 文件,将依赖重定向到 Python3 版本的方案

    mkdir -p python-dbus/DEBIAN python-gobject/DEBIAN
    
    cat > python-dbus/DEBIAN/control << EOF
    Package: python-dbus
    Version: 1.2.16-5
    Architecture: all
    Maintainer: Debian GNOME Maintainers
    Depends: python3-dbus
    Section: python
    Priority: optional
    Description: simple interprocess messaging system (Python interface)
    EOF
    
    cat > python-gobject/DEBIAN/control << EOF
    Package: python-gobject
    Version: 3.30.4-1
    Architecture: all
    Maintainer: Debian GNOME Maintainers
    Depends: python3-gi
    Section: python
    Priority: optional
    Description: Python 3 bindings for gobject-introspection libraries
    EOF
    
    dpkg -b python-dbus python-dbus.deb
    dpkg -b python-gobject python-gobject.deb
    
    sudo apt install -y ./python-*.deb
    • 安装 Wine
    # 添加 Deepin 商店源
    wget http://mirrors.163.com/deepin/pool/main/d/deepin-keyring/deepin-keyring_2021.06.07-1_all.deb
    sudo apt install -y ./deepin-keyring_*.deb
    echo "deb https://com-store-packages.uniontech.com/appstore eagle appstore" | sudo tee /etc/apt/sources.list.d/appstore.list
    
    # 安装 x86 反汇编引擎
    sudo dpkg --add-architecture i386
    sudo apt update
    wget http://mirrors.163.com/deepin/pool/non-free/u/udis86/udis86_1.72-4_i386.deb
    sudo apt install -y ./udis86_*.deb
    
    # 安装 Deepin-Wine5
    sudo apt install -y deepin-wine-plugin-virtual
    
    # 处理桌面快捷方式及图标
    sudo tee "/etc/profile.d/deepin.sh" >/dev/null << "EOF"
    XDG_DATA_DIRS=${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
    for deepin_dir in /opt/apps/*/entries; do
        if [ -d "$deepin_dir/applications" ]; then
            XDG_DATA_DIRS="$XDG_DATA_DIRS:$deepin_dir"
        fi
    done
    export XDG_DATA_DIRS
    EOF
    • 安装 QQ 微信
    sudo apt install -y com.qq.im.deepin com.qq.weixin.deepin
    # 调整DPI
    env WINEPREFIX="$HOME/.deepinwine/Deepin-QQ" $HOME/.deepinwine/deepin-wine5/bin/winecfg 
    env WINEPREFIX="$HOME/.deepinwine/Deepin-WeChat" /opt/deepin-wine6-stable/bin/winecfg
    获取 deb 下载连接 apt install -y --print-uris $PACKAGE | cut -f 2 -d \' | grep \.deb
    ]]>
    1 https://dragonfly.fun/archives/debian.html#comments https://dragonfly.fun/feed/archives/debian.html
    Windows 本地快速启动 K8S 集群 https://dragonfly.fun/archives/k3d.html https://dragonfly.fun/archives/k3d.html Thu, 17 Jun 2021 11:43:00 +0800 蜻蜓特派员 Kubernetes (以下简称 K8S) 是 Docker 推出之后最热门的容器编排技术,然而想在本地将 K8S 跑起来,并不像我们想象的那么容易。存在以下几点「问题」:

    • 网络:K8S 里面的一些镜像在国内很难将其 pull 下来,当然这可以通过代理、镜像站等方式解决。
    • 资源:在内存资源不这么充裕的本地开发环境,去部署一个 K8S 集群,这无疑不是一个明智的选择。

    那么有没有什么方案可以更优雅更轻量更快速搭建一个 K8S 集群呢?答案就是 K3D

    目前主流的本地 k8s 运行方式有很多

    • minikube 仅支持单节点,但是我们期望可以跑一个集群的方式,方便我们去 Mock 节点宕机之后 K8S 自动调度的 case ✖️
    • microk8s 是 Ubuntu 生态里提供的一个可以单机运行的 k8s 版本,配合 Ubuntu 生态的 multipass,可以模拟多节点,但是在本就资源紧张的本地环境,通过虚拟机的方式模拟多节点,显然并不是我想要的 ✖️
    • kind 是一个基于 Docker 构建 Kubernetes 集群的工具,Kubernetes in Docker ✔️
    • k3d 是一个可以让 k3s 运行在 Docker 中的工具,相比于 kind ,启动速度更快,占用资源更小,也是本文采取的方案 ✅
    关于 k3d 以及 kind 的对比,可以参考 K3d vs Kind 谁更适合本地研发

    1. 什么是 K3D

    k3s 是 Rancher 公司推出非常快速且轻量级的完全兼容的 Kubernetes 发行版(CNCF 认证)
    k3d 是一个可以让 k3s 运行在 Docker 中的工具,它提供了一个简单的 CLI 来创建、运行和删除具有 1 到 N 个节点的 Kubernetes 集群
    • 最大程度减轻了外部依赖性,仅需要 kernel 和 cgroup 挂载。
    • 占用资源比完整版的 K8S 少了不少
    • 内置了很多组件,开箱即用,而且每一个组件都是可替换的
    详情参考官方文档 什么是 K3s?

    2. 通过 docker-machine 启动 Docker 服务

    官方提供的 Docker Desktop 是基于 WSL2 实现的,需要开启 Hyper-V 功能。 这样会使整个 Windows 都跑在虚拟机中,导致某些虚拟化相关的应用不正常 (比如某些模拟器),而且内存占用也不太可控。
    本文采用了基于 boot2docker 的方式运行 Docker 服务,定制性更灵活一些。

    2.1 安装必备工

    这里强烈推荐使用 Git for Windows 自带的 MinGW 命令行SHELL,使开发体验更加贴近与 Linux。以下操作均在 Git Bash 中进行

    首先需要安装虚拟机软件 VirtualBox
    然后需要下载如下命令工具并添加到环境变量 PATH

    本文中上面这些工具下载到了 D:\Docker\bin,并将 D:\Docker\bin 添加到环境变量中
    同时也配置了如下环境变量,将虚拟机文件的储存位置修改为 D 盘,避免占用系统空间
    • MACHINE_STORAGE_PATH=D:\Docker

    ~/.profile 文件添加如下内容配置命令行自动补全

    sudo tee /etc/profile.d/kubectl.sh << EOF
    source <(kubectl completion bash)
    source <(k3d completion bash)
    

    2.2 使用 boot2docker 启动 Docker 引擎

    下面创建了一个磁盘大小为 60000 MB,CPU 使用 2 个核心的虚拟机

    docker-machine create --virtualbox-cpu-count 2 \
     --engine-registry-mirror https://hub-mirror.c.163.com \
     --virtualbox-disk-size 60000 --virtualbox-memory 2048 \
     --virtualbox-no-share default
    # 每次使用 docker 时都需要执行如下命令
    eval $(docker-machine env --shell bash default)

    稍等片刻,当出现以下日志时,说明 Docker 服务已启动完成

    docker.png

    第一次创建 Docker 实例会下载 boot2docker.iso 作为启动镜像,国内用户可以通过添加参数 --virtualbox-boot2docker-url https://github.com.cnpmjs.org/dragonflylee/boot2docker/releases/latest/download/boot2docker.iso 加速镜像下载

    3 使用 k3d 启动 k3s 集群

    3.1 创建 k3s 节点

    首先我们尝试创建包含主节点和容器仓库的集群

    eval $(docker-machine env --shell bash)
    k3d cluster create --api-port 6443 \
      -p 0.0.0.0:80:80@loadbalancer \
      --k3s-arg "--disable=traefik@server:0" \
      --registry-create registry:0.0.0.0:5000

    当出现下面的日志时,k3s 集群就创建成功了

    k3d.png

    此时,我们按照日志提示,运行 kubectl cluster-info 查看下当前集群的信息

    运行 kubectl get pod -o wide -A 命令,当所有 Pod 的状态都是 Running 或者 Done 的时候,集群就初始化完毕了

    • 如果遇到 cgroups: cannot find cgroup mount destination: unknown. 的错误提示,请执行如下命令
    docker-machine ssh default sudo sh - << EOF
    mkdir /sys/fs/cgroup/systemd
    mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
    EOF

    3.2 安装 K3S 组件

    • Helm 是 Kubernetes 的首选包管理工具

    而 K3s 不需要任何特殊的配置就可以使用 Helm 命令行工具,如下命令使用 Helm CRD 部署 traefik 服务

    kubectl create -f - << EOF
    apiVersion: helm.cattle.io/v1
    kind: HelmChart
    metadata:
      name: traefik
      namespace: kube-system
    spec:
      chart: traefik
      repo: https://helm.traefik.io/traefik
      valuesContent: |-
        ports:
          websecure:
            expose: false
    EOF

    下面的例子是使用 Traefik CRD 开启内置的仪表盘

    kubectl apply -f - << EOF
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: traefik-dashboard
      namespace: kube-system
    spec:
      entryPoints:
      - web
      routes:
      - match: Host(\`traefik.domain.com\`)
        kind: Rule
        services:
        - name: api@internal
          kind: TraefikService
    EOF
    更多配置参考 https://docs.rancher.cn/docs/k3s/helm/_index

    4. 使用 KinD 启动 k8s 集群

    KinD 顾名思义 Kubernetes in Docker,是一个使用 Docker 容器在本地运行 Kubernetes 集群的工具。相比 k3d,Kind 更贴近原生 Kubernetes,适合用于开发测试 Kubernetes 原生组件。

    4.1 安装 KinD 命令行工具

    首先下载最新版本的 KinD https://kind.sigs.k8s.io/dl/latest/kind-windows-amd64

    kind create cluster --image kindest/node:v1.21.14 --config=- << EOF
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    networking:
      apiServerAddress: "$(docker-machine ip)"
      apiServerPort: 6443
    nodes:
    - role: control-plane
      extraPortMappings:
      - containerPort: 80
        hostPort: 80
    kubeadmConfigPatches:
    - |
      kind: ClusterConfiguration
      etcd:
        local:
          extraArgs:
            listen-metrics-urls: http://0.0.0.0:2381
      controllerManager:
        extraArgs:
          bind-address: 0.0.0.0
      scheduler:
        extraArgs:
          bind-address: 0.0.0.0
    containerdConfigPatches:
    - |-
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
        endpoint = ["https://hub-mirror.c.163.com"]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
        endpoint = ["http://registry:5000"]
    EOF
    参数描述参考 https://kind.sigs.k8s.io/docs/user/quick-start#configuring-your-kind-cluster

    4.2 使用 Helm 部署 Ingress

    https://docs.nginx.com/nginx-ingress-controller/
    # 生成测试用 SSL 证书
    openssl req -x509 -nodes -newkey rsa:4096 -keyout tls.key -out tls.crt -days 3650 -subj "/CN=kube"
    kubectl create secret tls ingress-wildcard-tls -n kube-system --cert=tls.crt --key=tls.key
    
    # 安装控制器
    helm install nginx -n kube-system --repo https://helm.nginx.com/stable nginx-ingress --values - << EOF
    controller:
      image:
        tag: latest-alpine
      service:
        create: false
      controller:
        hostNetwork: true
      setAsDefaultIngress: true
    EOF
    helm install traefik -n kube-system --repo https://helm.traefik.io/traefik traefik --values - << EOF
    service:
      enabled: false
    ports:
      web:
        hostPort: 80
      websecure:
        expose: false
    deployment:
      kind: DaemonSet
    ingressClass:
      enabled: true
      isDefaultClass: true
    EOF

    4.3 部署 K8S 控制台

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/alternative.yaml
    # 添加 ingress 路由 
    kubectl create ing -n kubernetes-dashboard dashboard --rule="domain.com/*=kubernetes-dashboard:80,tls"
    # 添加用户权限
    kubectl create serviceaccount admin-user -n kubernetes-dashboard 
    kubectl create clusterrolebinding admin-user --serviceaccount=kubernetes-dashboard:admin-user --clusterrole=cluster-admin
    # 获取 Token
    kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

    参考文档:

    ]]>
    0 https://dragonfly.fun/archives/k3d.html#comments https://dragonfly.fun/feed/archives/k3d.html
    无损制作 Ventoy 启动盘 https://dragonfly.fun/archives/ventoy.html https://dragonfly.fun/archives/ventoy.html Mon, 24 May 2021 02:27:00 +0800 蜻蜓特派员 Ventoy 是一个制作可启动U盘的开源工具。
    无需反复地格式化U盘,你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的文件拷贝到U盘里面就可以启动了,无需其他操作。

    官方的制作程序 Ventoy2Disk 安装时磁盘将会被格式化,下面是非官方的无损安装方法
    数据无价,谨慎操作,此方法只针对 MBR 分区表格式。如果你不了解这些分区表格式,建议备份数据后使用官方格式化的安装方法

    参考文档 https://www.ventoy.net/cn/doc_disk_layout.html

    首先需要下载 DiskGenius 进行磁盘分区操作

    1.在待修改磁盘的第一个分区上点击鼠标右键,选择 调整分区大小 如下图

    DG1.png

    • 起始扇区号 填写 2048
    • 分区后部的空间 分配至少 32MB 的空间

    2.在第一个分区后面的空闲空间创建新分区

    • 分区类型 选择 主分区
    • 文件系统类型 选择 EFI System partition
    • 分区大小 输入 32MB
    • 对齐到 4096扇区

    DG2.png

    四项必须符合,缺一不可

    3.重复第二步调整第一个分区的大小, 将 分区后部的空间 改为 0

    DG3.png

    4.运行 Ventoy2Disk 主程序,此时磁盘分区已被 Ventoy 识别,版本号显示 ?

    DG4.png

    点击 升级 按钮,即可完成 Ventoy 的无损安装!

    ]]>
    2 https://dragonfly.fun/archives/ventoy.html#comments https://dragonfly.fun/feed/archives/ventoy.html
    爱奇艺Win10 屏蔽广告 Hosts https://dragonfly.fun/archives/iqiyi.html https://dragonfly.fun/archives/iqiyi.html Tue, 11 May 2021 22:58:00 +0800 蜻蜓特派员 爱奇艺Win10版 https://www.microsoft.com/store/productId/9NBLGGH5WXNW

    Hosts 加入如下内容即可屏蔽广告

    0.0.0.0    api.cupid.iqiyi.com t7z.cupid.iqiyi.com
    ]]>
    1 https://dragonfly.fun/archives/iqiyi.html#comments https://dragonfly.fun/feed/archives/iqiyi.html