《linux内核设计分析》 第一周作业

linux 基础入门 课程总结

一、linux系统简介

linux操作系统

整个计算机可以分为 硬件 内核 系统调用 应用程序 操作系统就属于内核和系统调用这两部分

操作系统历史发展

  • 批处理操作系统 20世纪50年代
  • 交互式操作系统 20世纪60年代
    • linux本身只是操作系统的内核,内核是使其他程序能够运行的基础

linux和Windows操作系统的区别

  • 免费与收费
  • 支持方式
    • Windows由微软官方提供重要支持和服务
    • linux大部分为开源*软件
  • 安全性 相比之下linux更加安全
  • 界面
    • Windows为图形界面
    • linux兼具图形界面和命令行操作
  • 可定制性
    • 世界上大部分的软件和服务器都是运行在linux之上
问题:我们学习的到底是linux操作系统本身还是某个linux的发行版?

linux版本
我们课程的全程是linux内核设计与实现,所以学习的是linux系统。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核。在这里我们选择linux发行版的ubuntu来进行学习。

二、linux系统基本操作

桌面环境

UNIX/linux本身是没有图形界面的,我们在UNIX/linux上看到的图形界面都只是运行在linux系统上的一套软件。

linux终端

通常我们在使用 Linux 时,并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成用户输入和显示输出,Linux 系统还提供了一个叫做终端模拟器的程序。

shell 壳

  • 壳:有核必有壳,壳就是指“提供给使用者使用界面的软件” 类似于DOS系统下的命令行和cmd.exe shell就是可以接受用户输入命令的程序,在linux系统中并不是终端模拟器给用户体验带来差异,而是这个shell
  • 核:就是指UNIX/linux内核

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 将终端显示向下滚动
  • 通配符
    • 通配符由shell处理,不由所涉及的命令语句处理,当shell在参数值中遇到通配符会将其当作路径或文件名在磁盘上搜索可能的匹配。实际上是一种shell实现的路径扩展功能。
      • 匹配 0 或多个字符
    • ? 匹配任意一个字符
    • [list] 匹配 list 中的任意单一字符
    • [^list] 匹配 除list 中的任意单一字符以外的字符
    • [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
    • {string1,string2,...} 匹配 string1 或 string2 (或更多)其一字符串
    • {c1..c2} 匹配 c1-c2 中全部字符 如{1..10}

      作业:实现输出图形字符

      《linux内核设计分析》 第一周作业

通过这个例子初步了解linux命令中的sudo命令

sudo是linux系统管:理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。

--来源百度百科

三、linux用户及文件权限管理

用户管理

linux是一个可以实现多用户登陆的操作系统,即同一台主机可以同时登陆多位用户,这些用户之间可以共享一些资源,同时也拥有自己的独有空间。但是这些所有文件都是存放在同一个磁盘中,依靠用户管理权限机制实现。

who命令可以用来查看当前用户
《linux内核设计分析》 第一周作业
输出的第一列表示打开的当前伪终端的用户的用户名,后面的pts/ 表示伪终端的序号。
伪终端是相对于/dev/tty 设备而言,这是指真终端。当用户在/dev/tty7 时每打开一个终端就会产生一个伪终端。
下图所示为我再打开了一个终端后查询的结果。
《linux内核设计分析》 第一周作业

创建用户

利用sudo创建一个新用户
《linux内核设计分析》 第一周作业
利用 su -l lilei 切换用户
《linux内核设计分析》 第一周作业

相关命令

  • groups 查看当前用户属于哪个用户组
    【注】创建用户时不指定用户组就会自动创建一个与用户名相同的用户组。
  • cat /etc/group |sort
    • cat用于读取指定文件的内容并打印到终端
    • |sort 表示读取一个文本进行字典排序输出
    • -E 用于过滤出想找到的内容
      《linux内核设计分析》 第一周作业
  • ect/group文件与etc/password ect/shadow文件都是有关于管理员对用户和用户组管理时相关的文件。
    • linux /etc/group文件是有关于系统管理员对用户和用户组管理的文件,linux用户组的所有信息都存放在/etc/group文件中。
      • 存储格式:group_name:password:GID:user_list
  • usermod 用来修改用户账户的各种设定
    • -G修改用户所属的附加群组,在改变用户sudo权限可以使用
      《linux内核设计分析》 第一周作业
  • sudo deluser 删除用户

遇到的问题

出现问题的原因:没有理解命令的原理。
当时学习完查找工作组和过滤之后,我想在删除用户后重新查找一次工作组,我使用了命令
cat /etc/group -E"shiyanlou"结果如下图
《linux内核设计分析》 第一周作业
再使用了cat /etc/group |grep -E"shiyanlou" 查到了结果
《linux内核设计分析》 第一周作业
查找资料后发现grep是一种文本搜索工具,如果想过滤出需要的用户组,使用grep过滤出需要的用户组才能查看。-E 属于grep命令而不是cat命令。

文件权限

linux中一切皆文件

命令

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

修改文件权限

《linux内核设计分析》 第一周作业

用两种不同的方式修改文件权限
《linux内核设计分析》 第一周作业

作业

《linux内核设计分析》 第一周作业

遇到的问题:

  • 创建用户后,我尝试用touch建立文件发现没有权限,需要给用户赋予sudo权限,利用usermod -G sudo 实现
  • 当普通用户获得sudo权限,需要在命令前加 sudo
  • root权限和sudo权限的差别是普通用户使用sudo 来执行只有root才能执行权限的命令,跟用root用户执行是不一样的,因为这时候他用的还是普通用户的环境变量。

四、linux目录结构及文件基本操作

目录路径

相关命令

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

文件基本操作

相关命令

  • touch命令 可以创建空白文件,更改已有文件的时间戳
    • 《linux内核设计分析》 第一周作业

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

作业

1.创建一个 homework 目录,建立名为 1.txt~10.txt 文件,并删除 1.txt~5.txt
《linux内核设计分析》 第一周作业

2.linux的日志文件在哪个目录
日志文件通常保存在/var/log目录下。

五、环境变量与文件查找

shell环境变量

打印环境变量信息的命令

  • set 当前shell的所有变量
  • env 与当前用户相关的环境变量
  • export 显示从shell中导出成环境变量的变量

    通过一个例子的思考

    《linux内核设计分析》 第一周作业

shell zsh的介绍
通过该例子环境变量是否也可以理解为局部变量和全局变量,export声明一个变量为环境变量后,在另一进程中,就可以打印出该变量。

PATH环境变量的作用

《linux内核设计分析》 第一周作业

在当前目录下执行程序是可以执行的,但是返回到上一级目录中,如果不加上命令的完整路径,就无法运行,这时候就需要在命令中添加PATH环境变量。
《linux内核设计分析》 第一周作业

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

PATH环境变量的修改与删除

《linux内核设计分析》 第一周作业

命令

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

搜索文件

命令

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

作业

找出 /etc/ 目录下的所有以 .list 结尾的文件
《linux内核设计分析》 第一周作业

遇到的问题原因是对find命令理解不够,按照find命令的格式,应该是 find /etc/ -name *.list 第一次出现错误的原因是没有写“-name”参数。
寻找文件
《linux内核设计分析》 第一周作业

六、文件打包与解压缩

zip压缩打包程序

命令

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

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

tar压缩打包程序

命令

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

七、linux下的帮助命令

命令

  • help命令 只能用于显示内建命令的帮助信息,如果是外部命令利用参数 --help 获得帮助。
    《linux内核设计分析》 第一周作业

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

八、linux任务计划crontab

crontab从输入设备读取指令,将其存与crontab文件中,一般存入的指令被守护进程激活,crond在后台运行,每分钟检查一次,下图为添加了一个文件以及查看任务命令在日志中的信息。
《linux内核设计分析》 第一周作业

九、命令执行顺序控制与管道

命令执行顺序

命令顺序执行 利用;将多条语句分割开来
命令选择执行 利用||或&&当满足条件的时候再执行后面的语句
《linux内核设计分析》 第一周作业

命令

  • cut 命令,打印每一行的某一段
    • -d 自定义分隔符,默认为制表符
    • -f 与-d一起使用,指定显示哪个区域
    • -c 按字符选取
      《linux内核设计分析》 第一周作业
  • grep 命令 在文本中或stdin中查找匹配字符串
    • -r 表示递归搜索子目录中的文件
    • -n 表示打印匹配项行号
    • -I 忽略二进制文件
  • wc 命令 用于统计并输出一个文件中行、单词和字节的数目
    • 《linux内核设计分析》 第一周作业
  • sort 命令 将输入按照一定的方式排序输出
    • 默认为字典排序
    • -r 反转排序
    • -t 指定字段的分隔符
    • -k 用于指定对哪一个字段进行排序
    • -n 按照数字排序
  • uniq 命令 用于过滤或者输出重复行
    • uniq命令只能去连续重复行,不是全文去重
    • 《linux内核设计分析》 第一周作业

十、简单的文本处理

命令

  • tr 用来删除一段文本信息中的某些文字或将其进行转换
    • -d 删除匹配字符
    • -s 去除指定文本中连续并重复的字符
    • 《linux内核设计分析》 第一周作业
  • col 将tab换成对等数量的空格键
    • -x tab换成空格
    • -h 空格换成tab
  • join 将两个文件中包含相同内容的那一行合并在一起
    • 《linux内核设计分析》 第一周作业

    • 遇到的问题 刚开始没有理解在join命令中以:为分隔符是什么意思,后来利用vim 打开两个文件对比后知道,两个文档中数据对比遇到分隔符结束,相同的只写一个,不相同的链接在一起
  • paste 将多个文件合并在一起,不对比数据
    • -d 指定分隔符
    • -s 不合并到一行,每个文件为一行

十一、数据流重定向

基本重定向

《linux内核设计分析》 第一周作业

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

  • tee 命令 同时重定向到多个文件
    tee命令实现的是,当不仅仅需要将输出重定向到文件,同时需要将信息打印在终端。
    《linux内核设计分析》 第一周作业

  • exec 命令 实现永久重定向,利用指定的命令替换当前的shell
    • exec 1>somefile 就是指将标准输出重定向到文件中,直到退出当前shell或取消当前重定向
      利用exec命令创建文件描述符
      《linux内核设计分析》 第一周作业
  • 关闭文件描述符
    • exec 3>&-
    • 《linux内核设计分析》 第一周作业
      从图中可以看到此时的3号文件符已经被删除了
  • 完全屏蔽命令的输出 /dev/null通常被用于丢弃不需要的输出流
  • xargs 命令 将参数列表转换成小块分段传递给其他命令,以避免参数列表过长

十二、正则表达式基础

使用基本正则表达式

《linux内核设计分析》 第一周作业

利用grep配合正则表达式实现更为准确的字符串查找。结合-E参数,使用扩展正则表达式。
《linux内核设计分析》 第一周作业

sed流编辑器

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

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

awk文本处理语言

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

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

十三、linux下的软件安装

apt 包管理工具

《linux内核设计分析》 第一周作业

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

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

    dpkg的使用

    dpkg用于安装、卸载和供给.deb软件包相关信息,其本身是一个底层工具。

  • dpkg -L 可以查看deb包的目录信息

    二进制包的安装

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

十四、linux进程管理

进程的概念

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

  • 进程的分类
    • 以功能和服务对象来分
      • 用户进程 可以在用户的控制下运行或关闭
      • 系统进程 执行系统内核程序而产生的进程,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 可以实时查看系统关键信息变化
    《linux内核设计分析》 第一周作业

  • ps 可以用于查看进程
    《linux内核设计分析》 第一周作业

  • pstree 可以直接看到相同的进程数量,同时可以看到进程之间的相关性
    《linux内核设计分析》 第一周作业

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

十五、linux系统日志

常见日志

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

注意:wtmp 和 lastlog日志并不是ASCII文件,而是被编码成了二进制文件,所以不能直接用less、cat、more这样的工具查看,使用last lastlog工具来提取其中的信息。
《linux内核设计分析》 第一周作业

配置的日志

  • 实现方式
    • 由软件开发商自己定义日志格式然后指定输出日志位置
    • linux提供的日志服务程序
      《linux内核设计分析》 第一周作业

    • 利用logger命令(shell命令接口)可以使用syslog的系统日志模块,还可以行命令行直接向系统日志文件写入信息
      《linux内核设计分析》 第一周作业

  • 转储的日志
    • logroate程序是一个日志文件管理工具,用来把旧的日志文件删除并创建新的日志文件。也可以根据天数切割、管理日志,称为“转储”。
      《linux内核设计分析》 第一周作业

总结

第一次接触linux系统,通过本周的学习对linux系统的基本操作有了大致的理解,但是发现linux系统有很多命令,不是一次性就可以完全掌握的,需要我们平时在练习时遇到不会的就记录下来多看多记,才能够掌握。学习是一个需要不断练习不断记忆的过程,利用博客将遇到的重要的知识点总结下来,方便以后的复习,因为只学习一次明显是不够的,需要在以后不断重复,遇到问题及时总结。

上一篇:ML(4)——逻辑回归


下一篇:vue和iview中native点击事件修饰