Linux操作系统基础知识2
第七章 命令解释器——shell
7.1 概述
shell是命令解释器,负责解析用户输入的命令,分为内置命令和外置命令。
内置命令存放在程序本体内部,不需要创建子进程,执行速度极快,直接由当前shell进程运行,不单独存在独立可执行文件。
外置命令存在独立二进制可执行文件,存放在PATH路径下,执行时shell会创建子进程运行命令,开销更大,在磁盘上能找到对应文件。
7.2 判断命令类型——type
格式:type 参数 命令名
| 参数 | 作用 |
|---|---|
| -t | 只输出类型:builtin / file / alias / function / keyword |
| -p | 仅显示外部命令路径,内置命令无输出 |
| -a | 列出该命令所有存在形式(内置 + 外部 + 别名全部打印) |
| 输出类型 | 含义 |
|---|---|
| builtin | Shell 内置命令 |
| file | 外部可执行文件(存储在硬盘上的程序) |
| alias | 命令是别名 |
| function | Shell 函数 |
| keyword | Shell 保留字(语法结构的一部分) |
例:

执行原理:系统为了让用户在命令行快速方便地执行命令,将可执行文件的路径存储在环境变量PATH中,使得shell知道命令的可执行文件位置。当用户每次执行外部命令的时候都会去该变量所记录的路径下搜索和命令同名的二进制文件,如果有,则执行该二进制文件,如果没有,则提示命令找不到。

注意:每个路径用:分隔开,若想添加新的路径,可在.bash_profile文件中加入。
vim .bash_profile

重启或用指令source .bash_profile使其生效,再次查看路径,可以看到已生效。

7.3 Linux中的特殊符号
| 特殊符号 | 功能 | 说明 |
|---|---|---|
| ; | 可使用分号分隔多条命令 | 在一行上输入和执行多条较短的命令,可使用分号来分隔命令 |
| * | 匹配任意零个或者多个字符 | 不能用于创建文件 |
| ? | 匹配任意单个字符 | 不能用于创建文件 |
| [ ] | 匹配方括号中的任意一个字符,表示范围可以用"-” | 不能用于创建文件 |
| [^]或者[!] | 匹配方括号中的任意一个字符或数字后进行取反 | 用于查找和删除文件,不用于创建文件 |
| {string,string} | 匹配括号中的任意一个字符串,表示一个范围时,字符串之间个"…" | 可用于创建、查看、删除文件 |
| \ | 使\后面的特殊字符失效 | 例如:可以在命令行后面加一个\,再按回车键时并不表示执行该命令,而是表示换行,通过此方式将一个较长的命令分成多行表达,增强命令的可读性。换行后系统自动显示提示符> |
| ` | 反引号,一般用于引用命令,执行的时候反引号里面的命令会被执行,将命令输出结果替换到当前命令行中 | |
| ’ | 单引号,将单引号内的所有内容都原样输出 | 所有特殊字符在单引号里面都会失去特殊含义 |
| " | 双引号,除了几个特殊字符外,将双引号内的几乎所有内容都原样输出 | ”$“和“\”以及“ ` ”在双引号里面仍然保留自己的特殊含义 |
例:\使空格失效。

例:反引号作用。

7.4 命令别名——alias
alias用于创建命令的快捷方式,对于需要经常输入的长命令,可以直接输入别名运行,方便快捷。
查看设置的别名:alias
创建别名:alias 别名='要执行的命令'
删除别名:unalias 别名
例:

注意:
-
在命令行中使用alias命令设置的别名仅在该次登入有效,如果重新开启一个 Shell,或者重新登录系统,则这些alias将无法使用。
-
在Linux中提供alias永久化的方法:将别名命令写入到~/.bashrc 或 /etc/bashrc文件中,执行 source ~/.bashrc 或 source /etc/bashrc 生效。
-
~/.bashrc只对当前用户生效,/etc/bashrc对系统所有用户生效。
7.5 命令历史
history命令可以查阅命令历史记录。
显示带有序号的历史命令列表:history
只看最近“数字”条历史命令:history 数字
执行上一条命令:!!
执行历史中编号为“数字”的那条命令:!数字
执行最近一条以“字符串”开头的命令:!字符串
管理历史记录:history 参数
| 参数 | 作用 |
|---|---|
| -c | 清空当前会话的历史记录 |
| -d 行号 | 删除指定行号的记录 |
| -w | 将当前会话历史写入 ~/.bash_history 文件 |
| -r | 读取历史文件内容追加到当前会话 |
设置history记录命令条数:进入编辑/etc/profile文件,定位:HISTSIZE=“数字”,自定义数字,保存退出后重启。
例:
vim /etc/profile

ESC+:wq保存退出,再reboot重启。

7.6 补充:/etc/profile 和 /etc/bashrc 的联系和区别
- 联系:
- 两者都属于全局配置文件,对系统所有用户生效。
- 登录 Shell 时都会被加载,用来配置环境变量、别名、函数。
- 修改后必须执行
source 文件名或者重新登录终端才会生效。
- 区别:
- /etc/profile:仅登录 shell 才执行
用户输入账号密码登录系统(ssh、终端登录)时加载;
非登录 Shell(比如新开一个 bash 窗口)不会读取该文件。
主要配置:全局系统环境变量(PATH、USER、HOSTNAME)。 - /etc/bashrc:交互式 Shell 就会加载,不管是不是登录模式
只要打开一个 bash 交互终端,就会调用。
主要配置:命令提示符 PS1、alias 别名、history 历史命令。
- /etc/profile:仅登录 shell 才执行
第八章 账户和组管理
8.1 账户和工作组的分类
账户分为三类:超级账户root、系统账户和普通账户。
超级账户具有一切权限,只有进行系统维护或其他必要情形下才用超级用户登录,以避免系统出现安全问题。
系统账户是Linux系统正常工作所必需的账户,主要为了满足相应的系统进程对文件属主的要求而建立的,系统账户不能登录。
普通用户是为了让使用者能够使用Linux系统资源而建立的。
8.2 账户和工作组的配置文件
预备知识点:
- UID是唯一标识用户的数字编号,操作系统内核识别用户的核心标识,用户名只是给人看的别名。
- GID是唯一标识用户组的数字编号,内核识别用户组的标识,组名是别名。
- 主组是用户创建时默认归属的组,每个用户有且仅有一个主组。新建文件 / 文件夹时,文件默认所属组 = 用户主组。
- 附加组是用户额外加入的其他组,一个用户可以拥有多个附加组。作用是可以临时获得其他组的文件访问权限。
8.2.1 用户账号文件/etc/passwd
用于定义系统的账号,由7个字段组成,字段之间用“:”分隔。
含义:用户名:密码占位符:UID:GID:个人资料:主目录:登录Shell
| 字段位置 | 字段名 | 含义 |
|---|---|---|
| 1 | 用户名 | 登录时输入的名称 |
| 2 | 密码占位符 | x表示密码已加密并存储在/etc/shadow中。如果是空,则代表无密码登录 |
| 3 | UID(用户ID) | 系统的数字身份。0代表超级管理员(root),系统账户1~999,普通用户≥1000 |
| 4 | GID(主组ID) | 用户默认所属组的数字编号。0代表root组,系统组1~999,普通组≥1000 |
| 5 | 个人资料 | 用户全名、电话等描述信息(通常为空或用户名) |
| 6 | 主目录 | 用户登录后所在的起始目录 |
| 7 | 登录Shell | 用户登录后使用的命令解释器。如果是 /sbin/nologin,则表示该用户不允许登录系统 |
例:

查看账户的UID、GID等信息:id 用户名
例:

8.2.2 用户密码文件/etc/shadow
用于存储密码加密后的密文,由9个字段组成,字段之间用“:”分隔。
含义:登录名:密码:最后一次修改密码的时间:密码修改最小时间间隔:密码最大有效期:密码过期提前提醒天数:密码过期宽限天数:账号彻底失效日期:预留保留字段
注:
- 密码:加密后的密码串。若为
*,说明是系统内置账号,禁止登录。
若为!!,说明账号已锁定,无法密码登录。可以直接编辑/etc/shadow,在密码前加上!!,手动锁定账号。 - 最后一次修改密码的时间:从1970-01-01到用户最后一次修改密码当天的总天数。
- 密码修改最小时间间隔:改完密码后,至少等待 0 天才能再次修改,即随时可以改密码;若设为 3,则改完 3 天内不能重复修改。
- 密码过期宽限天数:密码过期后,还能登录的缓冲天数;空值代表无宽限,一旦过期直接禁止登录。
- 账号彻底失效日期到该天数后,账号永久禁用;空 = 账号无过期期限。
例:

8.2.3 工作组账号文件/etc/group
用于存储每个组工作组信息。
含义:组名:密码占位符:主组ID:组成员列表
| 字段位置 | 字段名 | 含义 |
|---|---|---|
| 1 | 组名 | 组的名称,对应chgrp或ls -l中显示的名字 |
| 2 | 组密码占位符 | x 表示组密码已加密并存储在/etc/gshadow中 |
| 3 | GID(主组ID) | 系统的数字组身份。0代表root组,系统组1~999,普通组≥1000 |
| 4 | 组成员列表 | 属于该组的附加用户列表,用逗号分隔。注意:这里不包含以该组为主组的用户 |
例:

8.2.4 工作组密码文件/etc/gshadow
用于管理用户组密码和组管理员。
含义:组名:组密码占位符:组管理员:组成员列表
组密码占位符若为空,说明组无密码;若为!说明组密码被禁用。
例:

8.2.5 补充:设置文件隐藏属性——chattr
格式:chattr [+-=] 属性 文件名
- +:增加属性
- -:取消属性
- =:只保留设定的属性,清空其他所有属性
| 属性 | 效果 | 用途 |
|---|---|---|
| i | 不能对文件进行删除、修改、重命名、覆盖、新增内容、创建硬链接等任何操作。可以修改目录内部已存在文件的内容;但不能在目录内新建、删除文件,不能重命名目录。 | 保护系统配置文件,防止被篡改、删除。 |
| a | 只允许在文件末尾追加内容,不能覆盖原有内容、不能删除文件、不能重命名文件;只能用>>追加,不能用vim直接保存修改。只允许在目录里新建文件,不能删除旧文件。 |
保护日志文件,防止日志被恶意清空、篡改。 |
用命令lsattr 文件名可查看。
例:

当/etc/passwd有i属性时,也无法新建账号。相应地,如果是/etc/shadow,那么将无法修改密码。
8.3 用户管理
8.3.1 添加新用户——useradd
格式:useradd 参数 用户名
| 常用参数 | 作用 |
|---|---|
| -d | 设定用户的家目录 |
| -u | 设置用户的UID,默认值是已有的最大的UID加1 |
| -g | 设置用户的主组,只能有一个 |
| -G | 设置用户的附加组,可以有多个 |
8.3.2 修改账户信息——usermod
格式:usermod 参数 用户名
| 常用参数 | 作用 |
|---|---|
| -l | 更改账户名称,必须在该用户未登录的情况下使用 |
| -L | 锁定(暂停)用户账户,使其不能登录使用 |
| -U | 解锁用户账户 |
其余常用参数 -d,-u ,-g等,意义与useradd命令中的参数相同。
注意:
- 参数为-G时,表示覆盖清空用户原有全部附加组,只保留新写的组。
格式:usermod -G 组名 用户名
指定多个附加组时,用“,”隔开即可 - 参数为-aG时,表示保留原有附加组,再追加新组。
格式:usermod -aG 组名 用户名
追加多个附加组时,用“,”隔开即可
8.3.3 账号设置密码——passwd
格式:passwd 参数 用户名
| 常用参数 | 作用 |
|---|---|
| -l | 锁定(停用)用户账户 |
| -u | 解锁用户账户 |
只有 root 才能指定用户名;普通用户执行此命令,系统会报错;普通用户不加用户名,直接 passwd 只能改自己密码。
例:
8.3.4 删除账号——userdel
格式:userdel 参数 账户名
| 参数 | 作用 |
|---|---|
| -r | 在删除该账户的同时,一并删除该账户对应的家目录 |
8.3.5 账户切换——su -
命令su和su - 均可用于账户切换,但推荐用su - ,可模拟完整登录流程:
- 1.自动切换到目标用户家目录(切 root 直接到 /root);
- 2.清空原有环境变量,完整加载目标用户的 profile、bashrc;
- 3.PATH、HOME、用户自定义环境全部重置为 root,所有系统管理命令正常识别;
- 4.完全还原登录 root 后的状态,和直接从终端登录 root 行为一致。
不管是切 root,还是切换其他普通用户,逻辑都通用,不会产生环境兼容问题。
格式:su - 账户名
注意:不加账户名,默认切root用户。从root用户切换到任何用户不需要密码验证,而从普通用户到root或其他普通用户均需要输入目标用户的密码且验证成功后才可切换。从root切换到普通用户,再切换回root时,用logout指令,否则环境可能会出问题!
例:
8.4 控制用户对系统命令的使用权限——visudo
例:输入指令
visudo
在文件/etc/sudoers.tmp中加入要放权的用户,保存退出。账户名 允许使用的主机=(以谁的身份) 可执行的命令列表

此时切换到放权的用户,直接使用依旧会报错,需要在指令前加上sudo,读取在文件/etc/sudoers.tmp中新加的内容,再输入放权用户的密码,即可执行指令。

或在文件中直接写入无需密码。

也可以只给普通用户部分权限。
例:在普通用户中输入指令systemctl restart sshd,无法执行。找到此命令所在的路径,切回root,用visudo指令在文件中加入此路径。


此时再切回普通用户,sudo 指令即可运行。

若需加多个权限,用, 隔开即可。

8.5 工作组管理
8.5.1 创建工作组——groupadd
格式:groupadd 参数 工作组名
参数:-g 指定新工作组的GID
注意:创建用户时,系统默认自动生成一个和用户名同名的私有组
例:新建工作group1,再新建一个组group2,并指定其GID为1010

可以在创建用户时为其指定主组和附加组。

查看/etc/group文件,含义为:组名:密码占位符x:GID:附属用户列表
可以看到group1是用户test2的附加组。
8.5.2 修改工作组——groupmod
为用户组指定新的组标识号:groupmod -g 组名
修改用户组的名称:groupmod -n 组名
例:将组group1的GID修改为1020,组名修改为group11
8.5.3 删除工作组
格式:groupdel 工作组名
注意:被删除的组若是主组,则必须先删除引用该主组的用户,然后再删除该主组。假如此组只作为一个用户的主组,那么在删除这个用户时,此组也会被删除。例如,创建一个用户user1,那么系统同时会创建组user1,紧接着删除用户user1,组user1也会被删除。
例:设group1为test用户的主组。

此时无法删除group1。

将test主组改为test2,此时group1不再是任何用户的主组,尽管group1是test2的附加组,也可以直接删除。

8.5.4 添加/删除组成员——gpasswd
格式:gpasswd 参数 账户 工作组
| 常用参数 | 含义 |
|---|---|
| -r | 删除组密码 |
| -a | 把用户加入组 |
| -d | 把用户从组中删除 |
| -M | 同时添加多个用户,但会覆盖原有的组成员 |
| -A | 给组指派管理员 |
例:新建账户temp3、temp4后加入group2组,并指派temp3为group2工作组的管理员

8.6 查看用户登录系统的情况
8.6.1 查看当前登录系统的用户——users
例:

8.6.2 查看目前与过去登入系统的用户相关信息——last
查看最近”数字“条登录信息:last -数字
命令默认会去读取/var/log/wtmp文件。
例:

若想清除这些信息,对文件进行输出重定向即可。

8.6.3 查看每个账号的最近登录时间——lastlog
该命令会读取/var/log/lastlog文件。
例:

8.6.4 查看当前正在登录系统的用户信息——who
例:

每一列含义:
| 列序号 | 含义 |
|---|---|
| 1 | 登录用户名 |
| 2 | 终端类型,tty:本地物理终端(显示器键盘登录),pts:远程 SSH、图形终端虚拟控制台 |
| 3 | 登录时间,括号内容:远程登录 IP,本地登录无括号 |
加参数:
精简输出:仅用户名 + 在线总人数:who -q
查看系统上次开机时间:who -b
显示表头:who -H
查看当前系统运行级别:who -r
显示空闲时长、进程 PID:who -u
全部信息汇总:who -a
第九章 Linux文件系统权限
9.1 文件的一般权限
9.1.1 文件详细信息
命令:ll或ls -l
含义:
9.1.2 文件权限构成
访问者三种权限
| 权限项 | 读 | 写 | 执行 |
|---|---|---|---|
| 字符表示 | r | w | x |
| 数字表示 | 4 | 2 | 1 |
组成模式分析
| 字符表示 | 数字表示 |
|---|---|
| - - - | 0 |
| - - x | 1 |
| -w- | 2 |
| -wx | 3 |
| r– | 4 |
| r-x | 5 |
| rw- | 6 |
| rwx | 7 |

文件与目录权限含义
| 权限 | 对文件的影响 | 对目录的影响 |
|---|---|---|
| r(read) | 可以读取文件的内容 | 可以列出目录的内容,即目录下的文件的文件名 |
| w(write) | 可以更改文件的内容 | 可以创建或者删除目录中的任一文件(只有w权限无法创建删除文件,需要和x权限一起使用) |
| x(execute) | 可以作为可执行文件,如脚本 | 可以切换到目录,如cd命令 |
注意:root账户不受文件权限的读写限制,执行权限受限制
9.1.3 修改文件或目录的权限——chmod
格式:chmod [对象][操作][权限] 文件/目录
对象:
- u:user 文件属主
- g:group 文件属组
- o:other 其他用户
- a:all 全部用户(u+g+o)
操作符:
- +:增加权限
- -:移除权限
- =:直接赋值权限(覆盖原有)
例:

也可以直接用数字组成模式改变权限:

重要参数:-R 用于递归修改,目录专用,修改目录 + 内部所有子文件、子目录权限
例:chmod -R 770 /home/test
把 /home/test 目录及其内部全部内容设置权限:文件夹主人、同组用户拥有全部读写操作权限,系统里别的用户完全禁止访问。
9.1.4 修改文件或目录的所有者和属组——chown
格式:
-
-
只改所有者
chown 用户名 文件/目录
-
-
-
同时改所有者+属组(冒号分隔)
chown 用户:组 文件/目录
-
-
-
只改属组(前面留空,只写 :组名)
chown :组名 文件/目录
-
也可加参数-R,作用同上。
9.1.5 补充知识点
路径里「/文件夹」和「文件夹/」完全不是一回事
- /文件夹= 绝对路径,代表从根目录 / 开始
/dir1:根目录下的 dir1,不管你当前在哪个文件夹,都定位到 /dir1 - /文件夹= 标记这是一个目录(文件夹)
dir1/:dir1 是文件夹,mv file dir1/是要把文件放进这个目录内部
9.2 特殊权限
9.2.1 SUID 权限
使用场景:程序运行时以「文件主人」身份执行,和当前登录用户无关。
格式:chmod u+s 文件名或chmod u-s 文件名或chmod 4XXX 文件名
其中XXX为权限的数字组成模式。
注意:文件无执行权限(x)时,SUID 大写 S 失效。
例:在root下查看文件权限,对于 /etc/shadow 文件,所有用户无任何权限。
对于 /usr/bin/passwd 文件,属主执行位是小写s,代表开启 SUID,文件属主是 root。

切换到普通用户temp1,无法直接读取/etc/shadow,但可以修改密码。

切回root,移除 /usr/bin/passwd 的 SUID 权限,查看权限, s 变为 x。

此时再切回temp1修改密码,报错。

9.2.2 SGID 权限
- 作用在可执行文件
任何人运行程序,临时获得文件属组的权限。 - 作用在目录
在该目录下新建的所有文件 / 子目录,自动继承目录的属组,而不是创建者自己的主组。
格式:chmod g+s 文件名或chmod g-s 文件名或chmod 7XXX 文件名
其中XXX为权限的数字组成模式。
注意:文件无执行权限(x)时,SGID 大写 S 失效。
例:两个用户加入组g1。

建共享目录,开启SGID。

切换到user1,在/share中新建文件b.txt,查看其所属组,不是user1,而是g1。
切换到user2,可直接修改这个文件,无权限报错。
9.2.3 Sticky Bit 权限
作用(只对目录生效,文件没用):文件只能被文件自己的主人、root 删除,其他人就算目录有写权限也删不掉别人的文件。
例如,所有人都能往 /tmp 写文件,但你删不掉别人创建的临时文件,靠的就是 Sticky Bit。
格式:chmod o+t 目录名或chmod o-t 目录名或chmod 1XXX 目录名
其中XXX为权限的数字组成模式。
9.3 ACL 权限
作用:给指定的用户指定目录分配指定的权限。
查看 ACL 权限:getfacl 文件名
设定 ACL 权限:setfacl -m 类型:用户(组)名:权限 目录
类型:u给单个用户加权限;g给单个组加权限
权限:r、w、x任意组合
删除 ACL 权限:setfacl -x 类型:用户(组)名 目录
例:root用户在根目录下创建目录/project及所属工作组QQgroup,所属组里面创建两个用户zhangsan和lisi,此文件权限是770,再创建一个旁听用户 pt,给他设定/project目录的 ACL 为 r-x 。

9.4 权限掩码 umask
umask 数字代表:创建文件时,需要去掉的权限
新建文件夹,系统初始给满权限:777(rwxrwxrwx)
新建普通文件,系统不给执行权限,初始上限:666(rw-rw-rw-)
默认 umask=022
拆开三位:0 2 2
第一位 0:所有者,什么权限都不删
第二位 2:所属组,删掉写 w 权限
第三位 2:其他人,删掉写 w 权限
新建目录(初始 777 rwxrwxrwx)
去掉组 w、其他人 w
剩下:rwxr-xr-x → 777 - 022 = 755
新建文件(初始 666 rw-rw-rw-)
去掉组 w、其他人 w
剩下:rw-r–r-- → 666 - 022 = 644
查看默认 umask 值:umask
临时修改默认 umask:umask 权限的数字组成模式
临时修改重启失效,永久改要写入 /etc/profile,但默认umask 022最安全,新建文件别人只有只读权限,不容易泄露文件内容;乱改全局会影响所有用户新建文件的权限。
第十章 管理Linux的联网
10.1 配置网络
10.1.1 nmcli命令
可以实现创建,显示,编辑,删除,激活和停用网络连接以及控制和显示网络设备状态等.
想要使用此命令,必须保证NetworkManager服务是开启的。

- 列出系统所有网络连接配置文件:
nmcli c s
可以看到,由于此前我们将网卡接口从ens33改为eth0,显示ens33未激活。

- 删除网络连接:
nmcli c del 连接名

- 修改连接名:
nmcli c mod 原连接名 con-name 新连接名
注意:若连接名中有空格,需加\使特殊字符失效

- 关闭网络连接:
nmcli c down 连接名

- down掉后需要在虚拟机进行激活,此时查看IP,已经不见
查看连接状态,显示eth0未激活
激活网络连接:nmcli c up 连接名

- 添加以太网网络连接:
nmcli c add type ethernet ifname 连接名 con-name 网卡接口 autoconnect yes

- 设置静态IP:
nmcli c mod 连接名 ipv4.method manual ipv4.addresses IP地址/掩码 ipv4.gateway 网关地址 ipv4.dns 'DNS1,DNS2'

- 增加IP地址:
nmcli c mod 连接名 +ipv4.addresses IP地址/掩码
10.1.2 修改配置文件
从CentOS 8开始,默认配置都在/etc/NetworkManager/system-connections
但我们使用的CentOS 7在如下文件中:

要修改配置,先用指令systemctl disable --now NetworkManager关闭NetworkManager服务,再用指令vim ifcfg-eth0直接进入此页面进行编辑即可,完成编辑后保存退出,再用指令systemctl restart network重启生效。

10.2 ping命令
- 用来检测网络的连通情况和分析网络速度
- 根据域名得到服务器 IP
- 根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。
指定发包数量:ping -c 数字 目标主机IP或域名
发送指定数量数据包后自动退出,不用 Ctrl+C 终止
指定发包间隔:ping -i 数值 IP
普通用户最小间隔 0.2s,root 可设更小
指定数据包大小:ping -s 自定义字节大小 IP地址或域名
10.3 域名静态解析
通过配置/etc/hosts文件实现域名解析
例:
vim /etc/hosts


注意:解析只负责返回 IP,不校验这个 IP 是否可达
10.4 从网站下载文件
10.4.1 wget命令
用于在终端命令行里下载网络文件
格式:wget 参数 下载地址
| 参数 | 作用 |
|---|---|
| -P | 下载到指定目录 |
| -t | 最大尝试次数 |
| -b | 后台下载模式 |
| -c | 断点续传 |
| -p | 下载页面内所有资源,包括图片、视频等 |
| -r | 递归下载 |
10.4.2 curl命令
作用:通过http、https、ftp等方式下载/上传文件
不带任何参数时:curl 网址
默认发送 GET 请求,把目标网页的完整 HTML 源码直接打印输出到终端。
10.5 VMware三种网络模式
VMware提供三种网络工作模式:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。我们用的是NAT模式。
- 桥接模式
- 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信
- 在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰
- 在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致
- NAT模式
- NAT模式是利用虚拟的NAT设备以及虚拟DHCP服务器来使虚拟机连接外网,VMware Network Adapter VMnet8虚拟网卡是用来与虚拟机通信的
- 如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择
- 仅主机模式
- Host-Only模式其实就是NAT模式去除了虚拟NAT设备,然后使用VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的
- Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯
第十一章 管理Linux软件包和进程
11.1 源码下载安装软件
-
概念
- 源码文件:程序编写者使用C或C++等语言编写的原始代码文本文件
- 源码文件使用.tar.gz或.tar.bz2打包成压缩文件
-
特点
-
源码包可移植性好,与待安装软件的工作环境依赖性不大
-
由于有编译过程,其代码运行效率较高,是针对当前使用者环境的“量体裁衣”
-
安装功能可以定制,可以选择需要的功能进行安装
-
卸载方便,只需删除对应安装目录即可,没有Windows“注册表”的概念
-
安装过程较为麻烦
-
-
安装过程
-
下载解压缩源码压缩包
-
分析安装软件环境
-
编译软件
-
安装软件
-
例:
- 准备工作:
进入nginx.org网址,点击右侧download

点击此版本进行下载

下载好后可以直接拖到目录中

也可复制链接,用wget命令直接下载到Linux里


解压缩:tar zxf nginx-1.30.3.tar.gz
- 安装环境分析:
切换到解压缩后的目录,运行指令
./configure --with-http_ssl_module --with-http_stub_status_module
用于开启两个核心内置模块,编译出支持 HTTPS、状态监控功能的 Nginx 程序,可以看到结果有报错,安装对应的包解决报错

完成后再运行指令
./configure --with-http_ssl_module --with-http_stub_status_module
依旧有报错,再解决,直到没有报错。

- 编译软件:
格式:make

- 安装软件:
格式:make install

找到nginx所在的路径

编辑.bash_profile文件,将路径写入,保存退出
[root@server2 ~]# vim .bash_profile

使其生效后,可查找到新加入的路径

运行并检测,显示已经可以访问

在浏览器地址栏输入虚拟机IP地址,也显示可访问。

11.2 RPM管理工具
-
RPM安装软件要求
-
软件安装环境必须与打包软件环境一致
-
必须满足软件依赖性
-
软件卸载时必须小心,最底层软件不能先卸载
-
-
rpm查询功能
格式:rpm –q 包名-q常与下面参数组合使用
| 参数 | 作用 |
|---|---|
| -a | 查询所有已安装的软件包 |
| -l | 显示已安装软件包的相关文件列表和信息 |
| -f | 查询文件所属软件包 |
| -i | 显示已经安装的rpm软件包信息 |
例:
# 查询某个包有没有安装
[root@server ~]# rpm -q httpd
# 查询所有已经安装的包
[root@server ~]# rpm -qa
# 查询安装该包后会产生哪些文件
[root@server /]# rpm -ql gcc
#查询该文件由哪个软件包产生
[root@server /]# rpm -qf /usr/bin/ls
coreutils-8.30-12.el8.x86_64
11.3 YUM/DNF管理工具
11.3.1 YUM/DNF 功能
- 在线下载、 安装、 卸载、 升级rpm软件包
- 自动查找并解决rpm包之间的依赖关系,一次性安装所有具有依赖关系的rpm包,而无需管理员逐个、 手工地去安装每一个rpm包
11.3.2 命令
# 查看包、包组相关信息
yum repolist [all] # 查看系统中yum资源库配置信息
yum list all # 列出仓库里所有可安装的软件包
yum list installed [包名] # 列出己经安装的所有的或指定的rpm包(包名中可使用匹配符)
yum info 包名 # 查看指定软件包的详细信息
yum grouplist # 查看仓库里而所有包组
yum groupinfo 包组名 #查看指定包组里而的详细信息
# 安装、更新包和包组
yum install [-y] 包名 # 安装指定的软件包,-y则在工作过程中需要使用者响应, 这个选个参数可以直接回答yes
yum update [-y] 包名 # 升级指定的软件包或主机中所有已安装的软件包
yum groupinstall 包组名 # 安装指定包组里面的所有包
# 卸载软件包
yum remove [-y] 包名 # 卸载已经安装在系统中的指定的软件包
# 搜索文件由哪个包产生
yum provides 文件名 # 查找指定的文件属于哪个包
yum whatprovides /etc/fstab # 查看这个文件是由那个包提供的
# 模糊搜索包名
yum search 模糊包名 # 查看模糊包名的软件包
# 清空缓存
yum clean packages all # 清除下载到本机的指定的软件包或所有软件包的yum源缓存
11.3.3 配置YUM源
11.3.3.1 建立本地源
- 禁用aliyun的三个源
[root@server2 yum.repos.d]# vim CentOS-Base.repo

- 查看发现已无源
[root@server2 yum.repos.d]# yum repolist

- 挂载光驱
[root@server2 ~]# mount /dev/cdrom /media

- 编辑本地源
[root@server2 yum.repos.d]# vim local.repo

| 行号 | 意义 |
|---|---|
| 1 | 仓库 ID,自定义名称 |
| 2 | 仓库描述名称,纯展示文本 |
| 3 | 软件包仓库真实地址,yum 从这里读取 rpm 包和索引:file:// 代表本地文件协议(光盘 / 本地文件夹);/media/ 是本地目录路径;要求这个目录下一层必须直接有 repodata 文件夹(光盘挂载后的索引目录),也就是 /media/repodata/ 存在,否则源失效。 |
| 4 | 是否开启 GPG 签名校验,1开启,0关闭 |
| 5 | 是否启用该软件源,1启用,0禁用 |
配置完成后可查看到本地源

- 重建缓存
[root@server2 yum.repos.d]# yum makecache
[root@server2 yum.repos.d]# yum repolist

11.3.3.2 建立网络源
- 禁用本地源,重启aliyun源
[root@server2 yum.repos.d]# vim local.repo

[root@server2 yum.repos.d]# vim CentOS-Base.repo

- 重建缓存
[root@server2 yum.repos.d]# yum makecache
[root@server2 yum.repos.d]# yum repolist

- 生成repodata包
[root@server2 yum.repos.d]# yum install createrepo
createrepo 是用来生成 yum 仓库索引 repodata 的工具:
把一堆 rpm 软件包所在目录,生成repodata文件夹,yum 才能识别这个目录为可用软件源。
你本地光盘里自带 repodata,是镜像出厂做好的;如果自己放 rpm 包自建文件夹源,就必须用 createrepo 生成索引。
在Packages中有很多现成的rpm包
建立一个新的文件夹registry,拷贝一些rpm包,在此文件夹中生成一个repodata包
[root@server2 Packages]# mkdir /registry
[root@server2 Packages]# cp tuned-2.11.0-9.el7.noarch.rpm zip-3.0-11.el7.x86_64.rpm zlib-1.2.7-18.el7.x86_64.rpm /registry
[root@server2 Packages]# cd /registry
[root@server2 registry]# ls
[root@server2 registry]# createrepo .

- 将源分享到网络中
新开一个虚拟机server1,我想将server2的资源共享给server1
httpd 是 CentOS/RHEL 系统里的 Apache Web 服务器,用来搭建网站、提供网页访问,也常用来做局域网 YUM 网络源(把本地仓库通过 http 共享给多台机器)
在server2安装httpd协议,设置服务开机自启并立即启动
[root@server2 registry]# yum install httpd
[root@server2 registry]# systemctl enable --now httpd
测试httpd是否生效:curl localhost

或在浏览器输入server2的虚拟IP,即可查看

html是阿帕奇的默认发布目录,将要共享的数据放进此目录,即将registry目录放进/var/www/html中

在网站的ip地址后加上文件夹名,即可访问其中的资源

在server1中将网络源全部禁掉
[root@server1 yum.repos.d]# vim CentOS-Base.repo

新建一个本地库,将访问网址写入
[root@server1 yum.repos.d]# vim local.repo

查看当前启用的库,可看到刚刚上传的三个资源包
[root@server1 yum.repos.d]# yum repolist

11.3.4 管理进程
程序、进程、线程
-
程序: 二进制文件,文件存储在磁盘中,例如/usr/bin/目录下
-
进程:进程是已启动的可执行程序的运行实例
-
进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程
-
线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
-
一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有
-
线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行。
进程分类

查看进程
- ps命令
用于显示某个时间点的程序运行情况
格式:ps 参数
| 参数 | 作用 |
|---|---|
| -a | 显示所有用户的进程 |
| -u | 显示用户名和启动时间 |
| -x | 显示 没有控制终端的进程 |
- top命令
用于实时查看系统CPU、内存、负载、所有运行进程,动态刷新
格式:top
强制结束进程
格式:kill 进程名/pid或killall 进程名/pid
第十二章 磁盘管理
12.1 虚拟机添加新硬盘







完成后重启SSH终端可查看

12.2 硬盘分区
12.2.1 MBR分区
概念
- MBR(Master Boot Record,主引导记录)包含硬盘一系列参数和一段引导程序,硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序
- MBR是由分区程序(如Fdisk.exe)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存
- MBR位于整个硬盘的0磁道0柱面1扇区
- 主引导扇区512B
- MBR=446B
- MPT(Disk Partition Table硬盘分区表)=64B
- 最后两个字节“55,AA”是分区的结束标志
分区类型
-
主分区(primary partition)
- 一块硬盘最多4个主分区,主分区不可以再进行二次分区
- 主分区可以直接建立文件系统,存放数据
- 可以用来引导、启动操作系统
-
扩展分区(extended partition)
- 一块硬盘最多一个扩展分区,加主分区最多4个
- 不能创建文件系统
- 可以划分逻辑分区
-
逻辑分区(logical partition)
- 可以创建文件系统,存放数据
- 逻辑分区的数量没有限制。
-
支持的分区数量:4个主分区或者3个主分区1个扩展分区
12.2.2 使用fdisk管理分区
-
fdisk命令工具默认将磁盘划分为MBR格式的分区
-
命令:fdisk 设备名
-
注意:fdisk命令以交互方式进行操作的,在菜单中选择相应功能键即可

| 指令 | 作用 | 指令 | 作用 |
|---|---|---|---|
| a | 调整磁盘的启动分区 | p | 显示当前磁盘的分区信息 |
| d | 删除磁盘分区 | t | 更改分区类型 |
| l | 显示所有支持的分区类型 | u | 切换所显示的分区大小单位 |
| m | 查看所有指令的帮助信息 | n | 创建新分区 |
| q | 不保存更改,退出fdisk命令 | w | 把修改写入磁盘分区表,然后退出fdisk命令 |
| g | 新建一个空的GPT分区表 | o | 新建一个空的DOS分区表 |
- 将刚刚新加的20G硬盘分为10G+10G

用指令lsblk可以查看分区

继续分剩余容量
[root@server2 ~]# fdisk /dev/sdb
[root@server2 ~]# lsblk

图中可以看出,需要重启才能生效,或用partprobe指令让 Linux 内核重新读取磁盘分区表

12.2.3 格式化
要想使用此分区,需要先进行格式化
格式:mkfs.xfs 硬盘分区名或mkfs.ext4 硬盘分区名
大容量推荐使用第一种
对/dev/sdb1进行格式化

对/dev/sdb2进行格式化

12.2.4 挂载
- 可以使用盘的名称进行挂载
[root@server2 ~]# mkdir /sdb1
[root@server2 ~]# mount /dev/sdb1 /sdb1
- 但更推荐使用UUID进行挂载,其具有唯一性,不易出错
指令blkid可以查看UUID

[root@server2 ~]# mount UUID="9aeeb30b-828f-4fd3-93a5-d8572a02d0bc" /sdb1
但此种方式在开机重启之后就会失效,因此要写入文件/etc/fstab中,确保其不会失效
[root@server2 ~]# vim /etc/fstab

- 验证是否写入成功
[root@server2 ~]# umount /sdb1 #取消挂载
[root@server2 ~]# df -h #查看是否取消成功
[root@server2 ~]# mount -a #此指令会读取/etc/fstab,全部挂载
[root@server2 ~]# df -h #查看挂载情况,/sdb1已挂载,说明写入成功

- 用同样的方式对
/sdb2进行挂载


-
特殊挂载:增加swap分区
swap分区:类似于Windows系统虚拟内存的功能,将一部分硬盘空间虚拟成内存来使用,从而解决内存容量不足的情况,因为swap毕竟是用硬盘资源虚拟的,所以速度上比真实物理内存要慢- 查看:
[root@server2 ~]# free -h
[root@server2 ~]# free -m

例:/dev/sdb中划分2G空间为swap分区并启用
[root@server2 ~]# fdisk /dev/sdb
[root@server2 ~]# mkswap /dev/sdb1
[root@server2 ~]# swapon -s

开机自动激活,也需要将挂载方式写入/etc/fstab文件

[root@server2 ~]# swapon -a
当不想要时,需要删除写入文件的内容,再禁用
[root@server2 ~]# vim /etc/fstab
[root@server2 ~]# swapoff /dev/sdb1
12.3 查看磁盘空间使用量
12.3.1 df命令
- 列出文件系统的磁盘空间占用情况
- df,disk free,通过文件系统来快速获取空间大小的信息,当我们删除一个文件的时候,这个文件不是马上就在文件系统当中消失了,而是暂时消失了,当所有程序都不用时,才会根据OS的规则释放掉已经删除的文件, df记录的是通过文件系统获取到的文件的大小,他比du强的地方就是能够看到已经删除的文件,而且计算大小的时候,把这一部分的空间也加上了,更精确了
- 格式:
df 参数 目录或文件名
| 参数 | 作用 |
|---|---|
| -a | 列出所有的文件系统,包括系统特有的/proc等文件系统 |
| -k | 以KB的容量显示各文件系统 |
| -m | 以MB的容量显示各文件系统 |
| -h | 以人们较易阅读的GB,MB,KB等格式自行显示 |
| -H | 以M=1000K替代M=1024K的进位方式 |
| -T | 连同该分区的文件系统名称(例如ext3)也列出 |
| -i | 不用硬盘容量,而以inode的数量来显示 |
12.3.2 du命令
- du:显示磁盘空间使用量(统计目录或文件所占磁盘空间大小),在默认情况下,文件大小的单位是KB。
- du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的。他计算的大小就是当前他认为存在的所有文件大小的累加和,当文件系统也确定删除了该文件后,这时候du与df就一致了
- 格式:
du 参数 文件或目录名
| 参数 | 作用 |
|---|---|
| -a | 列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已; |
| -h | 以人们较易读的容量格式(G/M)显示; |
| -s | 列出总量,而不列出每个个别的目录占用了容量; |
| -S | 不包括子目录下的总计,与-s有点差别; |
| -k | 以KB列出容量显示; |
| -m | 以MB列出容量显示 |
12.4 管理逻辑卷
12.4.1 工作原理
产生原因
-
硬盘分区或部署为RAID后在修改分区大小时就非常不容易,此时用户随着实际的需求变化而动态调整硬盘分区大小时受到限制,无灵活性
-
LVM(Logical Volume Manager)允许用户对硬盘资源进行动态调整
认识Linux逻辑卷
-
LVM是 Logical Volume Manager(逻辑卷管理)的简写,LVM将若干个磁盘或者磁盘分区连接为一个整块的卷组,形成一个存储池。
-
通过LVM技术,屏蔽了磁盘分区的底层差异,管理员可以在卷组上任意创建逻辑卷,并进一步在逻辑卷上创建文件系统
-
管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。
-
假设有三块磁盘/dev/sdb、/dev/sdc和/dev/sdd用来划分逻辑卷,LVM模型如图所示:

LVM基本概念
- PE(physical extent)物理区域:物理区域是物理卷中可用于分配的最小存储单元,物理区域的大小默认为4MB。物理区域大小一旦确定将不能更改,同一卷组中的所有物理卷的物理区域大小需要一致
- 物理卷(physical volume):简称PV,物理卷可以是整个硬盘、硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数
- 卷组**(Volume Group)**:简称VG,可以看成单独的逻辑磁盘,建立在PV之上,一个卷组中至少要包括一个PV,在卷组建立之后可以动态的添加PV到卷组中。卷组的名称可以自定义
- 逻辑卷(logical volume):简称LV,相当于物理分区。逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态的扩展或缩小空间。系统中的多个逻辑卷,可以属于同一个卷组,也可以属于不同的多个卷组
12.4.2 部署逻辑卷
常用的LVM部署命令
| 功能/命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
|---|---|---|---|
| 扫描 | pvscan | vgscan | lvscan |
| 建立 | pvcreate | vgcreate | lvcreate |
| 显示 | pvdisplay | vgdisplay | lvdisplay |
| 删除 | pvremove | vgremove | lvremove |
| 扩展 | vgextend | lvextend | |
| 缩小 | vgreduce | lvreduce |
例:创建、格式化、挂载逻辑卷,并设置开机自启pv——>vg——>lv
- 创建
[root@server2 ~]# fdisk -l /dev/sdb #查看第二块磁盘 /dev/sdb 的分区整体信息
[root@server2 ~]# pvcreate /dev/sdb #创建物理卷 PV
[root@server2 ~]# pvs #查看所有物理卷简要信息
[root@server2 ~]# vgcreate vg0 /dev/sdb #创建卷组 VG
[root@server2 ~]# vgs #查看卷组简要信息
[root@server2 ~]# vgdisplay vg0 #查看 vg0 卷组完整详细信息
[root@server2 ~]# lvcreate -L 10G -n lv1 vg0 #从 vg0 卷组创建逻辑卷 LV
[root@server2 ~]# lvs #查看所有逻辑卷简易信息
[root@server2 ~]# ll /dev/vg0/lv1 #查看逻辑卷对应的设备软链接文件

- 格式化
[root@server2 ~]# mkfs.xfs /dev/vg0/lv1

- 挂载
[root@server2 ~]# mkdir /lvm
[root@server2 ~]# mount /dev/vg0/lv1 /lvm
[root@server2 ~]# df

- 设置开机自启动
[root@server2 ~]# blkid
[root@server2 ~]# vim /etc/fstab
[root@server2 ~]# mount -a
[root@server2 ~]# df

文件/etc/fstab编辑内容

12.4.2 调整逻辑卷大小
例:对lv1进行扩容:分为逻辑卷扩容和分区扩容两部分
- 逻辑卷扩容
[root@server2 ~]# lvextend -L +10G /dev/vg0/lv1
[root@server2 ~]# lvextend -l +2559 /dev/vg0/lv1
[root@server2 ~]# vgs
[root@server2 ~]# lvs
[root@server2 ~]# df -h /lvm

- 分区扩容
[root@server2 ~]# xfs_growfs /dev/vg0/lv1
[root@server2 ~]# df -h /lvm

- 删除逻辑卷
[root@server2 ~]# umount /lvm
[root@server2 ~]# lvremove /dev/vg0/lv1
[root@server2 ~]# vgremove vg0
[root@server2 ~]# pvremove /dev/sdb

切记要将/etc/fstab文件中的挂载信息删除,否则系统将无法启动
第十三章 综合项目——搭建论坛
13.1 项目架构
整体结构
-
使用LNMP环境+Discuz论坛源程序
-
LNMP= Linux + Ngnix + mariadb + PHP
Nginx
-
最初于2004年10月4日为俄罗斯知名门户站点而开发的
-
Nginx是一款轻量级的网站服务软件,因其稳定性和丰富的功能而深受信赖
-
特点:低系统资源、占用内存少且并发能力强,是目前主流网站使用的http服务程序
Mariadb
- Mariadb是一种数据库软件
- 由开源社区维护,是MySQL的分支,几乎完全兼容MySQL,两者性能基本一致,操作十分相似
PHP
- PHP(Hypertxt Preprocessor,超文本预处理器)是一种通用的开源脚本语言,发明于 1995年,它吸取了 C 语言、Java 语言及 Perl 语言的很多优点,具有开源、免费、快捷、跨平台性强、效率高等优良特性,是目前 Web 开发领域最常用的语言之一
- Discuz默认使用PHP编写
Discuz
- Discuz一套通用的社区论坛软件系统
- 自2001年6月面世以来,Discuz!已拥有15年以上的应用历史和200多万网站用户案例,是全球成熟度、覆盖率最大的论坛软件系统之一
- 2010年8月23日被腾讯收购
- 网址:https://www.discuz.vip/
13.2 项目准备
- 安装数据库
[root@server2 ~]# yum install -y mariadb-server
[root@server2 ~]# systemctl enable --now mariadb
[root@server2 ~]# mysql_secure_installation #设置密码
[root@server2 ~]# mysql -p
出现以下页面即为成功

- 安装PHP
[root@server2 ~]# yum search scl

找到上图中的包并安装
[root@server2 ~]# yum install -y centos-release-scl.noarch
安装完成后可找到如下两个文件
- 修改上一步找到的两个配置文件中的路径
在镜像网站中找到此页面,根据此页面的地址修改配置文件中的路径


出现如下界面即为成功
[root@server2 yum.repos.d]# yum repolist

- 还需安装
[root@server2 ~]# yum install rh-php73.x86_64 rh-php73-php-mysqlnd.x86_64
- 下载Discuz安装包
将安装包拖入/root并解压
[root@server2 ~]# ls
[root@server2 ~]# unzip Discuz_X3.5_SC_UTF8_20260504.zip
- 将
upload/中的文件上传到nginx的发布目录
[root@server2 upload]# ls /usr/local/nginx #确认nginx已安装
[root@server2 upload]# systemctl disable --now httpd #禁用httpd
[root@server2 upload]# mv * /usr/local/nginx/html #将upload/中所有文件移动到nginx的发布目录/usr/local/nginx/html
- 修改文件权限,否则会报错
[root@server2 upload]# cd /usr/local/nginx/html
[root@server2 html]# ls
[root@server2 html]# chmod -R 777 config data uc_client uc_server

- 安装解析PHP服务需要的软件,启动服务
[root@server2 html]# yum install -y rh-php73-php-fpm
[root@server2 html]# systemctl enable --now rh-php73-php-fpm
[root@server2 html]# netstat -antlp|grep :9000 #监测服务是否启动
13.3 部署项目
- 配置nginx
[root@server2 nginx]# vim /usr/local/nginx/conf/nginx.conf #编辑配置文件,修改内容如下图
[root@server2 nginx]# nginx -t #检查语法是否有误
[root@server2 nginx]# nginx #启动
[root@server2 nginx]# netstat -antlp|grep :80 #检查是否启动



- 网页设置
在浏览器网址栏输入虚拟机IP进行访问





进入管理后台,论坛已经搭建好了
首页出现如下提示
删除index.php文件,避免重新初始化
刷新一下就完成了
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)