Category - Linux

2025-06-26 16:00:30    1    0    0

准备工作

  1. 确保 Windows 版本 ≥ 1903(设置 → 系统 → 关于)
  2. 准备管理员权限 PowerShell
  3. 下载必备文件:

安装 WSL 环境

  1. #管理员 PowerShell 执行
  2. #1 启用适用于 Linux 的 Windows 子系统
  3. dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  4. #2开启虚拟化功能
  5. dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  6. #3安装上面下载的内核包或直接命令执行更新最新的版本
  7. wsl --update
  8. #4将 WSL 2 设置为默认版本
  9. wsl --set-default-version 2

安装ubuntu

  1. wsl --list --online
  2. #选一个可安装版本
  3. wsl --install -d -Ubuntu-20.04

或者直接下载分发版本,点击安装
https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#downloading-distributions

2025-06-26 15:23:36    4    0    0

一、WSL 是什么?(一句话定义)

Windows 内置的「Linux 子系统」
允许直接在 Windows 上运行 Linux 程序(无需虚拟机/双系统),实现 "Windows 皮囊,Linux 灵魂"
官方文档
https://learn.microsoft.com/zh-cn/windows/wsl/

二、核心工作原理(文字图解)

  1. Windows 11
  2. ├─> WSL 2 引擎 Linux 内核 运行 Docker/Jenkins/Git
  3. └─> 文件互通:直接访问 /mnt/c/Users/你的文件夹/
  4. 网络直连:通过 localhost:8080 访问服务

三、为什么需要 WSL?解决四大痛点

传统方案 WSL 方案 用户收益
双系统切换需重启 秒开 Linux 终端 节省 10 分钟/次
虚拟机占用 10GB+ 按需分配内存 (1GB 起) 旧电脑也能运行
Docker 强制登录 命令行操作无认证 绕过商业限制
跨境访问卡顿 走本地网络+国内镜像源 下载速度提升 5 倍

四、在 CI 环境搭建中的关键作用

1. 破局 Docker 登录墙

  1. # 在 WSL 的 Ubuntu 中执行
  2. sudo service docker start
  3. docker run -d -p 8080:8080 jenkins/jenkins

2. 构建跨平台开发流水线

  • 文件互通:C:\project/mnt/c/project
  • 网络直通:Windows 访问 localhost:8080

3. 镜像加速配置

  1. sudo mkdir -p /etc/docker
  2. echo '{"registry-mirrors":["https://xxxx.mirror.aliyuncs.com"]}' | sudo tee /etc/docker/daemon.json
  3. sudo systemctl restart docker

五、超能力场景扩展

开发

2021-05-26 17:11:00    1243    0    0
  1. echo "1" >/proc/sys/kernel/sysrq
  2. sudo sysctl -w kernel.sysrq=1
  3. echo c > /proc/sysrq-trigger

启用 sysrq 所有功能

  1. 0 - disable sysrq completely
  2. 1 - enable all functions of sysrq
  3. >1 - bitmask of allowed sysrq functions (see below for detailed function description):

You can set the value in the file by the following command:

  1. echo "1" >/proc/sys/kernel/sysrq
  2. sudo sysctl -w kernel.sysrq=1

给 sysrq-trigger 写入字符触发功能

常用以下命令来触发一个crash 进行测试
使sysrq-trigger 的值为c,会执行系统崩溃和崩溃转储,然后重启

  1. echo c > /proc/sysrq-trigger

以下是使用其他字符时的功能:

Command Function
b Will immediately reboot the system without syncing or unmounting your disks.
c Will perform a system crash and a crashdump will be taken if configured.
d Shows all locks that are held.
e Send a SIGTERM to all processes, except for init.
f Will call the oom
2021-05-26 13:26:01    1339    0    0

在一个无外网连接的ubuntu vm 上离线安装标准安装包及其依赖包。

下载标准安装包

找一个与目标离线vm 基础系统版本和kernel一致的,能连外网的设备,下载安装包:(最好是找这个vm 创建的镜像再创建一个连通外网的vm , 基础设备一致是为了保证能够获取所有需要依赖包,apt-get install 时,判断的是当前未安装的依赖)

比如,用一个496的xx版本的qcow2 创建了一个 ubuntu 20 的系统,执行以下命令,获取ubuntu20 安装linux-crashdump时的需要的deb包。

  1. apt-get --download-only install linux-crashdump

当前系统不会进行安装,只下载包,存储目录是 /var/cache/apt/archives/
可以在上面apt-get 命令的log 中看到实际需要4个deb 文件。把这4个文件打包 (一个本身+三个依赖)

  1. cd /var/cache/apt/archives/
  2. tar zcvf linux-crashdump.tar.gz xxxx.deb

安装离线包

将deb文件包拷到目标离线设备上,解包,安装

  1. cd offlinedir/
  2. tar zxvf linux-crashdump.tar.gz
  3. dpkg -i ./*.deb

验证版本

  1. apt-cache policy linux-crashdump
2021-05-12 17:36:09    1063    0    0

逻辑分区的特点,和比物理分区的优势

https://wiki.archlinux.org/title/LVM
更灵活
1. 使用任意数量的磁盘作为一个大磁盘。
2. 将逻辑卷扩展到多个磁盘上。
3. 创建小的逻辑卷,并在卷被填满时“动态地”调整其大小。
4. 调整逻辑卷的大小,而不考虑它们在磁盘上的顺序。它不依赖于LV在VG中的位置,没有必要确保周围的可用空间。
5. 在线调整/创建/删除逻辑卷和物理卷。它们的文件系统仍然需要调整大小,但有些(如ext4)支持在线调整大小。
6. 将服务正在使用的LV在线/热迁移到不同的磁盘,而无需重新启动服务。
7. 快照允许您备份文件系统的冻结副本,同时将服务停机时间保持在最低限度。
8. 支持各种设备映射器目标,包括透明的文件系统加密和常用数据的缓存。这允许创建一个具有(一个或多个)物理磁盘(通过LUKS加密)和LVM的系统,以便轻松调整和管理单独的卷(例如,for /, /home,/backup等),而无需在启动时多次输入密钥。

逻辑分区里的概念

PV
VG
LV
PE
LE

物理卷(PV) Unix块设备节点,可用于LVM存储。例如:一个硬盘,一个MBR或GPT分区,一个环回文件,一个设备映射设备(例如dm-crypt)。它承载一个LVM头文件。

卷组(VG) pv的组,作为lv的容器。pe从VG分配给LV。

逻辑卷(LV)“虚拟/逻辑分区”,位于VG中,由pe组成。lv是类似于物理分区的Unix块设备,例如,它们可以直接用文件系统进行格式化。

物理范围PE (Physical extent) PV中可分配给LV的最小连续范围(默认为4mib)。把pe看作pv的一部分,可以分配给任何LV。

title

常用命令

  1. pvdisplay
  2. vgdisplay
  3. lvdisplay
  4. pvresize /dev/sda1
  5. vgdisplay| grep Free
  6. lvextend -L +5G(replace by Free space) /dev/haha_vg/lv_root
  7. resize2fs /dev/mappaer/xxxxx (df -h 要生效,要resi
2021-03-18 16:29:34    1163    0    0

网址URL中特殊字符转义编码

字符 URL编码值
空格 %20
" %22
# %23
% %25
& %26
( %28
) %29
+ %2B
, %2C
/ %2F
: %3A
; %3B
< %3C
= %3D
> %3E
? %3F
@ %40
\ %5C
| %7C
2021-03-17 15:42:11    1326    0    0

在官网上下载所需版本的驱动包,5.1.0-6.6.0

https://www.mellanox.com/
MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64.tgz

解包

  1. tar zxvf MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64.tgz

添加对指定kernel 的支持,执行./mlnx_add_kernel_support.sh ,生成新包 --k64.tgz

  1. ./mlnx_add_kernel_support.sh -m /vob/MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64 -k 5.4.0-64-generic -s /usr/src/linux-headers-5.4.0-64-generic -t /vob/t/ -n MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64-ext-k64

解压新包,并执行./mlnxofedinstall

  1. tar zxvf MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64-ext-k64.tgz
  2. ./mlnxofedinstall --dpdk --without-dkms --force --without-depcheck -k 5.4.0-64-generic -s /usr/src/linux-headers-5.4.0-64-generic
2021-03-17 15:31:30    990    0    0

获取官方 kernel 指定版本头文件

先安装kernel 头文件

  1. sudo apt-get install linux-headers-5.4.0-65-generic

内核头文件在:/usr/src/ ,去打包

  1. cd /usr/src/
  2. tar -zcvf linux-headers-5.4.0-65-generic.tar.gz ./linux-headers-5.4.0-65-generic
  3. tar -zcvf linux-headers-5.4.0-65.tar.gz ./linux-headers-5.4.0-65

将头文件包放至需要集成编的项目中一起编译。

kernel 相关设置和查询命令

安装指定版本kernel

  1. apt-get install linux-image-5.4.0-65-generic

保持kerknel 版本不升级

  1. apt-mark hold linux-image-5.4.0-65-generic linux-headers-5.4.0-65-generic

查看已安装 版本

  1. root@gua-vm2:/vob# dpkg --get-selections | grep linux-image
  2. linux-image-5.4.0-52-generic deinstall
  3. linux-image-5.4.0-53-generic deinstall
  4. linux-image-5.4.0-56-generic deinstall
  5. linux-image-5.4.0-58-generic deinstall
  6. linux-image-5.4.0-59-generic deinstall
  7. linux-image-5.4.0-60-generic deinstall
  8. linux-image-5.4.0-62-generic deinstall
  9. linux-image-5.4.0-65-generic install
  10. l
2021-03-10 17:16:11    261    0    0

构造函数

构造函数(constructor),类定义中的初始化方法,命名为_init_。然而,构造函数不同于普通方法的地方在于,将在对象创建后自动调用它。

析构函数

Python提供了魔法方法del,也称作析构函数(destructor)。这个方法在对象被销毁(作为垃圾被收集)前被调用,但鉴于你无法知道准确的调用时间,建议尽可能不要使用del

重写构造方法

重写的构造函数必须调用其超类的构造函数,以确保基本的初始化得以执行。为此,有两种方法:调用未关联的超类构造函数,以及使用函数super。super().init()

  1. def __init__(self):
  2. super().__init__()

python 只要求对象遵循特定的协议

在Python中,协议通常指的是规范行为的规则,有点类似于第7章提及的接口。协议指定应实现哪些方法以及这些方法应做什么。在Python中,多态仅仅基于对象的行为(而不基于祖先,如属于哪个类或其超类等),因此这个概念很重要:其他的语言可能要求对象属于特定的类或实现了特定的接口,而Python通常只要求对象遵循特定的协议。因此,要成为序列,只需遵循序列协议即可。

  1. __len__(self)
  2. __getitem__(self, key)
  3. __setitem__(self, key,value)
  4. __delitem__(self, key)

存取方法

通过存取方法定义的属性通常称为特性(property)。 get(),set()
函数 property,通过调用函数property并将存取方法作为参数(获取方法在前,
设置方法在后)创建了一个特性,然后将名称size关联到这个特性。这样,你就能以同样的方式对待width、height和size,而无需关心它们是如何实现的.

  1. class Rectangle:
  2. def __init__ (self):
  3. self.width = 0
  4. self.height = 0
  5. def set_size(self, size):
  6. self.width, se
2021-03-10 17:12:12    492    0    0

多态、封装、方法、属性、超类和继承

多态

每当无需知道对象是什么样的就能对其执行操作时,都是多态在起作用

  1. >>> 'abc'.count('a')
  2. 1
  3. >>> [1, 2, 'a'].count('a')
  4. 1

如果有一个变量x,你无需知道它是字符串还是列表就能调用方法count:只要你向这个方法提供一个字符作为参数,它就能正常运行。
多态形式是Python编程方式的核心,有时称为鸭子类型。这个术语源自如下说法:“如果走起来像鸭子,叫起来像鸭子,那么它就是鸭子。”有关鸭子类型的详细信息,请参阅http://en.wikipedia.org/wiki/Duck_typing

封装

封装(encapsulation)指的是向外部隐藏不必要的细节。这听起来有点像多态(无需知道对象的内部细节就可使用它)。这两个概念很像,因为它们都是抽象的原则。它们都像函数一样,可帮助你处理程序的组成部分,让你无需关心不必要的细节。但封装不同于多态。多态让你无需知道对象所属的类(对象的类型)就能调用其方法,而封装让你无需知道对象的构造就能使用它。
如果
o将其名称存储在全局变量global_name中,如果尝试创建多个OpenObject对象,将出现问题,因为它们共用同一个变量。避免干扰全局变量,就需要将名称“封装”在对象中。使用属性而非全局变量。

在Python中,表示类约定使用数并将首字母大写,如Bird和Lark。

在较旧的Python版本中,类型和类之间泾渭分明:内置对象是基于类型的,而自定义对象是基于类的。因此,你可以创建类,但不能创建类型。在较新的Python 2版本中,这种差别不那么明显。在Python 3中,已不再区分类和类型了。

隐藏

如果能直接访问ClosedObject(对象c所属的类)的属性name,就不需要创建方法setName和getName了。关键是其他程序员可能不知道(也不应知道)对象内部发生的情况。例如,ClosedObject可能在对象修改其名称时向管理员发送电子邮件。这种功能可能包含在方法set_name中。但如果直接设置c.name,结果将如何呢?什么都不会发生——根本不会发送电

1/7