-
深入理解 SELinux - 系统安全的“门禁”
一、SELinux 的核心概念与工作流程 想象一下中秋家宴,SELinux 就像家里的管家,确保一切井然有序。 核心概念 中秋家宴比喻 描述 示例 主体 家庭成员/客人 发起动作的实体,通常是进程。 httpd 进程 (想端菜的厨师) 客体 月饼/菜肴/房间 被操作的实体,可以是文件、目录、端口等。 /var/www/html/index.html (一盘月饼) 策略 家规 一套规则的集合。定义了谁能对什么做什么事。 “只有厨师 (httpd_t) 才能碰厨房里的月饼 (httpd_sys_content_t)。” 安全上下文 身份胸牌/物品标签 最重要的概念。是附加到每个人/物上的安全标签。 system_u:object_r:httpd_sys_content_t:s0 安全上下文的结构:user:role:type:level user (用户): SELinux用户,与Linux系统用户不同。 role (角色): 用于角色基于访问控制 (RBAC)。 type (类型): 最核心的部分。策略主要是基于主体和客体的类型来制定规则的。type 也常被称为 域 (Domain) (当用于主体时) 和 类型 (Type) (当用于客体时)。 level (级别): 用于多级别安全 (MLS),通常保持为 s0。 SELinux 的工作流程 当一个主体 (如 httpd 进程) 尝试访问一个客体 (如 /var/www/html/index.html 文件) 时,内核中的 SELinux 安全模块会拦截这个操作,并执行以下检查流程: 二、SELinux 的三种工作模式 SELinux 可以工作在三种不同的模式下。你可以临时切换模式,也可以永久修改配置文件。 模式 SELINUX 配置值 描述 强制模式 enforcing 默认且最安全的模式。严格执行安全策略,任何违反策略的访问都会被阻止,并记录到审计日志 (/var/log/audit/audit.log)。 宽容模式 permissive 不阻止任何违反策略的访问,但会将其记录到审计日志中。此模式主要用于 调试和排错,可以发现哪些操作会被阻止而不影响服务正常运行。 禁用模式 disabled 完全关闭 SELinux。不推荐在生产环境中使……
SE_Wang 2025-10-17
100 0 0 -
【Linux】冯 • 诺依曼体系结构
一、冯•诺伊曼体系的介绍 冯诺依曼体系是由冯·诺依曼提出的计算机设计的基本框架,包括五大部件:输入设备,存储器,运算器,控制器,输出设备。(其中运算器和控制器统称为中央处理器也就是CPU) 我们的计算机,笔记本的设计都遵守冯诺依曼体系 这五大部件都是独立的个体,各个硬件单元必须使用“线”连接起来,总线:系统总线,IO总线 部件 英文名称 功能说明 运算器 Arithmetic Logic Unit (ALU) 负责完成算术运算(加减乘除)和逻辑运算(与、或、非、比较等),是计算机进行数据处理的核心。 控制器 Control Unit (CU) 负责解释指令并控制各部件协调工作,指挥程序按顺序执行。 存储器 Memory 用于存放数据和程序指令,二者同等对待,均以二进制形式存储。 输入设备 Input 用来将数据或程序输入计算机,例如键盘、鼠标、扫描仪等。 输出设备 Output 将计算机处理的结果输出,例如显示器、打印机、扬声器等。 二、冯•诺依曼体系结构的推导 计算机的作用就是为了解决人的问题,解决问题首先需要将数据或是问题输入到计算机当中,所以计算机必须要有输入设备。计算机解决完问题后还需要将计算结果输出显示出来,所以计算机必须要有输出设备。计算机通过输入设备得到数据,数据在计算机当中进行一系列的算术运算和逻辑运算后,通过输出设备进行输出,于是就得到了以下流程图。 但是计算机当中只有算术运算功能和逻辑运算功能是不够的,还需要有控制功能,控制何时从输入设备获取数据,何时输出数据到输出设备等。对应到C语言当中,算术运算就完成一系列的加减乘除,而逻辑运算就对应于一系列的逻辑与逻辑或等,控制功能就对应于C语言当中的判断、循环以及各个函数之间的跳转等等。 而我们后人就将这个具有算术运算功能、逻辑运算功能以及控制功能的这个模块称为中央处理器,简称CPU。 但是输入设备和……
SE_Wang 2025-10-16
367 0 0 -
《Linux 入门到实践:零基础也能懂》--从历史到实战,一篇文章带你了解操作系统的 “服务器之王
一.计算机和操作系统的历史脉络 计算机的历史: --我们要聊操作系统,那么首先就得对计算机的历史背景有一些了解。博主在这里画了一个比较清晰的脉络图(附有部分注释),大家直接看一下就行。 --通过这个图大家可以发现硅谷模式对于企业的形成以及军工业的发展都有着重大的作用,在上面我们还提到了军转民,那么摩尔定律在其中起到了至关重要的作用(还是看图)。 ❄摩尔定律❄: 操作系统的历史脉络: --操作系统的诞生,本质是计算机硬件发展与用户需求升级的必然结果:可以说,没有操作系统,就没有现代计算机的普及与发展。 上面我们看到了计算机分为大型一体机和个人电脑,那么在操作系统的发展过程中这也体现的很明显。unix操作系统就主要运用于大型一体机,而苹果OS和微软windows主要用于个人电脑。这其中的一些故事也是十分有趣的。 --还是通过这个图来理清一下他们的关系,大家一定要仔细看一下。 思考和补充: 1.为什么windows不禁用盗版以及为什么会有类似于office的内置软件 --我个人认为windows不禁用盗版是为了增加用户基数,大家可以从图中发现,微软自己是不做电脑的,他们是把自己的操作系统卖给品牌电脑公司。那么用户基数多了之后,这些品牌公司优先选择的一定是windows,但这些公司是不可能用盗版的,所以没有禁用。而windows配置内置办公软件也是为了增强市场竞争力,让更多人去选择windows的系统使用,提高市场占有率。 2.unix发展的历史 二.Linux相关话题 Linux的起源: 1991 年,芬兰赫尔辛基大学的学生林纳斯・托瓦兹(Linus Torvalds) 因不满 Minix 的限制,在个人计算机(Intel 386)上着手开发一个新的操作系统内核: 最初动机:他只是想为自己的 PC 打造一个 “能自由使用、可修改” 的操作系统,用于学习和运行程序; 核心理念:借鉴 UN……
SE_Wang 2025-10-15
13 0 0 -
Windows11 + Linux (Ubuntu22.04) 双系统最简安装详细避坑版
准备工作(非常重要!!!一步一个坑! 1. 首先 我们有一个安装了Windows11系统的电脑,准备一个8G以上的U盘(或者移动硬盘) 2. 查看/更改引导方式 确保双系统安装完成后可以有双系统菜单: --Win+R呼出运行界面,输入:msinfo32,确定,会弹出一个系统信息的面板(或者直接搜索系统信息)。 --在项目栏找到BIOS模式,看对应的值,是否为UEFI,如果是就OK!跳到准备工作第三点~ --如果BIOS模式的值不是UEFI,而是显示传统(Legacy),那么就要改成UEFI,重启电脑狂按对应按键进入BIOS模式(如果不知道按哪个可以看看下面这个表,一般电脑开机的时候也会很快闪过按什么键的提示) --比如鱼鱼用的Thinkbook16+是要在启动的时候狂按回车,然后出现一个Startup Interrupt Menu,再按F1就可以进入BIOS启动设置界面了。 --进入BIOS后开启UEFI,不同的电脑可能操作方法不同,下面的操作有对应的就按着修改没有就换一个: Boot,选择UEFI Boot回车选择Enabled; Startup,Boot,UEFI/Legacy Boot旁边的选项选择修改为UEFI Only; Boot mode select选择修改为UEFI; Boot Type选择修改为UEFI Boot Type; Launch CSM选择修改为Disabled。 改完了记得保存并退出!不要忘记保存!!! 3. 查看/更改磁盘的分区格式 避免安装Ubuntu到最后了却因为引导器安装失败功亏一篑: --右键开始按钮选择磁盘管理 --在Windows所在的磁盘(图中的磁盘0)左边灰色块右键,选择属性 --在卷这栏可以看到磁盘分区形式,是否为GPT格式,如果是就OK!跳到准备工作第四点~ --如果磁盘分区形式显示的是:主启动记录(MBR),那么就要修改为GPT格式: Win+R呼出运行界面,输入cmd确认打开命令行,输入命令:diskpart,回车,允许此应用对设备进行更改选择是,弹出这个界面: 在这个界面输入命令:……
SE_Wang 2025-10-14
87 0 0 -
Linux探秘坊-------4.进度条小程序
1.缓冲区 #include <stdio.h> int main() { printf("hello bite!"); sleep(2); return 0; } 执行此代码后,会 先停顿两秒,再打印出hello bite,但是明明打印在sleep前面,为什么会后打印呢? 因为: 在printf执行完了后,打印的内容被存到了缓冲区 程序快结束时缓存区的内容再打印到显示器 奇妙的事情发生了: #include <stdio.h> int main() { printf("hello bite!\n"); sleep(3); return 0; } 如果我们使用这样的代码,会 先打印出hello bite,再停顿两秒,为啥捏? 可以发现和上面的代码对比多了一个/n 显示器有一种刷新策略,叫 行刷新 而 /n正好代表着换行,所以加了/n的内容会 直接从缓存区打印到显示器上,不用等程序结束 那么我们有没有办法 不用\n也能先打印呢? 包有的: #include <stdio.h> int main() { printf("hello bite!"); fflush(stdout); sleep(3); return 0; } 这里的fflush(stdout)就起到了 刷新的作用 2.进度条(V1) 1.process.h 2.main.c 3.process.c(重点) #include"process.h" 2 #include<string.h> 3 #include<unistd.h> 4 5 #define size 101//需要考虑\0所以不是100 6 #define style '#' 7 8 void process() 9 { 10 int rate =0; 11 char num[size]; 12 memset(num,0,sizeof(num));//这里是让num全部置空 W> 13 char* lable="|/-\\";//这里是模拟进度条后的圈圈 14 int length=strlen(lable); 15 while(rate<=100) 16 { 17 printf("[%-100s][%d%%][%c]\r",num,rate,lable[rate%length]);//100s是指预留100个字符,主要是为让】不动,但这样会导致倒着打印,所以需要加-, \r是指每次打印完了之后都恢复到原位置 18 fflush(stdout);//这里因为没有\n所以需要fflush进行刷新 19 num[rate]=style; 20 ++rate; 21 usleep(50000);//usleep和sl……
SE_Wang 2025-10-13
16 0 0 -
Linux的写作日记:Linux基础开发工具(二):vim编辑器
前言 在上一篇文章,我向各位读者展示了Linux的目录权限以及第一个开放工具——yum的讲解,下面我们紧跟着上篇文章的步伐,继续进行着Linux基础开发工具的学习,今天我们要学习的是——vim编辑器的使用。 1.vim编辑器简介 1.vim编辑器是什么 编辑器想必各位都不陌生,一般来说,如果你是Windows用户,那么你的电脑上一定会有一个软件,叫做记事本,记事本就是一个最简单的编辑器,我们可以在里面写字、记点东西。 而Linux的世界里,也存在着一个家喻户晓的编辑器,它就是vim,你可以把它想象成Linux系统下的“超级记事本”——但它比记事本的功能要强大太多,也要复杂的多。可以说,vim是一款专注的编辑器,并且是一个多模式的编辑器。 当然,vim其实也是Linux下的一条指令~这点各位要记清 2.见一见vim 在真正认识vim之前,我先带领各位去见识一下vim编辑器的强大之处,当我们想要使用它时,仅仅通过vim + 文件名就可以实现。其界面图如下图所示,当然,我的vim编辑器是加了很多插件的,我会在讲完vim后,带领各位去配置一下自己的vim编辑器。 我在之前指令部分讲过,如果我们想要查看一个指令存放在哪,用which指令即可实现,所以请各位读者输入下面的命令。 sudo which vim 此时不难发现,vim是存在在bin目录下的,而我之前讲过,bin目录下存放的都是指令,所以从这就可以印证:vim是一个强大的记事本,并且还是一个指令,不过它的指令还是比较容易学习的,甚至我感觉我都不用说明,它的使用方法就是: vim 文件名 使用方法就是如此的容易,下面我给各位先一览vim的界面。 那么下面废话不多说,开始进入vim的学习。 2.学习使用vim编辑器 我在上一小节就说过,vim是一个多模式的编辑器,这意味着编辑器有着多种模式,而接下来,正如上图所示,我们将会依次讲解这三种模式,希望各位不要知难而退哦~ 1.命令模式 ……
SE_Wang 2025-10-11
48 0 0 -
CentOS 上安装KingbaseES(ISO包)详细教程
KingbaseES(金仓数据库)属于国产主流数据库运作系统,其具有较高的适配性,安全性与可用性,被全面应用在政务,金融,能源等重要领域,本文将拿 CentOS 7.9 服务器做例子,按照官方 ISO 安装包,从“准备工作”过渡到“安装完毕后的验证”,详细阐述三种安装方法(图形界面,命令行,静默模式)的整个过程,文章语言平易近人,比较适合初学者入门,而且能够为企业部署供应一定的参照。 一、安装前准备工作 在着手安装之前,要开展硬件核查,系统设置以及用户创建这些基本工作,防止由于环境不符合要求而引发安装失败的情况发生。 1.1 硬件要求确认 KingbaseES存在针对硬件的最低标准,对于采用CentOS 7.9的服务器而言,其应当具备如下设置(建议超出最低标准以防止出现性能瓶颈) 要知道,如果硬件不符合要求(比如 /tmp 空间不够),就要先释放一些资源(像清除 /tmp 下面没用的文件),或者升级硬件,要不然安装的时候就会出错 1.2 系统版本与参数确认 1.2.1 确认CentOS 版本 首先确保服务器系统,执行以下命令验证: # 查看系统版本,显示“CentOS Linux release 7.9.2009 (Core)” cat /etc/redhat-release 若版本过低,需先升级或重装系统(KingbaseES支持CentOS 7.5-7.9、8.0-8.5,本文以7.9为例)。 1.2.2 关闭应用保护 CentOS 7.9默认也许会启动SELinux或者防火墙,它们有可能会拦截安装程序,所以建议暂时关闭它们(安装完毕之后可以按照需求重新开启) # 如果要临时关闭SELinux,那么在重启之后就会失效,想要永久关闭它就得要去修改 /etc/selinux/config 文件 setenforce 0 # 要是打算暂时关闭防火墙的话,同样也是重启之后就会失效,要想做到永久关闭就得运行systemctl disable firewalld 这个命令。 systemctl stop firewalld 1.2.3 系统参数优化(可选,推荐) KingbaseES提供一键优化脚本,不……
SE_Wang 2025-10-10
113 0 0 -
【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell
一、为啥sleep命令会“卡住”?——bash的阻塞等待 先从一个小问题切入:为啥用execl调用sleep时,程序像“卡住”了? 其实这不是卡住,是bash在等它执行完。 比如你写了个程序,里面用execl调用系统的sleep命令: // #include <unistd.h> int main() { // 执行sleep 1秒:路径/bin/sleep,参数sleep、1,末尾NULL execl("/bin/sleep", "sleep", "1", NULL); return 0; } 当你运行这个程序时,bash(你的命令行父进程)会“阻塞等待”这个子进程(你写的程序)执行完。而你的程序又被sleep替换了,所以bash会等sleep跑完1秒才恢复,看起来就像“卡住”——这其实是正常的等待逻辑。 换“代码和数据” 很多人以为“执行新程序”就是“新建进程”,其实不是!进程替换的核心是:不创建新进程,只把当前进程的“代码和数据”换成新程序的。 就像一个人(进程)换衣服(代码和数据),身份证(PID、PCB进程控制块)没变,还是同一个人,只是穿的衣服不一样了。如图3、图4所示:进程的“结构”(PID、PCB)早就建好,替换时只把里面的“代码段、数据段”覆盖掉。 关键问题:为啥exec系列函数“只有失败返回值”? 你查man execl会发现:exec*函数成功时没有返回值,只有失败时返回-1。为啥? 因为一旦替换成功,当前进程的代码已经被新程序覆盖了——原来的代码(包括exec之后的返回语句)全没了,根本没法返回!只有替换失败时,原来的代码还在,才能返回-1告诉你“没换成”。 execl之后写了printf("替换后执行");,但如果execl成功,这段代码会被覆盖,永远不会执行;只有execl失败(比如路径写错),才会打印“替换失败”。 三、exec系列接口怎么用?——5个函数,记住“字母含义”就够了 exec有5个常用函数:execl、execlp、execv、execvp、execvpe。不用死记,记住字母代表的意思: l(list):参数用“列表”一个个传(比……
SE_Wang 2025-10-09
30 0 0 -
【Linux】ELF 是什么?一文拆解 Linux 程序 “从零件到运行” 全流程
ELF 本章的大致内容 ELF(Executable and Linkable Format)是Linux系统中可执行文件的标准格式。它描述了程序如何从编译后的静态库(如.a文件)一步步形成可执行程序,并最终加载到内存运行。通俗来说,就像一本说明书:编译时,代码被拆成多个“零件”(Section);加载时,这些零件被组装成“模块”(Segment),便于操作系统高效管理。下面我们结合图片和关键点,一步步拆解这个过程。 静态库如何形成可执行程序 静态库(如.a文件)是一堆预编译代码的集合。当我们编译程序时,链接器会将这些库中的代码和我们的代码合并,生成一个ELF可执行文件(如a.out)。例如,用C语言写一个程序并链接静态库: gcc main.c -static -o a.out # 编译并链接静态库,生成ELF可执行文件 这个过程分两步: 编译阶段:源代码(如.c文件)被编译成目标文件(.o),每个目标文件包含多个Section(如代码段.text、数据段.data)。 链接阶段:链接器将所有目标文件和静态库合并,生成一个完整的ELF文件。它创建一个Section Header Table(节表头),记录每个Section的大小、位置和属性(如权限)。 从静态库到可执行程序,就像拼乐高:零件(Section)被分类打包,说明书(ELF头)告诉系统如何组装。 ELF从形成到加载轮廓 ELF文件在磁盘上存储时,是一堆Section的集合。但加载到内存时,这些Section会被合并成更大的Segment。为什么?因为内存管理以4KB页面为单位,小Section会浪费空间。合并后,Segment能更好地匹配页面大小,减少碎片。 合并原则:属性相同的Section合并成一个Segment。例如,所有“可读可执行”的代码Section(如.text)合并成代码Segment;所有“可读可写”的数据Section(如.data)合并成数据Segment。 关键角色: Section Header Table:记录所有Section的详细信息(位置、大小、属性)。 Program Header Table:定……
SE_Wang 2025-09-30
34 0 0 -
【Linux】Linux开发必备:Git版本控制与GDB调试全指南
一、Git:从基础到实践的版本控制 1.1为什么需要版本控制? 版本控制的价值:记录代码每一次修改(谁改、改了什么、什么时候改),支持一键回滚到历史版本,实现多人并行开发时的代码同步与冲突解决 对比传统“复制副本”方式:告别 “项目 - v1.doc”“项目 - 最终版 2.doc” 的混乱命名,用 Git 统一管理版本,减少冗余文件 1.2 Git简史:从Linux内核开发需求诞生的工具 背景:2005年,Linux内核开发团队因商业版本控制系统BitKeeper终止授权,由Linus Torvalds主导开发Git 核心设计目标: 速度快:高效处理超大规模项目(如Linux内核,百万级代码量) 完全分布式:无需依赖中央服务器,本地可完成版本管理,联网后同步即可 支持非线性开发:轻松创建、合并分支,满足多人并行开发需求 1.3Git环境搭建:Linux下的安装和初始化配置 (1)在Linux安装Git(以Centos/Ubuntu为例) Centos系统: //1.先下载git sudo yum install git //2.再查看git版本,确认是否下载下来了 git --version Ubuntu系统: sudo apt install git -y git --version (2)在github/gitee创建项目(下面以gitee为例) 注册账号:按照网站提示写即可 创建仓库: 登录成功后,进入个人主页,在右上方➕按钮,点击新建仓库 跳转到新页面输入项目名称及其他设置: 创建完后,在创建好的仓库页面中复制仓库链接,以备接下来进行下载: (3)将仓库克隆到Linux下 创建一个放置代码的目录(往后的要提交到远程仓库的代码最好放在这个目录下) git clone [url]//url就是上一步复制的仓库链接 Git“三板斧”–提交代码到远程仓库: 操作步骤 命令 作用 示例 1.暂存代码 git add 文件名 将修改的文件加入 “暂存区”,标记为待提交状态 暂存单个文件:git add main.c;暂存所有修改:git add . 2.本地提交 git commit -m "提交说明"(提交说明一定要有,即……
SE_Wang 2025-09-29
39 0 0
