2021-2022-1 20212818《Linux内核原理与分析》第一周作业

实验一

Linux与Windows的不同

1. 免费与收费

  • 最新正版 Windows 10,需要付费购买;
  • Linux 免费或少许费用。

2. 软件与支持

  • Windows 平台:数量和质量的优势,不过大部分为收费软件;由微软官方提供重要支持和服务;
  • Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠缺;由全球所有的 Linux 开发者和自由软件社区提供支持。

3. 安全性

  • Windows 平台:三天两头打补丁安装系统安全更新,还是会中病毒木马;
  • Linux 平台:要说 Linux 没有安全问题,那当然是不可能的,这一点仁者见仁智者见智,相对来说肯定比 Windows 平台要更加安全,使用 Linux 你也不用装某杀毒、某毒霸。

4. 使用习惯

  • Windows:普通用户基本都是纯图形界面下操作使用,依靠鼠标和键盘完成一切操作,用户上手容易,入门简单;
  • Linux:兼具图形界面操作(需要使用带有桌面环境的发行版)和完全的命令行操作,可以只用键盘完成一切操作,新手入门较困难,需要一些学习和指导(这正是我们要做的事情),一旦熟练之后效率极高。

5. 可定制性

  • Windows:这些年之前算是全封闭的,系统可定制性很差;
  • Linux:你想怎么做就怎么做,Windows 能做到得它都能,Windows 做不到的,它也能。

6. 应用范畴

或许你之前不知道 Linux ,要知道,你之前在 Windows 使用百度、谷歌,上淘宝,聊 QQ 时,支撑这些软件和服务的,是后台成千上万的 Linux 服务器主机,它们时时刻刻都在忙碌地进行着数据处理和运算,可以说世界上大部分软件和服务都是运行在 Linux 之上的。

7. Windows 没有的

  • 稳定的系统
  • 安全性和漏洞的快速修补
  • 多用户
  • 用户和用户组的规划
  • 相对较少的系统资源占用
  • 可定制裁剪,移植到嵌入式平台(如安卓设备)
  • 可选择的多种图形用户界面(如 GNOME,KDE)

8. Linux 没有的

  • 特定的支持厂商
  • 足够的游戏娱乐支持度
  • 足够的专业软件支持度

实验运行结果截图:

实验二

Linux实验楼环境

        大家熟知也最流行的实现了客户端功能的桌面环境 KDEGNOMEXFCELXDE 。其中就有你看到的,实验楼目前使用的 XFCE 桌面环境,部分老用户可能可以回想起,实验楼之前使用的环境是 LXDE 。这也意味着在 Linux 上你可以自己选择安装不同的桌面环境,甚至可以定制自己的专属桌面。

 

        终端本质上是对应着 Linux 上的 /dev/tty 设备,Linux 的多用户登录就是通过不同的 /dev/tty 设备完成的。

        在Unix/Linux中比较常见的shell有bash、zsh、ksh、csh 等等,Ubuntu 终端默认使用的是 bash,默认的桌面环境是 GNOME 或者 Unity(基于 GNOME)。

        Linux命令行

  • 创建文件file touch file    [注]可以一次性创建多个文件
  • 进入一个目录 cd /etc/
  • 查看当前所在目录 pwd
  • 显示当前目录中的文件名字 ls 不加参数它显示除隐藏文件外的所有文件及目录的名字。
  • 命令行中获取帮助
    man

    --help

重要快捷键

按键作用
tab补全命令
Ctrl+c强行终止当前程序

Ctrl+d

键盘输入结束或退出终端
Ctrl+s暂停当前程序,暂停后按下任意键恢复运行
Ctrl+z将当前程序放到后台运行,恢复到前台为命令fg
Ctrl+a将光标移至输入行头,相当于Home
Ctrl+e将光标移至输入行末,相当于End
Ctrl+k删除从光标所在位置到行末
Alt+Backspace向前删除一个单词
Shift+PgUp将终端显示向上滚动
Shift+PgDn将终端显示向下滚动

        通配符是一种特殊语句,主要有星号(*)和问号(?),用来对字符串进行模糊匹配(比如文件名、参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正字符。

*匹配 0 或多个字符
?匹配任意一个字符
[list]匹配 list 中的任意单一字符
[^list]匹配 除 list 中的任意单一字符以外的字符
[c1-c2]匹配 c1-c2 中的任意单一字符 如:[0-9][a-z]
{string1,string2,...}匹配 string1 或 string2 (或更多)其一字符串
{c1..c2}匹配 c1-c2 中全部字符 如{1..10}

 实验运行结果截图:

实验三

who 命令其它常用参数

参数说明
-a打印能打印的全部
-d打印死掉的进程
-mam imom likes
-q打印当前登录用户数及用户名
-u打印当前登录用户登录信息
-r打印运行等级

        在 Linux 系统里, root 账户拥有整个系统至高无上的权限,比如新建和添加用户。一般我们登录系统时都是以普通账户的身份登录的,要创建用户需要 root 权限,这里就要用到 sudo 这个命令了。不过使用这个命令有两个大前提,一是你要知道当前登录用户的密码,二是当前用户必须在 sudo 用户组。

su,su- 与 sudo

需要注意 Linux 环境下输入密码是不会显示的。

在 Linux 里面如何知道自己属于哪些用户组呢?

方法一:使用 groups 命令

groups shiyanlou

此处输入图片的描述

其中冒号之前表示用户,后面表示该用户所属的用户组。这里可以看到 shiyanlou 用户属于 shiyanlou 用户组,每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组(差不多就相当于家长的意思)。

方法二:查看 /etc/group 文件

cat /etc/group | sort

这里 cat 命令用于读取指定文件的内容并打印到终端输出,后面会详细讲它的使用。 | sort 表示将读取的文本进行一个字典排序再输出,然后你将看到如下一堆输出,你可以在最下面看到 shiyanlou 的用户组信息:

 删除用户:

1、sudo deluser lilei --remove-home

2、使用 --remove-home 参数在删除用户时候会一并将该用户的工作目录一并删除。如果不使用那么系统会自动在 /home 目录为该用户保留工作目录

3、删除用户组可以使用 groupdel 命令,倘若该群组中仍包括某些用户,则必须先删除这些用户后,才能删除群组

文件权限:

文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件以及可以执行什么样的操作。

命令

  • ls 打开当前目录下的所有文件并显示;
    • -l 以长格式列出文件
    • -A 除了当前和和上一级之外的所有文件,包括隐藏文件
    • dl 查看某一目录的完整属性,不是目录中的文件
    • AsSh 显示所有文件大小
  • cd 进入一个目录
  • chomd xxx 文件权限修改命令

adduser 和 useradd 的区别:

useradd 只创建用户,不会创建用户密码和工作目录,创建完了需要使用 passwd <username> 去设置新用户的密码。adduser 在创建用户的同时,会创建工作目录和密码(提示你设置),做这一系列的操作。其实 useradduserdel 这类操作更像是一种命令,执行完了就返回。而 adduser 更像是一种程序,需要你输入、确定等一系列操作。

实验结果截图:

1、将文件所有者lilei改为shiyanlou截图:

 2、修改iphone11权限,lilei用户已不能读写iphone11文件

 实验四

目录

Linux 是以树形目录结构的形式来构建整个系统的,可以理解为树形目录是一个用户可操作系统的骨架。

FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

FHS 定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该放置设置文件,/bin 与 /sbin 则应该放置可执行文件等等。

第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统日志文件,/usr/share 放置共享数据等等

相关命令

  • cd表示进入当前目录
    • cd.. 表示进入上一级目录
    • cd~ 表示进入home目录
  • pwd 表示获得当前路径

文件

  • touch命令 可以创建空白文件,更改已有文件的时间戳
    • 因为在其他目录中没有权限,所以在touch一个新文件时需要跳回home目录。
  • mkdir 创建一个空目录,同时可以指定创建目录的权限属性
    • p 参数可以同时创建父目录
  • cp 复制文件到指定目录
    • r或R 参数实现目录的复制
  • rm 删除文件
    • f强制删除
    • r或R 实现目录的删除
  • mv 移动文件(剪切) 格式: mv 源文件目录 目的文件目录
    • 也可以实现文件重命名 格式: mv 原文件名 新文件名
  • rename 实现批量文件重命名
  • cat 和 -tac 前者正序打印文件内容到输出 后者逆序打印文件名到输出
  • more 实现分页显示查看文件
  • tail 和 -head 只查看文件的头几行内容
    • f参数实现不停读取某个文件内容并显示
  • file查看文件类型
    • linux系统中文件的类型并不是以后缀来判断

实验结果截图:

创建一个 homework 目录,建立名为 1.txt~10.txt 文件,并删除 1.txt~5.txt

实验五 

变量

变量是什么,准确的说应该是 Shell 变量,所谓变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系,可以通过表达式读取它的值并赋值给其它变量,也可以直接指定数值赋值给任意变量。为了便于运算和处理,大部分的编程语言会区分变量的类型,用于分别记录数值、字符或者字符串等等数据类型。Shell 中的变量也基本如此,有不同类型(但不用专门指定类型名),可以参与运算,有作用域限定。

使用 declare 命令创建一个变量名为 tmp 的变量:

declare tmp

使用 = 号赋值运算符,将变量 tmp 赋值为 shiyanlou。注意,与其他语言不同的是, Shell 中的赋值操作,= 两边不可以输入空格,否则会报错。

# 正确的赋值
tmp=shiyanlou

# 错误的赋值
tmp = shiyanlou

读取变量的值,使用 echo 命令和 $ 符号($ 符号用于表示引用一个变量的值,初学者经常忘记输入):

echo $tmp

 setenvexport。这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同。

命 令说 明
set显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。
env显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。
export显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。

PATH环境变量的作用

在当前目录下执行程序是可以执行的,但是返回到上一级目录中,如果不加上命令的完整路径,就无法运行,这时候就需要在命令中添加PATH环境变量。

 给PATH追加一个路径后,就可以直接执行该文件,但是只是在当前shell有效,home


PATH环境变量的修改与删除

命令

  • unset删除环境变量
  • source或者用一个 . 表示 使配置脚本文件修改后立即生效


搜索文件

命令

  • whereis 简单快速,搜索范围不全面
  • locate 快而全
  • which 只从PATH环境变量指定的路径中搜索,用于判断是否安装了某文件
  • find
    -find 命令的路径是作为第一个参数的, 基本命令格式为** find [path] [option] [action] **

实验结果截图:

找出 /etc/ 目录下的所有以 .list 结尾的文件 

遇到的问题原因是对find命令理解不够,按照find命令的格式,应该是 find /etc/ -name *.list 第一次出现错误的原因是没有写“-name”参数。

实验六

zip压缩打包程序

命令

  • zip 使用zip压缩文件
    • -r 递归打包子目录的所有文件
    • -q 安静模式,不向屏幕输出信息
    • -o 输出文件名
    • 1-9 压缩级别,1压缩最快体积最大;9最小但是耗时最长
    • -x 压缩时排除上一次的压缩文件
    • -e 创建加密压缩包
    • -l 由于Windows和linux系统的换行符不同,该参数用于转换
  • unzip 解压缩文件
    • -d 解压到指定目录,如没有该目录将会被创建
    • 问题 看到命令我在疑惑这个目录将会被创建到哪里,通过cd等命令,我得到了答案

      1505758-20181014112224374-555821218.png

    • -l 查看压缩包的内容
    • -o 指定编码类型

tar压缩打包程序

命令

  • tar 打包工具
    • -c 表示创建一个tar包文件
    • -f 用于指定创建的文件名,文件名紧跟f之后
    • -v 可视的方式输出打包文件
    • -p 保留绝对路径
    • -x 解包一个文件
    • -C 解包到指定的已存在路径
    • -t 只查看不解包文件
    • -p 保留文件的属性
    • -h 保留文件的链接
    • -z 使用gzip来压缩文件

实验结果代码截图:

zip文件

tar文件

实验七 

硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero和/dev/random)都像普通文件一样,只是在各自的驱动程序中实现了对应的功能,dd 也可以读取文件或写入这些文件。

  用户在 Linux/UNIX 的机器上打开一个文件以前,包含该文件的文件系统必须先进行挂载的动作,此时用户要对该文件系统执行 mount 的指令以进行挂载。该指令通常是使用在 USB 或其他可移除存储设备上,而根目录则需要始终保持挂载的状态。

  使用 mount 命令挂载磁盘到目录树

  用户在 Linux/UNIX 的机器上打开一个文件以前,包含该文件的文件系统必须先进行挂载的动作,此时用户要对该文件系统执行 mount 的指令以进行挂载。

命令

  • help命令 只能用于显示内建命令的帮助信息,如果是外部命令利用参数 --help 获得帮助。

  • man命令 更为详细的帮助
  • info命令 比man命令更为详细,两者是一个有交集的集合

实验结果截图:

实验八

内建命令和外部命令概念

内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在 bash 源码的 builtins 里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。

外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin 等等。比如:ls、vi 等。

 实验结果截图:

实验九 

 crontab 命令 

crontab 命令从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合。

 crontab 的格式:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

实验结果运行截图:

 

实验十

1. 通过which, &&和 || 来选择性的执行任务,并注意它们的顺序搭配。

2. 管道的概念,| 用作分隔符,其前者的命令的输出可作为其后者命令的输入

3.grep命令在文本或stdin中查找匹配字符串

4. wc简单记数小工具

5. sort排序,之前在cat命令中用过

  默认为字典排序:$ cat /etc/passwd | sort

  反转排序:$ cat /etc/passwd | sort -r

  按特定字段排序:$ cat /etc/passwd | sort -t':' -k 3

6. uniq 去重复

  uniq命令可以用于过滤或者输出重复行

实验十一

命令

  • tr 用来删除一段文本信息中的某些文字或将其进行转换
    • -d 删除匹配字符
    • -s 去除指定文本中连续并重复的字符
  • col 将tab换成对等数量的空格键
    • -x tab换成空格
    • -h 空格换成tab
  • join 将两个文件中包含相同内容的那一行合并在一起
    • 遇到的问题 刚开始没有理解在join命令中以:为分隔符是什么意思,后来利用vim 打开两个文件对比后知道,两个文档中数据对比遇到分隔符结束,相同的只写一个,不相同的链接在一起
  • paste 将多个文件合并在一起,不对比数据
    • -d 指定分隔符
    • -s 不合并到一行,每个文件为一行

 

实验十二

基本重定向

管道是将前一个命令作为后一个命令的输入来实现;而重定向往往需要一个文件来建立两个命令的连接
为了隐藏某些错误或警告,利用标准错误重定向,实现如下图所示

  • tee 命令 同时重定向到多个文件
    tee命令实现的是,当不仅仅需要将输出重定向到文件,同时需要将信息打印在终端。

    1505758-20181014112346749-1948847749.png

  • exec 命令 实现永久重定向,利用指定的命令替换当前的shell
    • exec 1>somefile 就是指将标准输出重定向到文件中,直到退出当前shell或取消当前重定向
      利用exec命令创建文件描述符

      1505758-20181014112354150-1959302999.png

  • 关闭文件描述符
    • exec 3>&-
    • 从图中可以看到此时的3号文件符已经被删除了
  • 完全屏蔽命令的输出 /dev/null通常被用于丢弃不需要的输出流
  • xargs 命令 将参数列表转换成小块分段传递给其他命令,以避免参数列表过长

实验十三

 使用基本正则表达式

利用grep配合正则表达式实现更为准确的字符串查找。结合-E参数,使用扩展正则表达式。


sed流编辑器

sed用于过滤和转换文本的流编辑器,sed是一个非交互式的编辑器。

  • sed
    • -n 安静模式,只打印受影响的行
    • -e 用于在脚本中添加多个执行命令一次执行
    • -f 指定执行filename文件中的命令
    • -r 使用扩展正则表达式
    • -i 将直接修改输入文件内容,而不是打印到标准输出设备
  • sed 命令格式
    • [n1][,n2]command
    • [n1][~stpe]command
      • 其中n1,n2表示输入内容的行号,逗号表示n1到n2行 如果为~ 则表示从n1开始以step为步进所有行。command为执行动作。

awk文本处理语言

所有awk的操作都是基模式-动作对来完成,将所有的动作操作用{}围起来,模式是表示用于匹配输入的文本的“关系式”或“正则表达式”动作表示匹配后执行的动作。

  • awk 属性介绍
    • F参数用于预先指定前面提到的字符分隔符
    • v用于预先为awk程序指定变量
    • f指定awk命令要执行的程序文件
  • awk 内置变量
    • NR 当前入读的记录数
    • OFS表示输出时的字符分隔符
    • $N 表示引用相应的字段号
      print打印的非变量内用都需要用引号引出
    •  

实验十四

apt包管理工具

  • apt可以自动下载、配置安装二进制或者源代码格式的软件包,apt-get会在本地的数据库中搜索w3m的相关信息,然后在相关服务器上下载安装。

  • sudo apt-get update 定期从服务器上下载软件包列表,保持本地列表的最新,其中会包含软件依赖信息的记录。
  • apt-cache 针对本地数据库进行相关操作


    dpkg的使用

    dpkg用于安装、卸载和供给.deb软件包相关信息,其本身是一个底层工具。
  • dpkg -L 可以查看deb包的目录信息


    二进制包的安装

    将从网络上下载的二进制包解压后放在合适的目录中,将包含的可执行的主程序文件的目录添加进PATH环境变量即可。

实验十五+十六

进程的概念

  • 程序 就是执行一系列有逻辑、有顺序结构的指令,帮助我们达成某个结果。
  • 进程 是程序在一个数据集合上的一次执行过程

  • 进程的分类
    • 以功能和服务对象来分
      • 用户进程 可以在用户的控制下运行或关闭
      • 系统进程 执行系统内核程序而产生的进程,root用户也不能干预系统进程的运行
    • 以应用程序的服务类型分类
      • 交互进程 由一个sell终端启动的进程,需要与用户进行交互操作,可以运行在前台也可以在后台。
      • 批处理进程 一个进程集合,负责按顺序启动其他的进程
      • 守护进程 一直运行的一种进程,在系统关闭时终止,独立于控制终端并周期性执行某种任务
  • 进程的衍生
    • 启动终端时就相当于启动了一个bash进程,再输入bash就会再启动一个bash进程,此时第二个bash就是第一个bash创建出来的,称第一个bash是第二个bash的父进程。
    • fork()是一个系统调用,其主要作用就是为当前进程创建一个新的进程,这个进程就是它的子进程。
  • 进程组和sessions
    • 每个进程都是一个进程组成员,这个进程组唯一存在,当子进程被创建,就会成为父进程所在组的一员。进程通过getpgrp()获得其所在组的PGID,这个PGID通常为领导进程的GID,领导进程可以先终结。
    • 子进程被创建后,会成为其父进程session中的一员。每一个进程被创建时,会成为其父进程所在session中的一员。
      • session针对于tyy建立,其中的每个进程都被成为是一个job。session将多个jobs囊括在一个终端,取其中一个job作为前台,接受该终端的输入输出及终端信号,其他jobs在后台运行。
  • 工作管理
    • 每个bash只能管理当前终端中的job。
      • &可以使该命令在后台中运行
      • ctrl+z 可以使当前工作停止并在后台中工作
      • fg[%jobnumber]将后台工作拿到前台来


linux进程管理

  • top 可以实时查看系统关键信息变化

  • ps 可以用于查看进程

  • pstree 可以直接看到相同的进程数量,同时可以看到进程之间的相关性

  • kill 当一个进程或异常结束时,会向父进程返回或接受一个SIGHUP信号而做出结束进程或其他操作。该信号也可以用kill发送,操作进程的结束或重启。
  • nice 命令用于修改进程的优先级-20~19。root可以调整自己的进程也可以调整其他用户的进程;而普通用户只能调整属于自己的进程,范围在0~19。

实验十七

常见日志

  • 日志的分类 一般日志都使用syslog系统日志,存放在/var/log中
    • 系统日志 存放系统内置程序或系统内核之类的日志信息
    • 应用日志 安装的第三方应用所产生的日志

注意:wtmp 和 lastlog日志并不是ASCII文件,而是被编码成了二进制文件,所以不能直接用less、cat、more这样的工具查看,使用last lastlog工具来提取其中的信息。


配置的日志

  • 实现方式
    • 由软件开发商自己定义日志格式然后指定输出日志位置
    • linux提供的日志服务程序

    • 利用logger命令(shell命令接口)可以使用syslog的系统日志模块,还可以行命令行直接向系统日志文件写入信息

  • 转储的日志
    • logroate程序是一个日志文件管理工具,用来把旧的日志文件删除并创建新的日志文件。也可以根据天数切割、管理日志,称为“转储”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值