将Ubuntu20.04变为一个路由器

前言 本文记录的是作者手头上的设备搭建情况,不同的芯片架构、系统版本搭建情况可能有所不同。以下是设备情况介绍 芯片架构: aarch64 Linux内核版本: 4.19.232 发行版: Ubuntu20.04 设备路由设置 修改内核参数 vi /etc/sysctl.conf net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.all.accept_ra = 2 修改物理网口名称 在ubuntu中用ifconfig查看网口信息有可能有enP1p17s0这种网口,想要修改为规律的ethx可以按下面的方式做 udevadm info -a -p /sys/class/net/eth0 # 可以通过这个命令查看网口属性以编写下面的配置 vi /etc/udev/rules.d/70-persistent-net.rules SUBSYSTEM=="net", ACTION=="add", SUBSYSTEMS=="platform", KERNELS=="fe2a0000.ethernet", NAME="eth0" SUBSYSTEM=="net", ACTION=="add", SUBSYSTEMS=="platform", KERNELS=="fe010000.ethernet", NAME="eth1" SUBSYSTEM=="net", ACTION=="add", SUBSYSTEMS=="pci", KERNELS=="0001:11:00.0", NAME="eth2" SUBSYSTEM=="net", ACTION=="add", SUBSYSTEMS=="pci", KERNELS=="0002:21:00.0", NAME="eth3" SUBSYSTEM=="net", ACTION=="add", SUBSYSTEMS=="pci", KERNELS=="0000:01:00.0", NAME="eth4" 这里可以关注SUBSYSTEMS有platform、pci两种值但实际还有更多,看具体以太网口的属性。KERNELS代表设备硬件位置,可以通过udevadm命令来查看。 设置lan口、wan口 以下设置为eth0为wan0口,其他为lan口。 vi /etc/network/interfaces.d/wan auto wan0 iface wan0 inet dhcp bridge_ports eth0 metric 30 vi /etc/network/interfaces.d/lan auto lan iface lan inet static bridge_ports eth1 eth2 eth3 eth4 address 192.168.1.1 netmask 255.255.255.0 监听wan口拔插 在wan口插入网线时需要自动启动dhcp clinet获取ip地址并设置route,在wan口拔出网线时需要清空wan口的ip并更新route。默认情况下ubuntu并不会做这些事情 ...

June 6, 2025 · 1 min · zhumouren

UNIX环境高级编程-进程操作

1. 进程环境 #include <stdlib.h> void exit(int status); exit(0) 与 return 0 是等价的。 2. 进程标识和创建子进程 每个进程都有一个非负整型表示的唯一进程ID,但进程ID是可以被复用的。当一个进程终止后进程ID会进入候选池,并且一般新的进程不会使用最近终止进程的进程ID。 #include <unistd.h> pid_t getpid(void); // 返回值: 调用进程的进程ID pid_t getppid(void); // 返回值: 调用进程的父进程ID fork() 函数可以创建一个新进程,子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。例如,子进程获得父进程数据空间、堆和栈的副本。并且在修改时使用了写时复制(Copy-On-Write,COW)技术。 #include <unistd.h> pid_t fork(void); // 返回值: 子进程返回0, 父进程返回子进程ID,若出错返回-1 以下是一个示例代码,用于创建一个子进程并展示父进程和子进程的ID与父进程ID,以及如何通过信号避免僵尸进程。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/wait.h> #include <sys/types.h> void sigchld_handler(int sig) { int status; pid_t id = waitpid(-1, NULL, WNOHANG); if (WIFEXITED(status)) { printf("remove proc id: %d \n", id); printf("Child send: %d \n", WEXITSTATUS(status)); } } int main(int argc, char *argv[]) { struct sigaction sa; sa.sa_handler = sigchld_handler; sa.sa_flags = SA_RESTART | SA_NOCLDSTOP; // 初始化信号屏蔽集,确保不阻塞任何额外信号 sigemptyset(&sa.sa_mask); // 注册 SIGCHLD 信号处理 sigaction(SIGCHLD, &sa, NULL); pid_t pid; int val = 24; if ((pid = fork()) < 0) { fprintf(stderr, "fork err: %d\n", pid); exit(1); } else if (pid == 0) { val++; printf("child: pid = %d, ppid = %d\n", getpid(), getppid()); printf("child: val = %d\n", val); _exit(0); } else { sleep(5); printf("root: pid = %d, ppid = %d, child_pid = %d\n", getpid(), getppid(), pid); printf("root: val = %d\n", val); sleep(5); } exit(0); } 以下是执行程序后的结果,一个有意思点是程序的父进程ID是bash,子进程修改的数据并不会影响到父进程的数据。 ...

November 27, 2024 · 3 min · zhumouren

OpenWrt开发入门实战(一)Docker环境搭建

1. 环境准备 一台带有Windows10(64位)及以上专业版的电脑(其他操作系统也行,只要能用Docker就好了 CPU为X86_64 Docker(用作OpenWrt的编译环境和测试环境) 2. 使用Docker搭建OpenWrt编译环境 本文使用docker-compse构建,构建脚本目录环境为 docker-linux-env/ | docker-compose.yml | ----ubuntu-compile-openwrt/ | | Dockerfile | | sources.list | - 以下为各文件的具体内容 docker-compose.yml version: '3' services: ubuntu-compile-openwrt: build: ./ubuntu-compile-openwrt environment: TZ: Asia/Shanghai volumes: - compile-openwrt:/root # compile-openwrt 是数据卷 - compile-openwrt-home:/home ports: - "2211:22" volumes: compile-openwrt: compile-openwrt-home: Dockerfile # 以最新的Ubuntu镜像为模板 FROM ubuntu:24.04 # 将本目录下的sources.list作为容器的一个文件 ADD sources.list /root/sources.list # 使用国内Ubuntu源,更新快 RUN mv /etc/apt/sources.list /etc/apt/sources.list_bak RUN cp /root/sources.list /etc/apt/sources.list RUN apt update # 安装常用工具 RUN apt install -y vim git nano # 安装编译OpenWrt官方实例相关工具 RUN apt install -y build-essential clang flex bison g++ gawk \ gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev \ python3-setuptools rsync swig unzip zlib1g-dev file wget # 安装当前镜像对当前OpenWrt编译所需要库 RUN apt install -y libelf-dev locales # 设置LOCALE RUN locale-gen en_US.UTF-8 # 修改root密码 RUN echo 'root:pw' | chpasswd # 添加自定义用户 RUN adduser buildbot \ && echo 'buildbot:pw' | chpasswd # 安装ssh RUN apt install -y openssh-server RUN mkdir -p /var/run/sshd # 开放22端口 EXPOSE 22 #设置自启动命令 CMD ["/usr/sbin/sshd", "-D"] sources.list ...

October 10, 2024 · 2 min · zhumouren