共享内核的“副作用”:用ebpf解析Docker与K8s中的时间管理机制

背景 最近要上线一个应用,需要修改时间相关的配置 照常打包上线后,在容器内使用date -s 2077-08-02修改时间 发现宿主机的TLS握手失败,宿主机的时间也被修改了 这个时候才想起容器是共享宿主机内核的,并且是共享同一个内核时钟的 我们起个Debian容器实验下(需要开privileged模式) 1 docker run -d --name debian debian:12-slim --priviliage sleep infinity k8s的Pod也是类似的,不过我们这里为了方便就用Docker了 1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: v1 kind: Pod metadata: name: debian-privileged-pod spec: containers: - name: debian-container image: debian:12-slim securityContext: # 设置为 true,等同于 Docker 的 --privileged 标志 privileged: true command: ["sleep"] args: ["infinity"] ...

July 10, 2025 · 9 min · 1709 words · LOTU$
A terminal showing Gemini CLI

Gemini CLI初体验:从入门到进阶

Gemini CLI简介 Gemini CLI是Google推出的命令行界面工具,对标Claude Code,不过前者是开源的,这也让我们得以复现它的功能。 他提供一个TUI界面,可以在终端中与Gemini AI进行交互,支持代码生成、调试和文档编写等功能。 安装 1 2 npm install -g @google/gemini-cli gemini 安装好后默认界面是这样的 这里我选择默认主题 Enter后会进入主界面,这里我选择使用Google账户登录,他就会弹出浏览器窗口来进行登录。 这时候我遇到了一个问题,提示我需要设置Google Cloud认证。 查阅了资料之后发现需要去到Google Cloud配置API 大概率是因为之前用过Google Cloud 进入后,选择启用Gemini for Google Cloud,然后点击管理 在这之后,还需要访问Google Cloud控制台来获取到项目 ID 在这里,找到项目ID,我这里是gen-lang-client-19890604 然后在终端环境中加入以下命令来设置环境变量: 1 export GOOGLE_CLOUD_PROJECT=gen-lang-client-19890604 Windows用户可以使用以下命令: 1 setx GOOGLE_CLOUD_PROJECT="gen-lang-client-19890604" 然后重启终端就可以登录了,如果还不能登录,或者是提示网络不行,可以开启Clash的TUN模式,这样终端也可以走代理。 初步使用 这里我让他根据代码生成一个README文件 他很快就生成好 选择always allow 看着效果还不错 接入MCP后如果能接入Github Issue来改文件就更好了 进阶技巧 使用 /compress可以压缩上下文,让他不会超过大模型的context限制 1 /compress 可以直接在终端中输入命令来执行操作,比如: 1 ls | gemini 或者 ...

June 28, 2025 · 1 min · 191 words · LOTU$

Ansible扫描Openvpn客户端

实习中遇到个问题,现有的openvpn配置很乱 需要重新梳理客户端和服务端的对应关系。于是写了个Ansible脚本来扫描客户端配置文件 提取出所有Client的配置文件,并生成一个对应关系报告。 已知现在机器上面所有的OpenVPN客户端配置文件都在/etc/openvpn/client/目录下。 ansible-playbook的脚本文件如下(因为我这用的服务器的ansible比较老,所以格式可能不太一样): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 --- - name: 第 1 步 - 从 OpenVPN 客户端配置中发现公网 IP 及其文件名 hosts: all become: yes gather_facts: no vars: # 定义要扫描的 OpenVPN 客户端配置目录 openvpn_client_dir: /etc/openvpn/client tasks: - name: "扫描 {{ openvpn_client_dir }} 目录下的配置文件 (递归搜索并关联文件名)" shell: > grep -rHE '^remote\s+' {{ openvpn_client_dir }} 2>/dev/null | grep -vE ':remote\s+(192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|127\.|localhost)' | sed -E 's#^.*/([^:]+):remote[[:space:]]+([^ ]+).*#\2--->\1#' | sort -u || true # 这个 shell 命令执行以下操作: # 1. `grep -rHE '^remote\s+'`: 递归搜索并打印“文件名:匹配行”。 # - `-H`: 强制打印文件名。 # 2. `grep -vE ':remote\s+(私网IP正则)'`: 过滤掉包含私网IP的行。 # 3. `sed -E 's#...#...#'`: 使用正则表达式重新格式化输出。 # - 它会将 "路径/文件名.ovpn:remote 1.2.3.4 ..." 格式化为 "1.2.3.4--->文件名.ovpn" # 4. `sort -u`: 对最终结果进行排序和去重。 # 5. `|| true`: 确保在没有找到文件或匹配项时,任务不会失败。 register: public_ips_found changed_when: false - name: "为找到的 'IP--->文件名' 设置变量" set_fact: openvpn_public_ips: "{{ public_ips_found.stdout_lines }}" - name: 第 2 步 - 生成汇总报告 hosts: localhost connection: local gather_facts: no become: no tasks: - name: "汇总所有主机上发现的'IP--->文件名'映射" set_fact: all_public_ips: "{{ all_public_ips | default([]) + hostvars[item]['openvpn_public_ips'] }}" loop: "{{ groups['all'] }}" when: hostvars[item]['openvpn_public_ips'] is defined and hostvars[item]['openvpn_public_ips'] | length > 0 - name: "将唯一的'IP--->文件名'列表写入本地文件" copy: content: "{{ all_public_ips | unique | join('\n') }}\n" dest: "./result_public_ip_mapping.txt" when: all_public_ips is defined and all_public_ips | length > 0 把这个ansible脚本保存为 scan_openvpn_ips.yml。 ...

June 11, 2025 · 2 min · 311 words · LOTU$

记一次A800显卡服务器掉卡排查

前几天突然出现服务器掉卡,本来有8张A800显卡的,从8张掉到6张,后面只掉剩4张了,nvidis-smi不显示那四张显卡,lspci |grep -i nvidia却又能识别到所有的八张卡 它本应该是这样的: 现在是这样: 于是进行排查 dmesg显示是NVRM出了问题 重启服务器后,华硕服务器主板显示了B9错误,也就是表示主板出现了问题,让人感到神奇 再次重启华硕主板又显示AE错误码,只能进行硬重启(拔电源 开机后先查看下系统内核日志 使用下面命令可以查看内核日志十天内中nvidia显卡的报错 1 journalctl --since `date -d "10 days ago" "+%Y-%m-%d"`|grep Xid 从上面看到报的是Xid:140,官方文档对140报错的解读 使用nvidia-smi -q获取更加详细的关于显卡的信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 (py310) ps@ps:~$ nvidia-smi -q ==============NVSMI LOG============== GPU 00000000:20:00.0 Product Name : NVIDIA A800 80GB PCIe Product Brand : NVIDIA Product Architecture : Ampere Display Mode : Enabled ...... Aggregate SRAM Correctable : 0 SRAM Uncorrectable Parity : 0 SRAM Uncorrectable SEC-DED : 0 DRAM Correctable : 151 DRAM Uncorrectable : 439 SRAM Threshold Exceeded : No 如果你不想看这么一长串的输出,可以直接用下面这个命令 ...

May 15, 2025 · 1 min · 109 words · LOTU$

Claude MCP初体验

关于MCP mcp是什么?它解决了什么? 按照anthropic的说法,MCP解决了数据的隔离,提供了一个通用的开放标准,使得AI系统访问数据更加容易 我有这么一个使用场景: 我在一名叫luogu的文件夹里面写了很多算法题,想要总结到特定文件夹的一个特定markdown文件里面,我可以使用mcp来解决这个问题吗? 首先需要解决的就是让mcp可以做到读取文件,然后写入文件 动手构建MCP 开始动手写一个mcp的sevrer 按照官方的流程,需要安装uv(一个由Rust编写的python包管理客户端) 我是windows系统,所以用下面的命令 1 powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 如果是macos或者linux系统,可以用下面的命令 1 curl -LsSf https://astral.sh/uv/install.sh | sh 之后进行项目的初始化,我将这个sever命名为algomd 1 2 3 4 5 6 7 8 9 10 11 12 # Create a new directory for our project uv init algomd # Create virtual environment and activate it uv venv source .venv/bin/activate # Install dependencies uv add "mcp[cli]" # Create our server file new-item algomd.py 具体server端的开发可以按照这个MCP官方文档 ...

March 19, 2025 · 5 min · 936 words · LOTU$