课前练习

你是某企业的运维工程师,负责管理一台 CentOS7 服务器。该服务器原有 1 块 1TB 硬盘,用于存储数据库备份文件。因业务增长,硬盘容量不足,而且单块磁盘存在单点故障风险。

现在对服务器存储扩容,增加6块1TB(用20G模拟)硬盘:

  1. 通过软 RAID(MDADM)将这6块硬盘配置为 RAID5 。

    mdadm --creat /dev/md5 --level 5 --raid-devices 6 /dev/sd{b.g}
    
    
  2. 使用GPT管理raid5,将一半容量划分给第一个分区。

    [root@localhost ~ 09:11:18]# gdisk /dev.md5
    GPT fdisk (gdisk) version 0.8.10
    
    Problem opening /dev.md5 for reading! Error is 2.
    The specified file does not exist!
    [root@localhost ~ 09:11:28]# gdisk /dev/md5
    GPT fdisk (gdisk) version 0.8.10
    
    Partition table scan:
      MBR: not present
      BSD: not present
      APM: not present
      GPT: not present
    
    Creating new GPT entries.
    
    Command (? for help): o
    This option deletes all partitions and creates a new protective MBR.
    Proceed? (Y/N): y
    
    Command (? for help): n
    Partition number (1-128, default 1): 1
    First sector (34-209541086, default = 2048) or {+-}size{KMGTP}: 
    Last sector (2048-209541086, default = 209541086) or {+-}size{KMGTP}: +50G
    Current type is 'Linux filesystem'
    Hex code or GUID (L to show codes, Enter = 8300): 
    Changed type of partition to 'Linux filesystem'
    
    Command (? for help): w
    
    Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
    PARTITIONS!!
    
    Do you want to proceed? (Y/N): Y
    OK; writing new GUID partition table (GPT) to /dev/md5.
    The operation has completed successfully.
    #
    
  3. 将第一个分区格式化为xfs文件系统,并持久化挂载在 /webapp。

    [root@localhost ~ 09:14:52]# mkfs.xfs -f /dev/md5p1
    meta-data=/dev/md5p1             isize=512    agcount=16, agsize=819072 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=13105152, imaxpct=25
             =                       sunit=128    swidth=640 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=6400, version=2
             =                       sectsz=512   sunit=8 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@localhost ~ 09:15:13]# mkdir /webapp
    #临时挂载
    [root@localhost ~ 09:15:42]# mount /dev/md5p1 /webapp
    #实现持久化挂载,找到uuid将其按照标准格式补到最后一行
    [root@localhost ~ 09:17:12]# blkid /dev/md5p1
    /dev/md5p1: UUID="7966be17-4a3a-4917-98be-a03680021dfe" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUU52-b575-48c5-ac50-ba190e0c882e" 
    [root@localhost ~ 09:18:23]# vim /etc/fstab
    #确保持久化挂载启动
    mount -a
    
  4. 部署nginx服务器,web主目录为/webapp

    #下载nginx
    yum install -y nginx
    #设置nginx服务开机自启并立即启动
    systemctl enable nginx.service --now
    #追加welcome
    echo Welcome to Storage World.>>/webapp/index.html
    #查看nginx配置文件将“root /usr/share/nginx/html;”注释并另起一行加入 root /webapp
    vim /etc/nginx/nginx.conf
    #重新启动nginx服务
    systemctl restart nginx
    #查看
    curl http://localhost
    
  5. 欢迎界面为:Welcome to Storage World.

答案需提交以下命令结果:

  1. df -h /webapp
  2. grep root /etc/nginx/nginx.conf
  3. curl http://localhost

今天课堂内容

  1. Linux 交换空间管理
  2. 系统启动原理
  3. firewalld
  4. selinux

Linux 交换空间管理

计算机存储器的层次结构

计算机存储器速度越快,成本较高。 为了获得好的性能/价格比,计算机中各种存储器组成一个层状的塔式结构,取长补短,协调工作。

image-20240806110427884

  • CPU 寄存器,是 CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行需要的信息。
  • CPU 高速缓存,也就是CPU Cache,是一种容量小、速度快的高缓冲存储器,由SRAM组成,直接制作在CPU芯片内,速度几乎与CPU一样快。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。
  • 主存储器(Main memory),简称主存或内存,其作用是存放指令和数据,并能由中央处理器(CPU)直接随机存取。主存储器速度比CPU高速缓存慢,但存储容器却大的多。

主存储器的速度一般用存取时间衡量,即每次与CPU间数据处理耗费的时间,以纳秒(ns)为单位。大多数SDRAM内存芯片的存取时间为5、6、7、8或10ns。

主存储器的带宽计算公式:带宽=频率*位宽/8。

例如:DDR4 内存频率是3600 MHz,在64位系统(双通道位宽为128,以此类推),1B=8bit,

  • 单通道 DDR4-3600:3600MHz * 64bit / 8=28800MB/S
  • 双通道 DDR4-3600:3600MHz * 64bit * 2 / 8=57600MB/S
  • 辅助存储器,速度慢的多,优点是容量大,可持久化存储。

计算机存储器的工作原理

image-20221121184521720

  1. CPU运行程序时,先从寄存器中读取数据。如果在寄存器中可以找到数据,则直接从寄存器中读取。如果在寄存器中找不到数据,则从CPU Cache中读取数据,并将数据缓存在CPU Cache中。
  2. 如果在CPU cache中可以找到数据,则直接从CPU Cache中读取。如果在CPU cache中找不到数据,则从主存储器(内存)中读取数据,将数据缓存在主存储器中。
  3. 如果在内存中可以找到数据,则直接从内存中读取。如果在内存中找不到数据,则从辅助存储器中读取数据,例如机械磁盘、光盘、U盘等,并将数据缓存在内存中。

物理内存

计算机系统将内存划分为固定大小的块,称为 page,标准 page 大小为 4 KiB。进程并不直接对物理内存寻址,每个进程具有虚拟地址空间virtual address space。当进程请求内存时,MMU 将进程获得的虚拟地址(VA,Virtual Address )映射到物理地址(PA,Physical Address )。

MMU是Memory Management Unit的缩写,即内存管理单元,它是CPU中用来管理虚拟存储器、物理存储器的控制线路,负责将虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。

**思考:**为什么CPU不直接访问物理地址?

  1. 虚拟内存的容量是物理内存和交换空间的总和,而虚拟地址负责映射到物理内存地址和交换空间地址。
  2. 进程使用内存的过程中,希望内存是连续的。如果进程直接访问物理地址,则内核很难保证进程获得的物理地址空间是连续的,因为进程存在着运行和退出,就会出现内存碎片化。进程的虚拟地址在虚拟内存中是连续的,达到了内存连续的目的,而 MMU 会将进程的虚拟地址映射到物理地址。

Swap 空间

Swap,意思是“交换”、“实物交易”。Linux Swap(交换)空间是受Linux内核内存子系统控制的磁盘区域。

  • 功能1:当内存使用量超过定义的限制时,内核寻找已分配给进程但空闲的内存页,将该空闲的内存页写入到交换空间,并向其他进程重新分配RAM页面。
  • 功能2:如果某个程序需要访问磁盘上的页面,则内核会找到另一个空闲的内存页, 将其写入到磁盘,然后从交换区重新调用所需的页面。
  • 功能3:如果某个程序需要访问数据,访问的数据存放在交换空间,则该程序直接从交换空间读取数据,而不需要从磁盘原始位置读取,进而提高速度。

image-20221226162413218

简单地说,Linux Swap 空间就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。

**交换空间只是临时的解决办法。**虽然交换空间能够作为"虚拟"内存使用,但由于交换区位于磁盘上,它的速度比物理内存慢的多,因此如果需要更快的速度的话,最好的办法仍然是加大物理内存。

查看内存

# 默认单位是KiB,使用-m选项,以MiB为单位
[root@localhost ~ 10:53:30]# free
              total        used        free      shared  buff/cache   available
Mem:        4026120      157628     3761368       11852      107124     3688372
Swap:       4063228           0     4063228

输出说明:

  • Mem:
  • total:物理内存空间大小。
  • used:使用的内存 (total - free - buffers - cache)。
  • free:未使用的内存空间大小(真正的空闲,未被任何程序占用)。
  • shared:多个进程共享的内存空间大小。
  • cached:从磁盘读取的数据占用的内存空间大小,待以后使用(数据没有被修改)。
  • buffers:被更改但未写回磁盘的数据占用的内存空间大小。
  • Swap:
  • total:交换空间大小。
  • used:使用的交换空间大小。
  • free:未使用交换空间大小。

Swap 空间大小

管理员应根据系统的内存工作负载来调整交换空间大小。 应用供应商有时会提供这方面的建议。根据物理内存总量,下表提供了一些指导

物理内存(RAM) 交换空间 允许HIBERNATE时的交换空间
2GiB或以下 两倍的RAM 三倍的RAM
2GiB和8GiB之间 同等的RAM 两倍的RAM
8GiB和64GiB之间 至少4GiB 1.5倍的RAM
64GiB以上 至少4GiB 不建议Hibernate

笔记本电脑和台式机的Hibernate功能会在关闭系统电源之前使用交换空间来保存RAM内容。重新打开系统时, 内核将从交换空间恢复RAM内容,无需完全启动。 对于这些系统而言,交换空间需要超过RAM量。

分析操作系统自带的LVM结构

[root@localhost ~ 10:53:50]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   200G  0 disk 
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0   199G  0 part 
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0   3.9G  0 lvm  [SWAP]
  └─centos-home 253:2    0 145.1G  0 lvm  /home
sr0              11:0    1   4.4G  0 rom  

[root@localhost ~ 10:53:55]# pvs
  PV         VG     Fmt  Attr PSize    PFree
  /dev/sda2  centos lvm2 a--  <199.00g 4.00m
# sda2作为pv,使用剩余所有空间,归属卷组centos
# 在centos卷组中创建各种lv,提供不同的存储空间,例如/、/home、swap.

思考:如何从centos卷组中分配4G空间出来给新的swap使用?

[root@localhost ~ 10:53:58]# df -hT|grep -v tmpfs
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  1.6G   49G    4% /
/dev/mapper/centos-home xfs       146G   33M  146G    1% /home
/dev/sda1               xfs      1014M  139M  876M   14% /boot

发现:/home文件系统系统空间很大,但是使用空间非常少。缩减/home空间给其他应用使用。

/home文件系统是xfs,不支持缩减。可以备份数据后,再缩减空间。

#备份
[root@localhost ~ 10:55:30]# mv /home/shaka /backup
#检查数据备份是否成功
[root@localhost ~ 10:55:57]# ls /home
[root@localhost ~ 10:56:04]# ls /backup
shaka

# 缩减逻辑卷
[root@localhost ~ 10:56:11]# lvreduce -L 46G /dev/centos/home
  WARNING: Reducing active and open logical volume to 46.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce centos/home? [y/n]: y    Size of logical volume centos/home changed from <145.12 GiB (37150 extents) to 46.00 GiB (11776 extents).
  Logical volume centos/home successfully resized.

# 空间释放到卷组中
[root@localhost ~ 10:57:02]# vgs
  VG     #PV #LV #SN Attr   VSize    VFree 
  centos   1   3   0 wz--n- <199.00g 99.12g
#取消/home的挂载
[root@localhost ~ 10:57:07]# umount /home
[root@localhost ~ 10:57:39]# df -h /home
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  1.6G   49G    4% /
# 重新格式化并挂载
[root@localhost ~ 10:58:06]# mkfs.xfs -f /dev/centos/home
meta-data=/dev/centos/home       isize=512    agcount=4, agsize=3014656 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=12058624, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=5888, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~ 10:58:10]# grep home /etc/fstab
/dev/mapper/centos-home /home                   xfs     defaults        0 0
[root@localhost ~ 10:58:24]# mount -a
[root@localhost ~ 10:58:31]# df /home/
文件系统                   1K-块  已用     可用 已用% 挂载点
/dev/mapper/centos-home 48210944 32992 48177952    1% /home

#尝试切换用户,发现失败
[root@localhost ~ 10:58:36]# su - shaka
上一次登录:三 513 17:03:49 CST 202610.1.8.1pts/0 上
su: 警告:无法更改到 /home/shaka 目录: 没有那个文件或目录
-bash-4.2$ 

# 恢复数据
[root@localhost ~ 10:59:10]# cp -a /backup/shaka /home
# 验证用户登录
[root@localhost ~ 10:59:55]# su - shaka
上一次登录:五 522 10:58:53 CST 2026pts/0# 创建

创建交换空间

# 使用parted创建所需大小的分区并将其文件系统类型设置为linux-swap
[root@localhost ~ 11:41:26]# parted /dev/sdc mklabel gpt
信息: You may need to update /etc/fstab.
[root@localhost ~ 11:42:03]# parted /dev/sdc unit MiB mkpart swap01 linux-swap 1 2049
信息: You may need to update /etc/fstab.
[root@localhost ~ 11:42:38]# parted /dev/sdc unit MiB print               
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdc: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start    End      Size     File system  Name    标志
 1      1.00MiB  2049MiB  2048MiB               swap01

# 格式化swap空间
[root@localhost ~ 11:43:04]# mkswap /dev/sdc1
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=86b10a04-07c7-450e-ba4d-f19f903a4880

激活 swap 空间

# 激活swap空间
[root@localhost ~ 11:43:08]# swapon /dev/sdc1

# 查看swap设备列表
[root@localhost ~ 11:43:23]# swapon -s
文件名				类型		大小	已用	权限
/dev/dm-1                              	partition	4063228	0	-2
/dev/sdc1                              	partition	2097148	0	-3

默认情况下,多个交换空间具有相同的优先级时,系统会按顺序使用交换空间,即内核先使用第一个已激活交换空间,直至其空间已满,然后开始使用第二个交换空间。在激活交换分区的时候,可以为每个交换空间定义一个优先级,从而强制按该顺序使用交换空间。

swapon 命令使用-p选项指定优先级,优先级介于-1和32767之间,值越大优先级越高。

示例:

[root@centos7 ~]# swapon -p 4 /dev/sdb1

取消 swap 空间激活

[root@localhost ~ 11:43:29]# swapoff /dev/sdc1
[root@localhost ~ 11:44:09]# swapon -s
文件名				类型		大小	已用	权限
/dev/dm-1                              	partition	4063228	0	-2

持久化激活 swap 空间

修改/etc/fstab文件,添加如下类似记录:

UUID=86b10a04-07c7-450e-ba4d-f19f903a4880 swap swap pri=4 0 0

使用命令swapon -a激活/etc/fstab中所有交换设备。

使用命令swapoff -a取消/etc/fstab中所有交换设备激活。

[root@localhost ~ 12:35:52]# swapon -a
[root@localhost ~ 12:35:55]# swapon -s
文件名				类型		大小	已用	权限
/dev/dm-1                              	partition	4063228	0	-2
/dev/sdc1                              	partition	2097148	0	4


[root@localhost ~ 12:36:24]# free
              total        used        free      shared  buff/cache   available
Mem:        4026120      168088     3736916       11876      121116     3670904
Swap:       6160376           0     6160376

Linux 系统启动原理

CentOS 7 启动过程

现代计算机系统是硬件与软件的复杂组合。从加电状态开始,到拥有登录提示符的运行中系统,这需要大量的硬件和软件配合工作。

以下列表从较高层面概述了 CentOS7 启动过程。

启动过程

  1. 计算机接通电源。系统固件(现代UEFI或更旧的BIOS)运行开机自检(POST),并开始初始化硬件。

配置: 在系统启动早期,通过按特定的组合键,例如F2,配置系统固件。

  1. 系统固件搜索启动设备,根据固件配置的顺序搜索启动磁盘上的主启动记录(MBR)。系统固件从磁盘读取boot loader,然后将系统控制权交给boot loader,boot loader是GRand Unified Bootloader version 2(GRUB2)。

配置: 使用 grub2-install 命令进行配置,它将安装 GRUB2 作为磁盘上的启动加载器。

  1. GRUB2从/boot/grub2/grub.cfg文件加载配置并显示一个操作系统菜单,可以从中选择要启动的系统。

配置: 使用 /etc/grub.d/ 目录、/etc/default/grub 文件和 grub2-mkconfig 命令进行配置,以生成 /boot/grub2/grub.cfg 文件。

  1. boot loader根据选定条目的配置,从磁盘中加载kernel和initramfs,并将它们放入内存中。initramfs是一个存档,其中包含启动时所有必要硬件的内核模块、初始化脚本等等。

boot loader将控制权交给kernel,并同时将启动项的内核参数、initramfs在内存中的位置传递给kernel。内核在initramfs中找到所有硬件驱动程序,并初始化这些硬件。

配置: 使用 /etc/dracut.conf.d/ 用录、dracut 命令和 lsinitrd 命令进行配置,以检查 initramfs 文件。

  1. initramfs 执行/sbin/init,作为PID 1。在CentOS中,/sbin/init是一个指向systemd的链接。

配置: 使用内核参数init=command配置系统初始化程序。

  1. 随后,systemd会加载从内核命令行传递的target或者加载系统配置的default.target,该目标通常启动一个基于文本的登录或图形登录屏幕。

**配置:**使用systemctl设置默认target。

  1. default.target依赖sysinit.target,sysinit.target用于初始化系统,例如读取/etc/fstab挂载文件系统,激活systemd-journald等。

**配置:**使用/etc/fstab配置文件系统开机自动挂载。

  1. default.target还会激活开机启动的单元。

**配置:**使用systemctl设置开机启用服务。

  1. default.target还会激活getty.target,该target将打开tty1终端用于用户登录。

系统 target

普通文件和目录之间关系:

  • 普通文件:用来存储数据,例如MP3、mp4、fstab、passwd
  • 目录:用来组织文件系统分层结构,白话用来分组文件。

systemd使用类型为target的单元来分组不同单元,例如multi-user.target包涵chronyd.service、crond.service、firewalld.service等服务。

target还可以包涵其他target,例如graphical.target包涵multi-user.target,multi-user.target包涵basic.target,basic.target包涵sysinit.target。

使用以下命令查看target之间依赖关系:

[root@localhost ~ 16:25:26]# systemctl list-dependencies graphical.target
graphical.target
● ├─accounts-daemon.service
● ├─gdm.service
● ├─initial-setup-reconfiguration.service
● ├─network.service
● ├─rtkit-daemon.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● ├─udisks2.service
● └─multi-user.target
......

# 查看反向依赖
[root@localhost ~ 1:27:24]# systemctl list-dependencies sshd.service --reverse 
sshd.service
● └─multi-user.target
●   └─graphical.target

系统启动级别

传统的 SysVinit 系统定义了 7 个运行级别(0-6),每个级别有特定的作用,具体如下:

运行级别 target 作用描述
0 关机(halt):系统终止所有进程并关闭电源,对应命令 shutdown -h now
1 emergency.target rescue.target 单用户模式(single user mode):仅 root 用户可登录,无网络服务,用于系统修复(如密码找回)。
2 多用户模式(无 NFS):支持多用户登录,但不启动网络文件系统(NFS),部分发行版(如 Debian)默认此级别功能与级别 3 相同。
3 multi-user.target 完全多用户模式(文本界面):启动所有网络服务,用户通过命令行登录,无图形界面。
4 预留级别:默认未使用,可由用户自定义用途。
5 graphical.target 图形化多用户模式:在级别 3 的基础上启动图形界面(如 GNOME、KDE),用户通过图形登录界面访问系统。
6 重启(reboot):系统终止所有进程并重启,对应命令 shutdown -r now

设置系统运行目标

设置系统当前运行 target

# 设置系统当前运行target为multi-user.target
[root@localhost ~ 16:35:52]# systemctl isolate multi-user.target
# 等效与
[root@localhost ~ 16:36:12]# init 3


# 设置系统当前运行target为graphical.target 
[root@localhost ~ 16:37:23]# systemctl isolate graphical.target
# 等效与
[root@localhost ~ 16:37:52]# init 5

设置系统开机默认运行 target

# 查看系统开机默认运行target
[root@localhost ~ 16:39:12]# systemctl get-default 
graphical.target

# 设置系统开机默认运行target
[root@localhost ~ 16:39:27]# systemctl set-default multi-user.target
# 重启验证

在系统启动时选择其它目标

要在启动时选择其他目标,将 systemd.unit=target.target 参数附加到内核命令行。该配置是临时生效的,经常用于系统启动过程中故障排除。

要使用这种选择其他目标的方法,请执行以下步骤:

  1. 启动或重新启动系统。
  2. 按任意键中断启动加载器菜单倒计时(Enter除外,它用于执行正常启动)。
  3. 将光标移至第一个内核条目,按e编辑当前条目。

image-20250804170906019

  1. 将光标移至以linux16开头的行,末尾附加systemd.unit=target.target。例如,systemd.unit=multi-user.target。按 Ctrl+x 使用这些更改进行启动。

image-20250804171058714

重置 ROOT 密码

以下几种方法可用于设置新的root密码。例如:

  • 系统管理员可以使用Live CD启动系统,挂载根文件系统,然后编辑/etc/shadow:
  • 删除root账户密码字段
  • 使用已知密码字段替换root密码字段
  • 在CentOS 7之后版本中,可以让initramfs运行的脚本在某些点暂停,以提供root身份的shell,然后在该shell中重置root密码。

方法1:rd.break

  1. 重新启动系统。
  2. 按任意键(Enter除外)中断启动加载器倒计时。
  3. 将光标移至第一个内核条目,按e编辑当前条目。

image-20250804170906019

将光标移至以 linux16 开头的行,末尾附加 rd.break。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断。按Ctrl+x进行启动。

image-20250804171550929

此时,系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/sysroot。

以读/写形式重新挂载/sysroot。

bash switch_root:/# mount -o remount,rw /sysroot

切换root位置,把/sysroot做为文件系统树的根。

bash switch_root:/# chroot /sysroot

设置新root密码。

bash sh-4.2# echo password | passwd --stdin root

提示:password 是用户自定义密码。

如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。

bash sh-4.2# touch /.autorelabel

执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的 SELinux 重新标记,然后再次重新启动。

bash sh-4.2# exit switch_root:/# exit

登录验证。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐