小明的Linux实习之旅:基础指令练习情景练习题下
前景提要
小明刚刚开始他的Linux测试开发实习。第一天,他的leader给了他一系列任务,帮助他熟悉Linux命令行操作。以下是小明的冒险故事。
小明是怎么做的
场景1:初识Linux,创建目录和文件
-
小明的导师要求他创建一个项目目录,并在其中创建一个README文件。
shellmkdir ~/project #make directory建立目录 cd ~/project #change directory,改变目录或切换到另一个文件夹 touch README.md #碰到文件
-
小明在README.md中写下了项目简介,但不小心写错了内容。
shellvi README.md # 按i进入插入模式,输入"这是小明的第一个项目。" # 但写成了"这是小明的第一个错误。" # 按Esc键,输入:wq保存并退出
-
小明发现写错了,需要修改内容。
shellvi README.md # 按i进入插入模式,将"错误"改为"项目" # 按Esc键,输入:wq保存并退出
-
导师检查后,认为小明的描述还不够详细,要求他再添加一些信息。
shellecho "项目描述:这是一个用于学习Linux基本命令的项目。" >> README.md cat README.md #concatenate(连锁,用于连接并显示文件内容)
小明的电脑界面:
场景2:权限管理,小明的权限困惑
-
导师提醒小明要注意文件权限管理,要求他将README.md的权限修改为755。
shellchmod 755 README.md #change mode改变权限 ls -l README.md #list(列出目录内容)
-
导师还要求小明将项目目录的所有者改为root。
shellsudo chown root:root ~/project #superuser do,用于执行需要超级用户(root)权限的命令,而不需要实际切换到root用户 #change owner改变所有者 ls -ld ~/project #d:directory,表示只显示目录的信息不显示内部文件(夹)
3.导师刚才说错了,他是要确认该项目目录不是root,因为之后需要进行一些写入操作。小明于是默默地将项目目录的所有者改回来。
shell
groups christine #确认原来默认群组是否也是christine(我的用户名)
# 结果:christine : christine
[christine@localhost rongyi_project]$ sudo chown
# 结果:christine:christine ~/rongyi_project
[christine@localhost rongyi_project]$ ls -ld ~/rongyi_project
# 结果: drwxrwxr-x. 2 christine christine 68 6月 9 00:46 /home/christine/rongyi_project
小明的电脑界面:
场景3:打包与解压,小明的备份操作
-
导师告诉小明要定期备份项目目录,于是小明打包了整个项目目录。
shell#确保回到home页面 cd ~ # 使用 tar 命令来打包目录时,压缩文件会被存放在执行命令时所在的目录中。 tar -cvf project_v1.tar project #区别~/project ls -lh project_v1.tar
-
一天,小明需要恢复之前的备份,于是他解压了备份文件。
shellmkdir ~/backup #新建一个备份目录用来放解压文件 tar -xvf project_v1.tar -C backup #-C一定是大写,tar方法敏感 cd backup ls
小明的电脑界面:
场景4:使用Grep,小明的搜索技能
-
小明需要在项目目录中查找所有包含"项目"字样的文件。
shellgrep -r "项目" ~/project # grep:文本搜索工具,允许你使用正则表达式来搜索文本。 # -r:递归搜索,即搜索指定目录及其所有子目录中的文件。
-
导师要求他找出README.md文件中所有包含"描述"字样的行。
shellgrep "描述" ~/project/README.md
小明的电脑界面:
场景5:系统服务管理,小明的首次接触
-
导师让小明检查防火墙状态,并确保它是开启的。
shellsudo systemctl status firewalld sudo systemctl start firewalld
-
导师让小明启动MySQL服务并查看其状态。
shellsudo systemctl start mysql sudo systemctl status mysql
-
小明还需要启动Redis服务并检查其状态。
shellsudo systemctl start redis sudo systemctl status redis
-
最后,导师让小明查看网络接口的状态。
shellifconfig
小明的电脑界面:
小明笔记大公开:
systemctl
是systemd
的控制工具(control tool)的缩写。systemd
是一个初始化系统(init system)和用户空间(userspace)的系统管理器,用于管理系统资源和服务。
systemctl start <service>
:启动一个服务systemctl stop <service>
:停止一个服务systemctl restart <service>
:重启一个服务systemctl status <service>
:查询一个服务的状态systemctl enable <service>
:在系统启动时自动启动一个服务systemctl disable <service>
:在系统启动时禁用一个服务的自动启动
场景6:进程管理,小明的多任务处理
-
小明查看了系统中所有正在运行的进程。
shellps -ef
-
小明搜到了一个排序方法,发现有一个进程占用了大量内存资源,于是他结束了该进程。。
shellps aux --sort=-%mem #按内存使用量排序:通过管道和 sort 命令按 %MEM 或 RSS 列排序,找到内存占用最高的进程。 # kill <PID> #新手不要学小明,容易坏事 终止指定PID
-
小明根据进程名称结束了一个测试进程。
shellpkill test_process #终止指定进程名
小明笔记大公开:
- UID : 用户ID。显示了哪个用户拥有该进程。例如,
root
表示该进程是由 root 用户拥有的。- PID: 进程ID。这是一个唯一的数字,用于标识系统中的每个进程。
- PPID: 父进程ID。这是创建该进程的进程的PID。
- C : CPU 使用率。这表示进程最近的 CPU 使用率,通常是一个介于 0.0(没有使用)和 100.0(完全使用)之间的十进制数。但在这里,由于
ps
命令的默认输出格式,它可能只是一个简单的数字,代表优先级。- STIME: 启动时间。这显示了进程开始运行的时间。
- TTY : 终端类型。通常表示进程在哪个终端上运行,或者如果没有关联到终端,则可能显示为
?
。- TIME: CPU 时间。这显示了进程自启动以来所使用的 CPU 时间总量。
- CMD: 命令。这显示了启动进程的命令名或命令行。
常见的:
systemd
是系统的初始化系统和服务管理器,负责启动和管理系统进程。kthreadd
、ksoftirqd
、kworker
、migration
、rcu_bh
和rcu_sched
都是内核线程,它们处理系统的低级任务,如中断、调度和其他内核功能。这些通常不由用户直接管理。
场景7:定时任务与系统状态
-
导师要求小明设置一个定时任务,每天备份项目目录。
shellcrontab -e # 添加以下行以每天午夜备份项目目录: # 0 0 * * * tar -cvf ~/project_v1_$(date +\%F).tar ~/rongyi_project
-
小明查看了当前用户的所有定时任务。
shellcrontab -l
小明笔记大公开:
crontab
是由 "cron" 和 "tab" 两个单词组成的缩写。
- cron:这是 Unix 和 Linux 系统中用于定时执行任务的守护进程(daemon)的名称。它会在后台运行,并每分钟检查是否有预定的作业需要执行。这些作业通常被称为 "cron jobs"。
- tab :这里可以理解为表格(table)的简写,因为
crontab
文件实际上是一个用于存储和管理定时任务的列表或表格。因此,
crontab
的整体意思是"cron的表格"或"cron的任务列表"。在
crontab
文件中,每一行代表一个任务,包含了该任务的时间设置和要执行的命令或脚本。这些时间设置可以精确到分钟、小时、日期、月份和星期等不同的时间单位。
-
小明查看了系统运行时间和负载信息。
shelluptime
小明笔记大公开之uptime
命令:
显示系统已经运行了多长时间、当前有多少用户登录、以及系统在过去的 1 分钟、5 分钟和 15 分钟内的平均负载。
[christine@localhost ~]$
uptime
06:08:38 up 19:35, 5 users, load average: 0.11, 0.22, 0.26
在上一行小明得到结果中:
06:08:38
:当前的系统时间。up 19:35
:系统已经运行了 19 小时 35 分钟。(看得出小明很努力,忘了断开)5 users
:当前有 5 个用户登录到系统。load average: 0.11, 0.22, 0.26
:系统在过去的 1 分钟、5 分钟和 15 分钟内的平均负载。负载平均值是一个表示系统负载的度量,但它不是直接表示 CPU 使用率或正在运行的进程数量。它实际上是系统中处于可运行(或等待运行)状态的进程队列的平均长度。负载值越低,表示系统越空闲;负载值越高,表示系统越繁忙。
0.11
:过去 1 分钟内的平均负载。0.22
:过去 5 分钟内的平均负载。0.26
:过去 15 分钟内的平均负载。以小明的这个情况,负载值都很低,表示系统目前很空闲,有足够的处理能力来处理额外的任务。
- 小明查看了系统内存使用情况。
shell
free -h
小明笔记大公开之关于内存:
当运行
free -h
命令时,查看系统上的内存使用情况,其中-h
选项表示"human-readable",即以人类可读的格式(如 G、M)显示结果。[christine@localhost ~]$
free -h
total used free shared buff/cache available
Mem: 972M 580M 64M 124M 327M 65M
Swap: 2.0G 496M 1.5G
- Mem: 这部分显示了物理内存(RAM)的使用情况。
- total: 总的物理内存大小,这里是 972M(972 兆字节)。
- used: 当前已使用的物理内存,这里是 580M。
- free: 当前未使用的物理内存,这里是 64M。
- shared: 被多个进程共享的内存量,这里是 124M。
- buff/cache: 缓存和缓冲区使用的内存量,这部分内存可以被回收以满足应用程序的需求,而不必从磁盘读取数据。这里是 327M。
- available: 估计的、在不交换出的情况下,可以分配给应用程序的内存量。这是 "free" 和 "buff/cache" 的一个估计值,考虑了它们被回收的可能性。这里是 65M。
- Swap: 这部分显示了交换空间(swap space)的使用情况。
- total: 总的交换空间大小,这里是 2.0G(2 吉字节)。
- used: 当前已使用的交换空间,这里是 496M。
- free: 当前未使用的交换空间,这里是 1.5G。
从小明的输出中,可以看到物理内存的大部分(超过一半)已经被使用,但交换空间的使用量相对较少(不到四分之一)。如果这个系统开始大量使用交换空间,那么性能可能会受到影响,因为从磁盘读取数据通常比从 RAM 读取要慢得多。不过,在这个例子中,系统似乎还有足够的 RAM 和交换空间来处理当前的工作负载。
- 小明查看了磁盘使用情况。
shell
df -h
小明笔记大公开之uptime
命令:
当运行
df -h
命令时,你正在查看文件系统的磁盘空间使用情况。-h
选项表示"human-readable",即以人类可读的格式(如 G、M)显示结果。[christine@localhost ~]$
df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 38G 5.8G 32G 16% /
devtmpfs 471M 0 471M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 15M 472M 4% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 297M 147M 151M 50% /boot
tmpfs 98M 4.0K 98M 1% /run/user/42
tmpfs 98M 32K 98M 1% /run/user/1000
- 文件系统:文件系统的名称,通常与挂载点或设备关联。
- 容量:文件系统的总容量。
- 已用:已使用的磁盘空间。
- 可用:剩余的磁盘空间。
- 已用%:已使用的磁盘空间的百分比。
- 挂载点:文件系统被挂载到哪个目录。
在你的输出中:
/dev/sda3
是主要的根文件系统(root filesystem),它位于sda
磁盘的第三个分区上,总共有 38G 的空间,已经使用了 5.8G,剩余 32G,使用了 16% 的空间,并挂载在根目录/
下。devtmpfs
和多个tmpfs
是临时文件系统,用于存储临时文件或作为内存中的文件系统使用。这些文件系统通常不会占用硬盘空间,而是使用 RAM。从输出中可以看出,它们几乎没有被使用。/dev/sda1
是/boot
分区,用于存放引导加载器(如 GRUB)和内核文件。这个分区总共有 297M 的空间,已经使用了 147M,剩余 151M,使用了 50% 的空间。/run/user/42
和/run/user/1000
是为特定用户(ID 为 42 和 1000 的用户)提供的临时目录,通常用于存储会话特定的文件。这些目录也没有被大量使用。从输出中,可以看到主要的文件系统和引导分区都有足够的可用空间。如果小明看到任何文件系统的已用百分比接近或超过 100%,那就需要采取措施来释放空间或扩展文件系统的容量。
- 小明使用top命令实时查看系统资源使用情况。
shell
top
小明笔记大公开之top
命令:
用于实时监视系统的动态运行状况。当运行
top
命令时,它会显示系统中各个进程的资源占用情况,包括 CPU 使用率、内存占用、运行时间等。同时,top
还会更新这些信息,以便可以看到系统的实时状态。输出解释:
- 第一行:显示系统时间、系统运行时间、登录用户数、系统负载(最近1分钟、5分钟、15分钟的平均值)。
- 第二行:显示进程总数、正在运行的进程数、休眠的进程数、停止的进程数、僵尸进程数。
- 第三行:显示 CPU 状态,包括用户空间占用 CPU 百分比、内核空间占用 CPU 百分比、空闲 CPU 百分比、等待 I/O 操作的 CPU 百分比、硬中断和软中断占用的 CPU 百分比。
- 第四行:显示物理内存总量、已使用的物理内存、空闲的物理内存、已缓冲的内存。
- 第五行:显示交换空间总量、已使用的交换空间、空闲的交换空间。
接下来是进程列表,每个进程都有一行信息,包括进程 ID、用户、优先级、CPU 占用率、内存占用、进程状态等。
常用交互命令:
在
top
运行过程中,可以按以下键进行交互:
- P:按 CPU 使用率排序。
- M:按内存使用量排序。
- N:以 PID 顺序排序。
- T:按 CPU 时间排序。
- R:对当前排序进行反转。
- k:杀死一个进程(需要输入 PID)。
- q:退出 。
- h:显示帮助信息。
注意了:
top
命令提供的信息是实时的,所以它会持续更新。- 如果你发现某个进程的 CPU 或内存占用过高,可能需要进一步检查该进程。
- 在使用
top
时,要注意系统负载和 CPU 使用率,以确保系统没有过载或运行缓慢。
场景8:dd命令,小明的惊险操作
*这几步不用跟着做,容易出问题,了解即可
-
小明使用
dd
命令备份数据。shellsudo dd if=/dev/sda of=~/sda_backup.img bs=4M # dd 命令用于低级复制和转换文件,在这里,它被用来复制整个硬盘。名称来源于 "data duplicator" 或 "disk dump" 的缩写 # if 是 "input file" 的缩写。of 是 "output file" 的缩写。bs 是 "block size" 的缩写。 # if=/dev/sda: 这是 dd 命令的一个选项,指定输入文件(或设备)。 # 注意:/dev/sda 通常指的是整个硬盘,而不是某个分区(如 /dev/sda1)。 # bs=4M是 dd 命令的块大小(block size)选项。指定了每次读取和写入的块大小为 4MB,可以提高复制大文件的效率。
小明的提醒:
警告 :这条命令极其危险,因为它会覆盖
~/sda_backup.img
文件(如果它已经存在),并且如果错误地指定了if
或of
参数,它可能会导致数据丢失。在执行此类命令之前,请确保你完全理解它的工作原理,并已经采取了适当的预防措施(如备份)。此外,对于备份整个硬盘,更安全和更常见的方法是使用专业的磁盘镜像工具,如
ddrescue
(它可以处理坏扇区)或图形界面的工具,如 CloneZilla。
- 小明试图恢复数据,但不小心输入了错误的输出路径,导致系统崩溃。
shell
sudo dd if=~/sda_backup.img of=/wrong/path bs=4M
# 系统崩溃,恢复重启后导师解释了错误的原因
- 小明再试一次,这次成功恢复了数据。
shell
sudo dd if=~/sda_backup.img of=/dev/sda bs=4M