Linux 基础入门 09
2022/1/20 7:17:47
本文主要是介绍Linux 基础入门 09,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、REHL8 WEB控制台管理系统
登录一台服务器有哪些方法:
本地登录、VNC、XSHELL、web控制台登录
1.1 什么是web控制台
web控制台是一个基于web的红帽企业版Linux8
界面,用于管理和监控本地系统及位于网络环境中的linux服务器
RHEL的web控制台是交互式服务器管理界面,可以直接通过浏览器与真实的linux操作系统进行直接交互。
1.2 web控制台可以做什么
(1)监控基本系统功能,例如硬件信息,时间配置,性能配置等
(2)检查系统日志文件
(3)管理网络接口和配置防火墙
(4)管理虚拟机
(5)管理用户帐户
(6)监视和配置系统服务
(7)管理软件包
(8)配置SELinux
(9)更新软件
(10)访问终端
1.3 操作步骤
服务器开机,有网络,可以连接公网
先检查自己的服务器是否默认安装了这个服务 cockpit
[root@wentan ~]# yum list | grep cockpit #RHEL8 默认已经安装了cocpit这个服务 cockpit.x86_64 185-2.el8 @anaconda cockpit-bridge.x86_64 185-2.el8 @anaconda cockpit-packagekit.noarch 184.1-1.el8 @AppStream cockpit-storaged.noarch 184.1-1.el8 @AppStream cockpit-system.noarch 185-2.el8 @anaconda cockpit-ws.x86_64 185-2.el8 @anaconda subscription-manager-cockpit.noarch 1.23.8-35.el8 @anaconda cockpit.x86_64 251.1-1.el8 base cockpit-bridge.x86_64 251.1-1.el8 base cockpit-composer.noarch 31.1-1.el8 AppStream cockpit-doc.noarch 251.1-1.el8 base cockpit-machines.noarch 251.1-1.el8 AppStream cockpit-packagekit.noarch 251.1-1.el8 AppStream cockpit-pcp.x86_64 251.1-1.el8 AppStream cockpit-podman.noarch 33-1.module_el8.5.0+890+6b136101 AppStream cockpit-session-recording.noarch 7-2.el8 AppStream cockpit-storaged.noarch 251.1-1.el8 AppStream cockpit-system.noarch 251.1-1.el8 base cockpit-ws.x86_64 251.1-1.el8 base subscription-manager-cockpit.noarch 1.28.21-3.el8 base #检查cockpit是否开机自动启动,发现cockpit.socket 是disable状态 [root@wentan ~]# systemctl list-unit-files | grep cockpit cockpit-motd.service static cockpit.service static cockpit.socket disabled #启动cockpit这个服务 [root@wentan ~]# systemctl start cockpit.socket [root@wentan ~]# systemctl enable cockpit.socket Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket → /usr/lib/systemd/system/cockpit.socket. #启动cockpit.service服务 [root@wentan ~]# systemctl start cockpit.service [root@wentan ~]# systemctl status cockpit.service ● cockpit.service - Cockpit Web Service Loaded: loaded (/usr/lib/systemd/system/cockpit.service; static; vendor preset:> Active: active (running) since Wed 2022-01-19 10:41:40 CST; 17s ago Docs: man:cockpit-ws(8) Process: 8226 ExecStartPre=/usr/sbin/remotectl certificate --ensure --user=root > Main PID: 8230 (cockpit-ws) Tasks: 2 (limit: 23861) Memory: 2.8M CGroup: /system.slice/cockpit.service └─8230 /usr/libexec/cockpit-ws
防火墙策略:
可以关闭系统防火墙或者选择防火墙放行
RHEL8系统默认已经放行了cockpit服务
firewall-cmd --add-service=cockpit --permanent firewall-cmd --reload #重载以生效这个规则
最后RHEL系统的web控制台的地址为服务器ip地址的9090端口
192.168.253.128:9090 (服务器地址)
输入用户密码登录
二、日志系统 RSYSLOG
使用了日志消息类型和优先级来确定到底如何处理
日志系统的配置文件: /etc/rsyslog.conf
2.1 日志消息的类型:
类型 | 功能 |
---|---|
lpr | 打印相关的日志 |
auth | 认证相关的日志 |
user | 用户相关的日志 |
cron | 计划任务相关的日志 |
kern | 内核相关的日志 |
邮件相关的日志 | |
daemon | 系统服务相关的日志 |
authpri | 授权相关的日志 |
security | 安全相关的日志 |
2.2 日志消息的优先级
从高到低 8个标准
关键字 | 优先级 | 内容 |
---|---|---|
none | 无 | 不记录任何信息 |
EMERG | 级别 0 | 紧急,系统本身已经无法再运行必须马上拯救 |
ALERT | 级别 1 | 警报,系统出现了重大错误必须马上处理的情况 |
CRIT | 级别 2 | 严重,系统出现了严重的情况 |
ERROR | 级别 3 | 错误,系统出现了错误的情况 |
WARNING | 级别 4 | 警告,系统出现了需要警告的情况 |
NOTICE | 级别 5 | 注意,系统出现了需要注意的情况 |
INFO | 级别 6 | 信息,系统出现了一些情况 |
DEBUG | 级别 7 | 调试,系统出现了程序或服务调试的情况 |
2.3 日志信息里的内容
(1)会记录日志发生的时间
(2)发送该日志消息的主机
(3)发送该日志消息的程序,哪个PID
(4)日志消息的主内容
三、ISCSI 实验
首先需要两台虚拟机,恢复初始化状态
一台命名为SAN-server 一台命名为SAN-client
安装yum 源,关闭防火墙,同时ISCSI需要额外安装一块硬盘
3.1 服务端配置
#服务端 [root@wentan ~]# hostnamectl set-hostname SAN-server [root@wentan ~]# bash #接下来需要安装ISCSI的工具 [root@SAN-server ~]# yum install -y targetcli [root@SAN-server ~]# systemctl enable target Created symlink /etc/systemd/system/multi-user.target.wants/target.service → /usr/lib/systemd/system/target.service. [root@SAN-server ~]# systemctl start target #分区选择一块共享给SAN客户 [root@SAN-server ~]# fdisk /dev/nvme0n2 Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x31fc34c5. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-41943039, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +10G Created a new partition 1 of type 'Linux' and of size 10 GiB. Command (m for help): p Disk /dev/nvme0n2: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x31fc34c5 Device Boot Start End Sectors Size Id Type /dev/nvme0n2p1 2048 20973567 20971520 10G 83 Linux Command (m for help): m Help: DOS (MBR) a toggle a bootable flag b edit nested BSD disklabel c toggle the dos compatibility flag Generic d delete a partition F list free unpartitioned space l list known partition types n add a new partition p print the partition table t change a partition type v verify the partition table i print information about a partition Misc m print this menu u change display/entry units x extra functionality (experts only) Script I load disk layout from sfdisk script file O dump disk layout to sfdisk script file Save & Exit w write table to disk and exit q quit without saving changes Create a new label g create a new empty GPT partition table G create a new empty SGI (IRIX) partition table o create a new empty DOS partition table s create a new empty Sun partition table Command (m for help): t Selected partition 1 Hex code (type L to list all codes): l 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT 10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/ 11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b 12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor 16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto 1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep 1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT Hex code (type L to list all codes): 8e Changed type of partition 'Linux' to 'Linux LVM'. Command (m for help): p Disk /dev/nvme0n2: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x31fc34c5 Device Boot Start End Sectors Size Id Type /dev/nvme0n2p1 2048 20973567 20971520 10G 8e Linux LVM Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. [root@SAN-server ~]# pvcreate /dev/nvme0n2p1 Physical volume "/dev/nvme0n2p1" successfully created. [root@SAN-server ~]# vgcreate iscsi_vg /dev/nvme0n2p1 Volume group "iscsi_vg" successfully created [root@SAN-server ~]# lvcreate -n iscsi_store -l 100%VG iscsi_vg Logical volume "iscsi_store" created. #接下来通过targetcli 工具来做SAN网络共享 [root@SAN-server ~]# targetcli Warning: Could not load preferences file /root/.targetcli/prefs.bin. targetcli shell version 2.1.53 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'. /> backstores/block create name=iscsi_store dev=/dev/iscsi_vg/iscsi_store Created block storage object iscsi_store using /dev/iscsi_vg/iscsi_store. /> iscsi/ create iqn.2022-01.com.example:iscsi.server Created target iqn.2022-01.com.example:iscsi.server. Created TPG 1. Global pref auto_add_default_portal=true Created default portal listening on all IPs (0.0.0.0), port 3260. /> cd iscsi/iqn.2022-01.com.example:iscsi.server/ /iscsi/iqn.20...:iscsi.server> cd tpg1/ /iscsi/iqn.20...i.server/tpg1> luns/ create /backstores/block/iscsi_store Created LUN 0. /iscsi/iqn.20...i.server/tpg1> acls/ create iqn.2022-01.com.example:iscsi.client Created Node ACL for iqn.2022-01.com.example:iscsi.client Created mapped LUN 0. /iscsi/iqn.20...i.server/tpg1> portals/ create 192.168.253.128 3260 Using default IP port 3260 Could not create NetworkPortal in configFS /iscsi/iqn.20...i.server/tpg1> set attribute authentication=0 Parameter authentication is now '0'. /iscsi/iqn.20...i.server/tpg1> set attribute generate_node_acls=0 Parameter generate_node_acls is now '0'. /iscsi/iqn.20...i.server/tpg1> cd .. /iscsi/iqn.20...:iscsi.server> cd .. /iscsi> cd .. /> saveconfig Configuration saved to /etc/target/saveconfig.json /> exit Global pref auto_save_on_exit=true Last 10 configs saved in /etc/target/backup/. Configuration saved to /etc/target/saveconfig.json [root@SAN-server ~]# targetcli targetcli shell version 2.1.53 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'. /> ls o- / ........................................................................ [...] o- backstores ............................................................. [...] | o- block ................................................. [Storage Objects: 1] | | o- iscsi_store ... [/dev/iscsi_vg/iscsi_store (10.0GiB) write-thru activated] | | o- alua .................................................. [ALUA Groups: 1] | | o- default_tg_pt_gp ...................... [ALUA state: Active/optimized] | o- fileio ................................................ [Storage Objects: 0] | o- pscsi ................................................. [Storage Objects: 0] | o- ramdisk ............................................... [Storage Objects: 0] o- iscsi ........................................................... [Targets: 1] | o- iqn.2022-01.com.example:iscsi.server ............................. [TPGs: 1] | o- tpg1 .............................................. [no-gen-acls, no-auth] | o- acls ......................................................... [ACLs: 1] | | o- iqn.2022-01.com.example:iscsi.client ................ [Mapped LUNs: 1] | | o- mapped_lun0 .......................... [lun0 block/iscsi_store (rw)] | o- luns ......................................................... [LUNs: 1] | | o- lun0 [block/iscsi_store (/dev/iscsi_vg/iscsi_store) (default_tg_pt_gp)] | o- portals ................................................... [Portals: 1] | o- 0.0.0.0:3260 .................................................... [OK] o- loopback ........................................................ [Targets: 0] /> exit
3.2 客户端配置
#客户端 [root@wentan ~]# hostnamectl set-hostname SAN-client [root@wentan ~]# bash #安装iscsi看客户端初始化工具 [root@SAN-client ~]# yum install -y iscsi-initiator-utils [root@SAN-client ~]# vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2022-01.com.example:iscsi.client #接下来允许iscsi服务,开启iscsi服务 [root@SAN-client ~]# systemctl enable iscsi iscsid.service Created symlink /etc/systemd/system/remote-fs.target.wants/iscsi.service → /usr/lib/systemd/system/iscsi.service. Created symlink /etc/systemd/system/multi-user.target.wants/iscsid.service → /usr/lib/systemd/system/iscsid.service. [root@SAN-client ~]# systemctl start iscsi iscsid.service #接下来通过iscsi的发现机制 来发现对方ip地址是否有共享给我的存储 [root@SAN-client ~]# iscsiadm -m discovery -t st -p 192.168.253.128 192.168.253.128:3260,1 iqn.2022-01.com.example:iscsi.server #选择自动的挂上SAN [root@SAN-client ~]# iscsiadm -m node -l Logging in to [iface: default, target: iqn.2022-01.com.example:iscsi.server, portal: 192.168.253.128,3260] Login to [iface: default, target: iqn.2022-01.com.example:iscsi.server, portal: 192.168.253.128,3260] successful. #接下来发现这块设备,发现名字为sda 大小为10G [root@SAN-client ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 10G 0 disk sr0 11:0 1 1024M 0 rom nvme0n1 259:0 0 25G 0 disk ├─nvme0n1p1 259:1 0 1G 0 part /boot └─nvme0n1p2 259:2 0 24G 0 part ├─rhel-root 253:0 0 22G 0 lvm / └─rhel-swap 253:1 0 2G 0 lvm [SWAP] #我们需要对这块硬盘做分区 [root@SAN-client ~]# fdisk /dev/sda Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x80e3c182. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-20963327, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-20963327, default 20963327): +5G Created a new partition 1 of type 'Linux' and of size 5 GiB. Command (m for help): p Disk /dev/sda: 10 GiB, 10733223936 bytes, 20963328 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 1048576 bytes Disklabel type: dos Disk identifier: 0x80e3c182 Device Boot Start End Sectors Size Id Type /dev/sda1 2048 10487807 10485760 5G 83 Linux Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. #把分区做成文件系统 ext4格式 [root@SAN-client ~]# mkfs.ext4 /dev/sda1 mke2fs 1.44.3 (10-July-2018) Creating filesystem with 1310720 4k blocks and 327680 inodes Filesystem UUID: ac62797b-da6c-4bf3-a09b-7808b6081ebf Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done #编辑自动挂载列表 [root@SAN-client ~]# vim /etc/fstab /dev/sda1 /SAN ext4 defaults 0 0 [root@SAN-client ~]# mkdir /SAN [root@SAN-client ~]# mount -a [root@SAN-client ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs tmpfs 1.9G 10M 1.9G 1% /run tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/rhel-root xfs 22G 4.2G 18G 19% / /dev/nvme0n1p1 xfs 1014M 169M 846M 17% /boot tmpfs tmpfs 376M 16K 376M 1% /run/user/42 tmpfs tmpfs 376M 4.6M 372M 2% /run/user/1000 tmpfs tmpfs 376M 4.0K 376M 1% /run/user/0 /dev/sda1 ext4 4.9G 20M 4.6G 1% /SAN #到这里就全都成功了
四、归档和(解)压缩
归档和压缩的区别
归档就是把多个文件归到一起,他不是压缩,并不能压缩大小
4.1 归档
tar -cvf 归档文件夹名 归档文件1 归档文件2 tar -cvf txt 123.txt 12.txt 解档:tar -xvf 文档名
4.2 压缩
gzip bzip两种压缩方法
Gzip:压缩速度快 压缩效率高 tar -zvcf
Bzip:压缩速率慢 压缩比例高 节省空间 tar -jvcf
[root@SAN-server dwt]# tar -zvcf gd.tar.gz test.pdf 222.txt 321.txt test.pdf 222.txt 321.txt [root@SAN-server dwt]# tar -jvcf gd.tar.bz test.pdf 222.txt 321.txt test.pdf 222.txt 321.txt [root@SAN-server dwt]# ll total 7796 -rw-r--r--. 1 root root 13 Jan 15 11:23 222.txt -rwxrw-r-x+ 1 root wentan 240 Jan 11 11:43 321.txt drwxr-xr-x. 2 root root 6 Jan 11 11:04 back drwxr-xr-x. 2 root root 22 Jan 8 15:21 etc -rw-r--r--. 1 root root 2642757 Jan 19 16:00 gd.tar.bz -rw-r--r--. 1 root root 2631479 Jan 19 15:59 gd.tar.gz drwxr-xr-x. 2 root root 6 Jan 19 15:54 test -rw-r--r--. 1 root root 2692317 Jan 19 15:51 test.pdf
4.3 解压缩
Gzip: tar -zvxf 压缩包名
Bzip: tar -jvxf 压缩包名
[root@SAN-server dwt]# ll total 5156 drwxr-xr-x. 2 root root 6 Jan 11 11:04 back drwxr-xr-x. 2 root root 22 Jan 8 15:21 etc -rw-r--r--. 1 root root 2642757 Jan 19 16:00 gd.tar.bz -rw-r--r--. 1 root root 2631479 Jan 19 15:59 gd.tar.gz drwxr-xr-x. 2 root root 6 Jan 19 15:54 test [root@SAN-server dwt]# tar -zvxf gd.tar.gz test.pdf 222.txt 321.txt [root@SAN-server dwt]# ll total 7796 -rw-r--r--. 1 root root 13 Jan 15 11:23 222.txt -rwxrw-r-x. 1 root wentan 240 Jan 11 11:43 321.txt drwxr-xr-x. 2 root root 6 Jan 11 11:04 back drwxr-xr-x. 2 root root 22 Jan 8 15:21 etc -rw-r--r--. 1 root root 2642757 Jan 19 16:00 gd.tar.bz -rw-r--r--. 1 root root 2631479 Jan 19 15:59 gd.tar.gz drwxr-xr-x. 2 root root 6 Jan 19 15:54 test -rw-r--r--. 1 root root 2692317 Jan 19 15:51 test.pdf
不管是压缩还是归档都是:
压缩命令+ 压缩后文件包的名+ 需要压缩的文件(可以好多个)
建议GZIP文件是以tar.gz结尾
BZIP文件是以tar.bz结尾
五、Linux内核
内核就是操作系统的核心部分
5.1 redhat内核的功能:
1.系统初始化:检测硬件资源并启动系统
2.进程调度 : 决定进程什么时候运行,以及运行多久
3.内存管理: 给运行的进程分配内存
4.安全:支持权限,支持selinux ,支持防火墙 支持iptables
5.支持标准网络,文件系统
具体可以参考kernel-doc
5.2 内核的组成
多个内核版本可以共存的
内核的组成如下
/boot/vmlinuz-4.18.0-80.el8.x86_64
启动时用到的内核
/boot/initramfs-4.18.0-80.el8.x86_64.img
启动时提供必要模块的内核
/lib/modules/版本/内核模块
5.3 虚拟的文件系统/proc
进程信息 /proc/PID(数字)
cpu信息 /proc/cpuinfo
内存资料 /proc/meminfo
磁盘信息 /proc/partition
5.4 sysctl 配置内核参数
当前生效的内核配置参数都在 /pro/sys/
内核参数配置文件 /etc/sysctl.conf
系统启动时读取的参数
sysctl -a
显示所有的内核模块
一定要结合grep
来使用
5.5 内核模块
内核模块: /lib/modules/
内核版本
内核模块的相关命令:
lsmod
查看内核已经加载的模块
modinfo 模块名
查看这个模块的详细信息
视频讲解在微信公众号
问渠清源
回复关键词视频
即可观看
这篇关于Linux 基础入门 09的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法