新项目用rust, 新代码也用rust

今天在Hacker New上看到了一篇称赞rust的文章Writing New Code in Rust Is a Win for All of Us。 原文内容就不贴出来了,maillist的内容一般都可以活的很久,随时可以去阅读。 虽然我很喜欢rust, 甚至从golang转了rust开发。 但是我没有过任何内核开发的经验,而且具体到C/C++语言我也只有大学的理论,没有实际的工作经验。 我只是一个一般的linux用户,和内核的交集只有内核升级以及编译裁剪内核,所以我没有和这篇文章产生强烈共鸣。 Gemini 我使用gemini总结了一下,存挡,看什么时候能和这篇文章共鸣。 这封邮件来自 rust-for-linux 邮件列表,讨论了在 Linux 内核中使用 Rust 语言的可能性。 Greg KH (Greg Kroah-Hartman) 是一位著名的 Linux 内核开发者和维护者。 他以在 staging 子系统、USB 子系统和驱动核心方面的工作而闻名。 他是内核社区中非常有影响力的人物,也是稳定内核版本的维护者。他的意见非常重要。 在这封邮件中,他强烈主张在新内核代码/驱动程序中采用 Rust 语言。 他指出,Rust 可以防止常见的 C 语言错误,例如内存覆盖、释放后使用错误以及错误处理问题。 他认为,使用 Rust 编写新代码将使开发人员能够专注于更复杂的错误,并创建更安全、更强大的 API。 Boqun Feng: 一位内核开发人员,他发起了这个特定的讨论主题,他对 Rust 内核策略提出了担忧。 他最初的电子邮件(未显示)可能质疑了采用 Rust 的明智性或可行性。 H. Peter Anvin (hpa): 另一位长期从事内核开发的开发人员,以其在 x86 架构和启动过程方面的工作而闻名。 他参与了关于底层内核细节的讨论。在显示的片段中,他提出 C++ 可能比 Rust 更渐进的方法,因为它可能更直接地改进现有的 C 代码。 Miguel Ojeda: 他似乎是 Rust for Linux 项目中最活跃的开发人员之一。他很可能完成了 Rust 绑定的很多工作。 Christoph Hellwig: 一位以其在存储和内存管理方面的工作而闻名的内核开发人员。他参与了关于性能和核心内核基础设施的讨论。 邮件还强调: 不断努力改进现有 C 代码的重要性。 Rust 在改进 API 设计和安全性方面的潜力。 开发人员为 Rust 集成做出贡献的意愿。 总的来说,这封邮件提出了一个令人信服的理由, 说明为什么应该在 Linux 内核中采用 Rust,强调了它在提高代码质量、安全性和可维护性方面的潜力。Greg KH 的支持是这次讨论中的一个重要因素。 ...

February 21, 2025 · datewu

socat工具

众所周知kubenetest的端口转发功能kubectl port-forward非常实用,可以提高开发人员的debug效率。 其实kubectl port-forward的底层脏活累活都是socat命令在做,kubectl只能算是一个代理商。 socat 端口转发 socat tcp-listen:58812,reuseaddr,fork tcp:localhost:8000把58812端口的流量转发到 8000上。 1 2 3 4 5 6 7 8 9 10 bash-5.1# python3 -m http.server & bash-5.1# socat tcp-listen:58812,reuseaddr,fork tcp:localhost:8000 & bash-5.1# curl -I localhost:58812 HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.10.3 Date: Thu, 14 Apr 2022 03:19:15 GMT Content-type: text/html; charset=utf-8 Content-Length: 336 从而使得原来无法访问的 localhost:8000端口的服务,现在可以通过*:58812访问到了。 1 2 3 4 5 6 7 bash-5.1# netstat -nlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:58812 0.0.0.0:* LISTEN 10/socat tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 31/python3 Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path 其他 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ➜ ~ tldr socat socat Multipurpose relay (SOcket CAT). - Listen to a port, wait for an incoming connection and transfer data to STDIO: socat - TCP-LISTEN:8080,fork - Create a connection to a host and port, transfer data in STDIO to connected host: socat - TCP4:www.example.com:80 - Forward incoming data of a local port to another host and port: socat TCP-LISTEN:80,fork TCP4:www.example.com:80 语法 man 手册 ...

April 14, 2020 · datewu

容器PID

架构部的同事问了我两个问题: 宿主机上有个进程很耗 cpu,怎么判断它是不是某个容器的进程; 如果它是跑在容器里,怎么查到是哪个容器(container id); 解决方案 有两种方法来解决上面两个问题: cgroup 通过查看pid的cgroup是否含有 slice信息来判断是否是容器进程: 主机进程 cgroup 直接运行在宿主机主的进程的cgroup是没有slice信息的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@deoops ~]# cat /proc/1/cgroup 11:perf_event:/ 10:memory:/ 9:devices:/ 8:cpuacct,cpu:/ 7:cpuset:/ 6:hugetlb:/ 5:blkio:/ 4:net_prio,net_cls:/ 3:freezer:/ 2:pids:/ 1:name=systemd:/ [root@deoops ~]# cat /proc/19/cgroup 11:perf_event:/ 10:memory:/ 9:devices:/ 8:cpuacct,cpu:/ 7:cpuset:/ 6:hugetlb:/ 5:blkio:/ 4:net_prio,net_cls:/ 3:freezer:/ 2:pids:/ 1:name=systemd:/ k8s pod进程 cgroup 在宿主机上看跑在容器进程的cgroup是可以看到slice信息的: ...

March 13, 2020 · datewu

挂载硬盘

update: more user friendly 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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #bin/bash mustBeRoot() { if [ "$(id -u)" != "0" ]; then echo "只有root用户才能运行" 1>&2 echo "当前登录用户`whoami`" exit 1 fi } # 数据盘挂载 checkAndMountDataDisk() { echo "选择数据盘/分区 :" fdisk -l | grep /dev | grep G | cut -f 1 -d , echo " " read -p "请输入硬盘/分区 名:/dev/" -r disk_name disk_id=`blkid | grep $disk_name` if [ $? -ne 0 ];then echo "获取硬盘/分区 $disk_name uuid失败,请检查名称是否准确" exit 1 fi disk_path=`echo $disk_id | cut -f 1 -d ':' ` echo "已选择 $disk_path" disk_uuid=`blkid $disk_path | cut -f 2 -d '"' ` disk_info=`lsblk -f $disk_path | grep $disk_uuid ` if [ $? -ne 0 ];then echo "获取硬盘/分区 $disk_path 详细信息失败,请检查名称是否正确" exit 1 fi fs_type=`echo $disk_info | cut -f 2 -d ' '` if [ $fs_type != 'ext4' ];then echo "硬盘文件系统格式不是ext4。" read -p "是否格式化为 ext4? 输入 y 同意格式化" -r format_ext4 if [ $format_ext4 != 'y' ];then echo "未格式化 $disk_path 文件系统格式,退出安装脚本。" exit 1 fi echo "即将格式化 $disk_path 文件系统格式...." mkfs.ext4 $disk_path fi if [ -d "$1" ];then echo "数据盘挂载点/data目录已存在" else echo "创建数据盘挂载点/data目录" mkdir $1 fi mount UUID=$disk_uuid $1 echo "UUID=$disk_uuid $1 ext4 defaults 0 0" >> /etc/fstab echo "硬盘挂载成功" } checkDataMountpoint() { echo '挂载数据盘' grep "$1" /etc/fstab | grep ext4 if [ $? -ne 0 ];then checkAndMountDataDisk else echo '数据盘已挂载' mount -a fi cpAndUntar } mustBeRoot checkDataMountpoint ${1-/data} lsblk 首先使用lsblk查看当前系统硬盘挂载的情况 ...

October 18, 2019 · datewu

Systemd配置问题

问题 用 kubeadm 部署 kubernetes 集群,启动kubelet服务后,kubelet daemon 会认为 /etc/sysconfig/kubelet内容的优先级更高, 覆盖KUBELET_EXTRA_ARGS环境变量--pod-infra-container-image的配置内容。 分析 kubelet.service文件 首先查看/etc/systemd/system/kubelet.service文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 # cat /etc/systemd/system/kubelet.service [Unit] Description=kubelet: The Kubernetes Node Agent Documentation=https://kubernetes.io/docs/ [Service] ExecStart=/usr/bin/kubelet Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.target 注意第5行的ExecStart指令为/usr/bin/kubelet kubelet.service.d 目录 然后查看kubelet服务的配置目录/etc/systemd/system/kubelet.service.d/,注意 kubeadm会在这里创建一个10-kubeadm.conf文件来配置kubelet启动方式(参数)。 1 2 3 4 5 6 7 8 9 10 11 12 13 # cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # Note: This dropin only works with kubeadm and kubelet v1.11+ [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile=-/etc/sysconfig/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS 配置文件的load的顺序是以字母顺序排列的, 如果我们也在这里创建了kubelet的配置文件,比如20-my-kubelet.conf,10-*会先被读取,20-*其次。 ...

May 11, 2019 · datewu

无法创建macvlan设备

最近给客户调试 macvlan network时,遇到了Linux kernel 报错 SIOCSIFFKAGS: Device or resource busy. 无法创建网络device。 结果长时间的debug分析, 发现问题是高并发压测 创建和释放macvlan device的时候,设备的mac address出现了重复。 ps:这个问题只出现在 macvlannetwork 的设备中。 可以用下面的shell脚本来复现macvlan Device or resource busy的错误: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash function setup { i=$1 ip l a m$i address 00:40:2F:4D:5E:6F link eth0 type macvlan mode bridge ip netns add ns$i ip l set m$i netns ns$i sleep 1 ip netns exec ns$i ifconfig m$i 10.0.0.$((i+1))/24 up echo $? } echo cleaning up ip -all netns d echo creating netsnses for i in `seq $1`; do echo $i.... #setup $i & setup $i done 如果把 macvlan 类型改为 dummy (上面脚本第5行 type macvlan 改为 type dummy) ,即使 MAC address 重复也不会引发kernel 报错。 ...

March 7, 2019 · datewu

tcp性能调优

我们一般会调整内核tcp参数以提高web服务器(比如ngin)的性能。 sysctl 加载Linux 内核配置 1 sysctl -p /etc/sysctl.d/xxx-xxx.conf meat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # /etc/sysctl.d/00-network.conf # Receive Queue Size per CPU Core, number of packets # Example server: 8 cores net.core.netdev_max_backlog = 4096 # SYN Backlog Queue, number of half-open connections net.ipv4.tcp_max_syn_backlog = 32768 # Accept Queue Limit, maximum number of established # connections waiting for accept() per listener. net.core.somaxconn = 65535 # Maximum number of SYN and SYN+ACK retries before # packet expires. net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 # Timeout in seconds to close client connections in # TIME_WAIT after receiving FIN packet. net.ipv4.tcp_fin_timeout = 5 # Disable SYN cookie flood protection net.ipv4.tcp_syncookies = 0 # Maximum number of threads system can have, total. # Commented, may not be needed. See user limits. #kernel.threads-max = 3261780 # Maximum number of file descriptors system can have, total. # Commented, may not be needed. See user limits. #fs.file-max = 3261780

April 5, 2016 · datewu

刷机HG255d

交叉编译 在ubuntu下安装编译工具(gcc,xmllib,cmake, git 等); git克隆openwrt仓库:git clone git://git.openwrt.org/14.07/openwrt.git; 自定义kernel target: 源代码做两处修改 : 1 2 3 target/linux/ramips/image/Makefile /base-files/lib/ramips.sh target/linux/ramips/base-files/lib/preinit/06_set_iface_mac 在弹出的make menuconfig 图像界面中选择cpu型号; 打开vpn开始编译固件。 结果 交叉编译完成后,根据上一步选择的安装包的多少,bin目录下会生成对应的opkg包,和固件: factory文件,可以称作底包; sysupgrade文件,可以称作升级包; web/uboot烧录刷机 接通路由器电源,按住WPS按钮不放,然后按电源键开机, power LED快闪即松开WPS键,此时路由器已加入升级模式; 访问路由器web地址(如:http://192.168.1.1), 按照web界面提示选取factory文件完成固件烧录刷机; ssh/ftp 烧录 可以直接执行sysupgrade命令烧录估计: 1 2 3 4 5 ssh-keygen -f "/home/openwrt-qqm/.ssh/known_hosts" -R 192.168.1.1 #可以省略此条命令 scp xxxxxx-squashfs-sysupgrade.bin [email protected]:/tmp/ ssh [email protected] cd /tmp/ sysupgrade -n xxxxxxxxxxx-sysupgrade.bin opkg 烧录完系统固件后,可以使用opkg安装软件包,比如china-dns, shadowsocks, openvpn,等等。

March 17, 2015 · datewu