操作系统内核-实验一

实验目的

  1. 安装Red Hat Linux
  2. 熟悉Linux目录结构以及目录功能简介。
  3. 熟悉Linux系统的基本操作。
  4. Vi的熟悉与使用。
  5. 安装并使用Linux的编译器GCC,编写一个能通过编译且运行成功的小程序。

步骤

VMware workstation 安装Red Hat Linux

  1. 打开VMware workstation,一次选择“文件→新建虚拟机→自定义安装→下一步”,选择稍后安装操作系统,点击下一步;

    img

  2. 选择客户机操作系统为Linux,版本为Red Hat Enterprise 6 64位

    img

  3. 命名虚拟机为:Red Hat Enterprise 6 64位,设置虚拟机路径点击下一步;

    img

  4. 配置处理器数量为1,每个处理器的内核内核数量为1,点击下一步;

    img

  5. 设置虚拟机内存为2GB,点击下一步;

    img

  6. 设置网络类型为NAT模式,点击下一步;

    img

  7. 选择I/O控制器类型为LSI Logic,磁盘类型为SCSI,点击下一步;

    img

    img

  8. 选择创建新的虚拟磁盘,磁盘大小为20GB,将磁盘拆分成多个文件,点击下一步;

    img

    img

  9. 命名指定磁盘文件,点击下一步;

    img

  10. 点击自定义硬件,添加虚拟机ISO镜像路径,设备状态设置为已连接,否则无法检测到镜像,然后点击安装完成;

    img

    img

  11. 打开虚拟机,Install or upgrade an existing system进入图形安装界面;

    img

  12. 开始测试硬盘,选择OK;

    img

  13. 测试完成后进入安装界面,开始安装;

    img

  14. 选择语言为中文简体;

    img

  15. 选择安装键盘为美国英语式;

    img

  16. 选择安装将使用基本存储设备;

    img

  17. 提示存储设备警告,选择忽略所有数据;

    img

  18. 明明计算机为localhost.leeyuxun,网络设置选择有线system the0;

    img

  19. 时区设置为上海;

    img

  20. 设置跟用户密码;

    img

  21. 安装种类选择创建自定义布局;

    img

  22. 创建一个200Mext4分区,挂载到/boot下,依次点击创建→标准分区→创建,挂载点选择/boot

    img

    img

  23. 用上述方法创建一个swap分区,不设置挂载点,大小为内存的2倍即4GB,再创建一个ext4分区,挂载到/目录下,选择“使用全部可用空间”;

    img

  24. 然后选择格式化→将修改写入磁盘,点击下一步;

    img

  25. 基本服务器安装软件组选择桌面,存储库选择自定义;

    img

  26. 左侧选择桌面,右侧全部选择;

    img

  27. 左侧选择开发,右侧选择桌面平台开发和开发工具;

    img

  28. 语言支持选择世界语和中文;

    img

  29. 点击下一步开始安装软件包;

    img

  30. 安装完成后选择重新引导;

    img

  31. 同意许可证信息;

    img

  32. 设置用户米、全名、密码,创建用户;

    img

  33. 设置日期和时间;

    img

  34. 设置Kdump内存为128M

    img

  35. 重启后进入桌面,显示如下,安装完成;

    img

    img

熟悉Linux目录结构以及目录功能简介

  1. 安装tree,在打开终端,顶级目录下输入tree -L 1,输出一级目录如下,包括文件夹有:binbootdevetchomeliblost+foundmediamiscmntoptprocrootsbinselinuxsrvsystmpusrvar等;
    img

  2. 分析每个文件夹功能:

    1. /bin
      文件内容如下,用于存放使用者最经常使用的命令,如:catlsvi
      img

    2. /boot
      文件内容如下,这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件;
      img

    3. /dev
      文件内容如下,dev是**Device(设备)**的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的;
      img

    4. /etc
      文件内容如下,这个目录用来存放所有的系统管理所需要的配置文件和子目录;
      img

    5. /home
      文件内容如下,是用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,前面提到该机器用户的用户名为levi
      img

      1. /lib
        文件内容如下,这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
        img

      2. /lost+found
        这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件;

      3. /media
        Linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux会把识别的设备挂载到这个目录下;

      4. /misc
        该目录自动挂载服务目录,对应autofs服务;

      5. /mnt
        目录内容如下,系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt上,然后进入该目录就可以查看光驱里的内容了。
        img

      6. /opt
        文件内容如下,这是给主机额外安装软件所摆放的目录。比如安装一个ORACLE数据库则就可以放到这个目录下,默认是空的;
        img

      7. /proc
        这个目录的内容不在硬盘上而是在内存里,可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping该机器;

        1
        echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
      8. /root
        文件目录如下,该目录为系统管理员,也称作超级权限者的用户主目录;
        img

      9. /sbin
        文件目录如下,s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序;
        img

      10. /selinux
        文件目录如下,这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的;
        img

      11. /srv
        该目录存放一些服务启动之后需要提取的数据;

      12. /sys
        文件目录如下,这是linux2.6内核的一个很大的变化,该目录下安装了2.6内核中新出现的一个文件系统sysfssysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建;
        img

      13. /tmp
        这个目录是用来存放一些临时文件的;

      14. /usr
        这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录;
        img

        1. /usr/bin
          该目录下存放着许多系统用户使用的应用程序
        2. /usr/include
          改目录下存放LINUX下开发和编译应用程序需要的头文件
        3. /usr/lib
          改目录下存放一些常用的动态链接共享库和静态档案库;
        4. /usr/local
          提供给一般用户的/usr目录,在这安装软件最适合;
        5. /usr/man
          该目录是帮助文档目录;
        6. /usr/sbin
          改目录存放超级用户使用的比较高级的管理程序和系统守护程序;
        7. /usr/share
          该目录包含 /usr 中的应用程序需要的所有只读、与硬件架构无关的数据,其中包括时区和地区信息(zoneinfolocale);
        8. /usr/src
          这是内核源代码默认的放置目录;
      15. /var
        文件目录如下,这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log目录下,另外mail的预设放置也是在这里;
        img

熟悉Linux系统的基本操作

Linux挂载

通过mount命令查看已挂载的文件系统,会输出丰富的信息,如下图所示
img

  • mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点

    各选项的含义:

    • -t 系统类型:指定欲挂载的文件系统类型。Linux 常见的支持类型有 EXT2、EXT3、EXT4、iso9660(光盘格式)、vfat、reiserfs 等。如果不指定具体类型,挂载时 Linux 会自动检测;
  • -L 卷标名:除了使用设备文件名(例如 /dev/hdc6)之外,还可以利用文件系统的卷标名称进行挂载;

    • -n:在默认情况下,系统会将实际挂载的情况实时写入 /etc/mtab 文件中,但在某些场景下(例如单人维护模式),为了避免出现问题,会刻意不写入,此时就需要使用这个选项;
    • -o 特殊选项:可以指定挂载的额外选项,比如读写权限、同步/异步等,如果不指定,则使用默认值(defaults);
  • 命令尝试:
    使用命令mount -t iso9660 /dev/cdrom /mnt/cdrom/dev/cdrom下的iso9660文件挂载到/mnt/cdrom文件目录下;
    img
    img

Linux系统的启动与退出

  • shutdown [-t seconds] [-rkhncfF] time [message]
    参数说明:
    • -t seconds,设定在几秒钟之后进行关机程序。
    • -k,并不会真的关机,只是将警告讯息传送给所有使用者。
    • -r,关机后重新开机。
    • -h,关机后停机。
    • -n,采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。
    • -c,取消目前已经进行中的关机动作。
    • -f,关机时,不做 fcsk 动作(检查 Linux 档系统)。
    • -F,关机时,强迫进行 fsck 动作。
    • time,设定关机的时间。
    • message,传送给所有使用者的警告讯息。
  • 命令尝试:
    • Shutdown now //立刻关机
    • shutdown +5 “System will shutdown after 5 minutes” // 系统提示五分钟后关机,每分钟提醒一次
      img
    • shutdown –r now //立即重启
    • shutdown –r 23:59 //23:59重启
    • shutdown –h now //将系统的服务停掉之后立即关机
    • shutdown -k now ‘this system will reboot’ //立刻发送警告信息
      img

Linux系统对文件和目录的操作命令

  1. ls命令

    • **ls [**选项] [目录或文件]

      显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)

      选项包括:

      • -a,显示所有的文件,包括隐藏文件(以.开头的文件);
      • -A,同 -a ,但不列出 “.” (目前目录) 及 “..” (父目录);
      • -c,和-lt一起使用,显示列表并且以ctime(文件状态最后改变时间)排序。和-l一起使用:显示ctime并且以文件名排序。其他情况,以ctime排序;
      • -d,仅列出目录本身,而不是列出目录里的内容列表;
      • -f,直接列出结果,而不进行排序(ls默认会以文件名排序);
      • -F 在列出的文件名称后加一符号;例如可执行档则加 “*”, 目录则加 “/“;
      • -g,列表显示结果,和-l类似,但是不显示文件所属者;
      • -h,将文件内容大小以GBKB等易读的方式显示;
      • -i,结合-l参数,列出每个文件的inode
  • -l:列出长数据串,显示出文件详细信息,依次为文件属性(占10个字符空间)、文件数、拥有者、所属的group、文件大小、建档日期、文件名;
    • 实例如下
      • ls -l //将目录下的文件信息详细列出
        img
      • ls –ld media //列出文件目录下文件media的详细信息
        img
      • ls -as -S //列出所有文件及文件大小,并以文件大小进行排序
        img
  1. cp命令

    • **cp [**选项] 源文件或目录 目标文件或目录

      将源文件或目录拷贝到目标文件或目录

      选项包括:

      • -a,此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容;
      • -d,复制时保留链接,这里所说的链接相当于Windows系统中的快捷方式;
      • -f,覆盖已经存在的目标文件而不给出提示;
      • -i,与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答”y”时目标文件将被覆盖;
      • -p,除复制文件的内容外,还把修改时间和访问权限也复制到新文件中;
      • -r,若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件;
      • -l,不复制文件,只是生成链接文件;
    • 实例如下:

      • cp tree.txt tree1.txt //将tree.txt内容复制到tree1.txt里
        img
        img
      • cp -i /root/桌面/json/json.txt /root/桌面/tree/tree1.txt //将/root/桌面/json目录下的json.txt复制到/root/桌面/tree/tree1.txt并覆tree.txt内容;
        img
        img
  2. mv命令

    • **mv [**选项] 源文件或目录 目标文件或目录

      结构 说明
      mv 文件名 文件名 将源文件名改为目标文件名
      mv 文件名 目录名 将文件移动到目标目录
      mv 目录名 目录名 目标目录已存在,将源目录移动到目标目录; 目标目录不存在则改名
      mv 目录名 文件名 出错

      选项包括:

      • -i,若指定目录已有同名文件,则先询问是否覆盖旧文件;
      • -f,在mv操作要覆盖某已有的目标文件时不给任何指示;
    • 实例如下

      • mv json.txt tree.txt //将json.txt改为tree.txt;
        img
      • mv tree.txt .. //将tree.txt移动至父目录;
        img
  3. rm命令

    • **rm [**选项] 文件名|目录名

      选项包括:

      • -i,删除前逐一询问确认;
      • -f,即使原档案属性设为唯读,亦直接删除,无需逐一确认;
      • -r,将目录及以下之档案亦逐一删除;
    • 实例如下

      • rm tree.txt //删除tree.txt文件
        img
      • rm –i * //删除目录下所有文件并在删除前询问
        img
      • rm -rf tree //删除目录下的tree文件,不询问,即使tree是只读文件
        img
  4. mkdir命令

    • **mkdir [**选项] dir-name

      用于建立子目录

      选项包括:

      • -p,确保目录名称存在,不存在的就建一个;
      • -m,设定权限(类似chmod);
      • -v,每次创建目录都显示信息;
    • 实例如下

      • mkdir tree //目录下新建名为tree的子目录
        img
      • mkdir -p mine/tree //在工作目录的mine目录下新建名为tree的子目录
        img
      • mkdir -m 744 list //创建权限为774的目录
        img
  5. rmdir命令

    • **rmdir [**选项] dir-name

      删除空目录,无法删除非空目录;

      选项包括:

      • -p,递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除;
      • -v,显示指令执行过程;
    • 实例如下:

      • rmdir tree //删除目录tree
        img
  6. cd命令

    • cd [dirName]

      切换目录,dirName表示要切换的目标目录

    • 实例如下:

      • cd .. //返回到上一级目录
        img
      • cd /root //进入到root目录
        img
  7. pwd命令

    ​ 用于显示工作目录

    • 实例如下:

      img

  8. cat命令

    • **cat [**选项] 文件列表

      用于连接文件并打印到标准输出设备上;

      选项包括:

      • -n,由 1 开始对所有输出的行数编号;
      • -b,和 -n 相似,只不过对于空白行不编号;
      • -s,当遇到有连续两行以上的空白行,就代换为一行的空白行;
      • -v,使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外;
      • -E,在每行结束处显示 $;
      • -T,将 TAB 字符显示为 ^I;
      • -A,等价于 -vET;
      • -e,等价于”-vE”选项;
      • -t,等价于”-vT”选项;
    • 实例如下:

      • cat –b tree.txt //输出tree.txt内容,且不对空行进行编号;
        img
      • cat > mine.txt //清空mine.txt内容
        img
        img
      • Zcat file1 file2 > file3 //file1和file2的文档内容,附加到file3里;
        img
  9. find命令

    • find path -option [-print] [-exec -ok |xargs |grep] [command {} ;]

      用来在指定目录下查找文件,任何位于参数之前的字符串都将被视为欲查找的目录名,如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示;

      选项包括:

      • path
        • ~表示$HOME目录;
        • **.**表示当前目录
        • /表示根目录
      • -print,表示将结果输出到标准输出
      • -exec,对匹配的文件执行该参数所给出的shell命令,形式为”command {} ;”;
      • -ok,与exec作用相同,区别在于,在执行命令之前,会给出提示,让用户确认是否执行;
      • |xargs,与exec作用相同 ,起承接作用,区别在于 |xargs 主要用于承接删除操作,而-exec都可用,如复制、移动、重命名等;
      • option,表示查找方式:
        • -name filename //查找名为filename的文件
        • -perm //按执行权限来查找
        • -user username //按文件属主来查找
        • -group groupname //按组来查找
        • -mtime -n +n //按文件更改时间来查找文件,-n指n天以内,+n指n天以前
        • -atime -n +n //按文件访问时间来查找文件,-n指n天以内,+n指n天以前
        • -ctime -n +n //按文件创建时间来查找文件,-n指n天以内,+n指n天以前
        • -nogroup //查无有效属组的文件,即文件的属组在/etc/groups中不存在
        • -nouser //查无有效属主的文件,即文件的属主在/etc/passwd中不存
        • -type b/d/c/p/l/f //查是块设备、目录、字符设备、管道、符号链接、普通文件
        • -size n[c] //查长度为n块[或n字节]的文件
        • -mount //查文件时不跨越文件系统mount点
        • -follow //如果遇到符号链接文件,就跟踪链接所指的文件
        • -prune //忽略某个目录
    • 实例如下:

      • find / -name a.txt //在根目录查找名字为file1.txt的文件;
        img
      • find / -name .htm –a –user leeyuxun //在根目录下查找属主为leeyuxun的htm文件
        img
      • find . –name "*.txt" -print //在当前目录查找txt文件并打印
        img
      • find /dev -user leeyuxun -print //查找dev目录下的属主为leeyuxun的文件并打印;
        img
      • find . -name “*.o” -mtime +1 -mtime -7 -print //查找7天以内1天以前的o文件并打印;
        img
  10. grep命令

    • grep [-abcEFGhHilLnqrsvVwxy][-A<****显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][–help][范本样式][文件或目录…]

      选项内容:

      • -a,不要忽略二进制的数据;
      • -A,除了显示符合范本样式的那一列之外,并显示该行之后的内容
      • -b,在显示符合样式的那一行之前,标示出该行第一个字符的编号
      • -B,除了显示符合样式的那一行之外,并显示该行之前的内容
      • -c,计算符合样式的列数;
      • -C,除了显示符合样式的那一行之外,并显示该行之前后的内容;
      • -d,当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作;
      • -e,指定字符串做为查找文件内容的样式;
      • -E,将样式为延伸的正则表达式来使用;
      • -f,指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式;
      • -F,将样式视为固定字符串的列表;
      • -G,将样式视为普通的表示法来使用;
      • -h,在显示符合样式的那一行之前,不标示该行所属的文件名称;
      • -H,在显示符合样式的那一行之前,表示该行所属的文件名称;
      • -i,忽略字符大小写的差别;
      • -I,列出文件内容符合指定的样式的文件名称;
      • -L,列出文件内容不符合指定的样式的文件名称;
      • -n,在显示符合样式的那一行之前,标示出该行的列数编号;
      • -o,只显示匹配PATTERN 部分;
      • -q,不显示任何信息;
      • -r,此参数的效果和指定”-d recurse”参数相同;
      • -s,不显示错误信息;
      • -v,显示不包含匹配文本的所有行;
      • -V,显示版本信息;
      • -w,只显示全字符合的列;
      • -x,只显示全列符合的列;
      • -y,此参数的效果和指定”-i”参数相同;
    • 实例如下:

      • grep mine * //在该目录下查找包含mine内容的文件;
        img
      • grep ‘text file’ example //在mine.txt中搜索字符串‘mine 12’并打印;
        img
  11. more命令

    • **more [**选项] 文件名

      类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似)

      选项内容:

      • -num,一次显示的行数;
      • -d,提示使用者,在画面下方显示 [Press space to continue, ‘q’ to quit.] ,如果使用者按错键,则会显示 [Press ‘h’ for instructions.] 而不是 ‘哔’ 声;
      • -l,取消遇见特殊字元 ^L(送纸字元)时会暂停的功能;
      • -f,计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上);
      • -p,不以卷动的方式显示每一页,而是先清除萤幕后再显示内容;
      • -c,跟-p相似,不同的是先显示内容再清除其他旧资料;
      • -s,当遇到有连续两行以上的空白行,就代换为一行的空白行;
      • -u,不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同);
      • +/pattern,在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示;
      • +num,从第 num 行开始显示;
      • fileNames,欲显示内容的文档,可为复数个数;
    • 实例如下:

      • more mine.txt //打开mine.txt文件
        img

文档备份与压缩命令

  1. tar命令

    • tar [ 主选项+辅选项] 文件或者目录

      用于备份文件;

      主选项包括:

      • -A,新增文件到已存在的备份文件;
      • -B,读取数据时重设区块大小;
      • -c,建立新的备份文件;
      • -d,对比备份文件内和文件系统上的文件的差异;
      • -g,处理GNU格式的大量备份;
      • -G,处理旧的GNU格式的大量备份;
      • -i,忽略备份文件中的0 Byte区块,也就是EOF;
      • -j,支持bzip2解压文件;
      • -k,解开备份文件时,不覆盖已有的文件;
      • -l,复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制;
      • -m,还原文件时,不变更文件的更改时间;
      • -r,添加文件到已经压缩的文件;
      • -t,显示压缩文件的内容;
      • -u,添加改变了和现有的文件到已经存在的压缩文件;
      • -v,显示操作过程;
      • -W,确认压缩文件的正确性;
      • -x,从压缩的文件中提取文件;
      • -z,支持compress解压文件;

      辅选项包括

      • -b<区块数目>,设置每笔记录的区块数目,每个区块大小为12Bytes;
      • -C,切换到指定目录
      • -f,指定压缩文件
    • 实例如下:

      • tar -cvf data.tar * //将目录下的所有文件打包成data.tar;
        img
      • tar -cvzf data.tar.gz * //将目录下的所有文件打包成data.tar.gz;
        img
      • tar -tvf data.tar //查看data.tar中文件:所属权限、用户名用户组、日期等
        img
      • tar -xvf data.tar //解压data.tar包
        img
  2. gzip命令

    • **gzip [**选项] 压缩(解压缩)的文件名

      gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出”.gz”的扩展名

      选项包括:

      • -a,使用ASCII文字模式;
      • -c,把压缩后的文件输出到标准输出设备,不去变动原始文件;
      • -d,解开压缩文件;
      • -r,递归处理,将指定目录下的所有文件及子目录一并处理;
      • -f,强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接;
      • -l,列出压缩文件的相关信息;
      • -n,压缩文件时,不保存原来的文件名称及时间戳记;
      • -N,压缩文件时,保存原来的文件名称及时间戳记;
      • -q,不显示警告信息;
      • -S<压缩字尾字符串>,更改压缩字尾字符串;
      • -t,测试压缩文件是否正确无误;
      • -v,显示指令执行过程;
      • -V,显示版本信息;
      • -L,显示版本与版权信息;
      • -num,用指定的数字num调整压缩的速度,-1或–fast表示最快压缩方法(低压缩比),-9或–best表示最慢压缩方法(高压缩比),系统缺省值为6;
      • -h,在线帮助;
    • 实例如下:

      • gzip –best mine.txt //高压缩比压缩mine.txt文件;
        img
      • gzip -l mine.txt.gz //列出mine.txt.gz相关信息;
        img
      • gzip -d mine.txt.gz //解压缩mine.txt.gz;
        img
  3. unzip命令

    • **unzip [**选项] 压缩文件名.zip

      用于解压缩zip文件;

      选项包括:

      • -c,将解压缩的结果显示到屏幕上,并对字符做适当的转换;
      • -f,更新现有的文件;
      • -l,显示压缩文件内所包含的文件;
      • -p,与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换;
      • -t,检查压缩文件是否正确;
      • -u,与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中;
      • -v,执行是时显示详细的信息;
      • -z,仅显示压缩文件的备注文字;
      • -a,对文本文件进行必要的字符转换;
      • -b,不要对文本文件进行字符转换;
      • -C, 压缩文件中的文件名称区分大小写;
      • -j, 不处理压缩文件中原有的目录路径;
      • -L,将压缩文件中的全部文件名改为小写;
      • -M,将输出结果送到more程序处理;
      • -n,解压缩时不要覆盖原有的文件;
      • -o,不必先询问用户,unzip执行后覆盖原有文件;
      • -P<密码>,使用zip的密码选项;
      • -q,执行时不显示任何信息;
      • -s,将文件名中的空白字符转换为底线字符;
      • -V,保留VMS的文件版本信息;
      • -X,解压缩时同时回存文件原来的UID/GID;
      • -d<目录>,指定文件解压缩后所要存储的目录;
      • -x<文件>,指定不要处理.zip压缩文件中的哪些文件;
    • 示例如下:

      • unzip tree.zip -d mine //将tree.zip解压到mine目录;
        img
      • unzip -j tree.zip //解压tree.zip到tree.zip同一目录下,不新建目录;
        img

Linux权限改变命令

  1. chmod [操作符] [mode] 文件名

    img

    Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x;
    Linux下权限的属组有 拥有者 、群组 、其它组 三种。每个文件都可以针对这三个属组(粒度),设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组;

    • 常见的权限表示形式有:
      • -rw——- (600) 只有拥有者有读写权限。
      • -rw-r–r– (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
      • -rwx—— (700) 只有拥有者有读、写、执行权限。
      • -rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
      • -rwx–x–x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
      • -rw-rw-rw- (666) 所有用户都有文件读、写权限。
      • -rwxrwxrwx (777) 所有用户都有读、写、执行权限。
    • 示例如下:
      • chmod o+w file5 //表示其他人增加对file5的写权限
        img
      • chmod g=x file5 //表示群体可以执行file5;
        img
      • chmod go-rwx file6 //表示拥有者、群体减少对file6的读写执行权限;
        img
      • chmod 751 file6 //表示拥有者为rwx,群体为rx,其他人为x权限;
        img
  2. chgrp [选项] 组 文件

    ​ 用于变更文件或目录的所属群组;

    • ​ 选项包括:
      • -c,效果类似”-v”参数,但仅回报更改的部分;
      • -f,不显示错误信息;
      • -h,只对符号连接的文件作修改,而不更动其他任何相关文件;
      • -R,递归处理,将指定目录下的所有文件及子目录一并处理;
      • -v,显示指令执行过程;
    • 实例如下:
      • chgrp leeyuxun file6 //将file6的用户组权限改为leeyuxun;
        img
  3. chown [选项] 用户或组 文件

    ​ 将指定文件的拥有者改为指定的用户或组;

    • 选项包括:
      • -c,显示更改的部分的信息
      • -f,忽略错误信息
      • -h,修复符号链接
      • -v,显示详细的处理信息
      • -R,处理指定目录以及其子目录下的所有文件
    • 实例如下:
      • chown leeyuxun file6 //将file6的拥有者改为leeyuxun;
        img

Linux与用户有关的命令

  1. passwd [-k] [-l] [-u [-f]] [-d] [-S] [用户名]

    ​ 更改用户密码;

    • ​ 参数含义:
      • -d,删除密码;
      • -f,强制执行;
      • -k,更新只能发送再过期之后;
      • -l,停止账号使用;
      • -S,显示密码信息;
      • -u,启用已被停止的账户;
      • -x,设置密码的有效期;
      • -g,修改群组密码;
      • -i,过期后停止用户账号;
    • 实例如下:
      • passwd -S leeyuxun //显示用户leeyuxun的密码信息;
        img
  2. su [-fmp] [-c command] [-s shell] [–help] [–version] [-] [使用者账号]

    ​ 用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。使用权限:所有使用者。

    • 参数说明:
      • -f,不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh;
      • -m -p,执行 su 时不改变环境变数;
      • -c command,变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者;
      • -s shell,指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell;
    • 实例如下:
      • su root //更换为root账号;
        img

Linux系统管理命令

  1. write 用户账号 [终端名称]

    ​ 用于传讯息给其他使用者。使用权限:所有使用者。

    • 参数说明:
      • 用户账号:预备传讯息的使用者帐号;
      • 终端名称:如果使用者同时有两个以上的 tty 连线,可以自行选择合适的 tty 传讯息;
  2. mesg [y/n]

    ​ 用于设置终端机的写入权限;

    • 参数如下:
      • n,不允许其他用户将信息直接显示在你的屏幕上;
      • y,允许其他用户将信息直接显示在你的屏幕上;
  3. free [-b | -k | -m]

    ​ 用于显示内存状态。free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。

    • 参数如下:
      • -b,以Byte为单位显示内存使用情况。
      • -k,以KB为单位显示内存使用情况。
      • -m,以MB为单位显示内存使用情况。
    • 实例如下:
      • free -k //以kb显示内存
        img

Linux磁盘管理命令

  1. df [选项] [文件]

    ​ 命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计;

    • 选项包括:
      • -a,包含所有的具有 0 Blocks 的文件系统;
      • –block-size={SIZE},使用{SIZE}大小的Blocks;
      • -h,使用人类可读的格式(预设值是不加这个选项的…);
      • -H,很像 -h, 但是用 1000 为单位而不是用 1024;
      • -i,列出 inode 资讯,不列出已使用 block;
      • -k,就像是 –block-size=1024;
      • -l,限制列出的文件结构;
      • -m,就像 –block-size=1048576;
      • -P,使用 POSIX 输出格式;
      • -t,限制列出文件系统的TYPE;
      • -T,显示文件系统的形式;
      • -x,限制列出文件系统不要显示 TYPE;
    • 实例如下:
      • df -aT //显示目录下包含所有的具有 0 Blocks 的文件系统,及其系统形式;
        img
      • df -t ext4 //只显示ext4类型的文件系统;
        img
  2. du [选项] [目录名或文件名]

    ​ 用于显示目录或文件的大小;

    • 选项包括:
      • -a,显示目录中个别文件的大小;
      • -b,显示目录或文件大小时,以byte为单位;
      • -c,除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和;
      • -D,显示指定符号连接的源文件大小;
      • -h,以K,M,G为单位,提高信息的可读性;
      • -H,与-h参数相同,但是K,M,G是以1000为换算单位;
      • -k,以1024 bytes为单位;
      • -l,重复计算硬件连接的文件
      • -L<符号连接>,显示选项中所指定符号连接的源文件大小;
      • -m,以1MB为单位;
      • -s,仅显示总计;
      • -S,显示个别目录的大小时,并不含其子目录的大小;
      • -x,以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过
      • -X<文件>,在<文件>指定目录或文件;
    • 实例如下:
      • du –a / //显示目录下所有文件大小;
        img
      • du -s leeyuxun //显示属于leeyuxun的文件总数;
        img
  3. dd [选项]

    ​ 用于读取、转换并输出数据;

    • 选项如下:
      • if=文件名,输入文件名,默认为标准输入。即指定源文件。
      • of=文件名,输出文件名,默认为标准输出。即指定目的文件。
      • ibs=bytes,一次读入bytes个字节,即指定一个块大小为bytes个字节。
      • obs=bytes,一次输出bytes个字节,即指定一个块大小为bytes个字节。
      • bs=bytes,同时设置读入/输出的块大小为bytes个字节。
      • cbs=bytes,一次转换bytes个字节,即指定转换缓冲区大小。
      • skip=blocks,从输入文件开头跳过blocks个块后再开始复制。
      • seek=blocks,从输出文件开头跳过blocks个块后再开始复制。
      • count=blocks,仅拷贝blocks个块,块大小等于ibs指定的字节数。
    • 实例如下:
      • dd if=/dev/fd of=/dev/fd1 bs=5120 //将dev下的fd复制到fd1中,设置输入块大小为5120字节;
        img
  4. fdformat [−n] 设备名

    ​ 用于对指定的软碟机装置进行低阶格式化;

    ​ -n,关闭确认功能。这个选项会关闭格式化之后的确认步骤;

Linux进程管理命令

  1. at [选项] 时间

    ​ 设置在指定时间执行指定的命令;

    • 选项包括:
      • -l,显示等待执行的调度作业;
      • -d,删除指定的调度作业;
      • -v,显示作业执行的时间;
      • -m,作业结束后发送邮件给执行的at命令的用户;
  2. bg,fg

    ​ 前后台切换;

    • 前台作业切换到后台运行:bg [作业号];
    • 后台作业切换到前台运行:fg [作业号];
    • 显示当前所有作业:jobs [选项];
  3. ps [选项]

    ​ 显示系统中当前的进程及其状态;

    • 选项包括:
      • -a,显示当前终端上所有用户的进程;
      • -e,显示所有进程的信息;
      • -f,显示完整格式的输出;
      • -l,显示进程的详细信息,包括父进程号、登录的终端号、进程优先级等;
      • -u,显示指定用户的所有进程;
      • -C <命令>,列出指定命令的状况;
      • -x,显示后台进程的信息;
      • -t <终端号>,显示指定终端上的进程信息;
    • 实例如下:
      • ps //列出所有进程
        img
  4. pstree [选项]

    ​ 树形图形显示进程之间的相互关系;

    • 选项包括
      • -a,显示启动进程的命令行;
      • -n,按照进程号进行排序;
      • -p,显示进程号;
    • 实例如下:
      • pstree -p //列出进程树,并显示进程号;
        img
  5. kill命令

    kill [-s <****信息名称或编号>] [程序]或kill [-l <信息编号>]

    • 参数说明:
      • -l <信息编号>,若不加<信息编号>选项,则-l参数会列出全部的信息名称;
      • -s <信息名称或编号>,指定要送出的信息;
      • [程序],可以是程序的PID或是PGID,也可以是工作编号;

Linux其他命令

  1. echo [-n] 字符串

    ​ 输出字符串;

    • -n,不在末尾换行;
    • 示例显示:
      • echo Hello world! //打印字符串“Hello world!”
        img
  2. cal [选项] [月份] [年]

    ​ 用于查看日历信息;

    • 实例如下:
      • cal 9 2019 //打印2019年9月日历;
        img
  3. date [选项] +显示时间格式

    ​ 用来显示或设定系统的日期与时间;

    • 选项包括:
      • -d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;
      • -s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;
      • -u:显示GMT;
    • 实例如下:
      • date 08211550 //显示8月21日15:50;
        img
  4. clear

    ​ 用于清除屏幕;

Vi的熟悉与使用

vi共分为三种模式:分别是命令模式(Command mode)插入模式(Insert mode)末行模式(Last line mode)

命令模式

用户刚刚启动vi,即可进入命令模式。

此状态下敲击键盘动作会被vi识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

以下是常用的几个命令:

  • i,切换到插入模式,以输入字符;
  • x,删除当前光标所在处的字符;
  • :,切换到末行模式,以在最底一行输入命令

若想要编辑文本:启动vi,进入了命令模式,按下i,切换到插入模式;

命令模式只有一些最基本的命令,因此仍要依靠末行模式输入更多命令;

插入模式

在命令模式下按下i就进入了插入模式。

在插入模式中,可以使用以下按键:

  • 字符按键以及Shift组合,输入字符;
  • ENTER,回车键,换行;BACK SPACE,退格键,删除光标前一个字符;
  • DEL,删除键,删除光标后一个字符;方向键,在文本中移动光标;
  • HOME/END,移动光标到行首/行尾;
  • Page Up/Page Down,上/下翻页;
  • Insert,切换光标为输入/替换模式,光标将变成竖线/下划线;
  • ESC,退出插入模式,切换到命令模式;

末行模式

在命令模式下按下:(英文冒号)进入末行模式。

末行模式可以输入单个或多个字符的命令,可用的命令非常多。

在末行模式中,基本的命令有(已经省略了冒号):

  • q,退出程序;

  • w,保存文件

按ESC键可随时退出末行模式;

实例演示

  1. 使用命令vi mine.txt,新建txt文件,并打开进入命令模式;
    img
    img
  2. 按下i,进入插入模式,开始编辑文字;
    img
  3. 按下esc,回到命令模式,在命令模式中按下:wq,保存并离开,如果只输入:q,是直接离开,不保存;
    img

命令说明

  1. 命令模式可用的光标移动、复制粘贴、搜索替换等按钮

    1. 移动光标的方法

      命令 说明
      h 或 向左箭头键(←) 光标向左移动一个字符
      j 或 向下箭头键(↓) 光标向下移动一个字符
      k 或 向上箭头键(↑) 光标向上移动一个字符
      l 或 向右箭头键(→) 光标向右移动一个字符
      如向下移动 30 行,可以使用 “30j” 或 “30↓” 的组合按键
      [Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
      [Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
      [Ctrl] + [d] 屏幕『向下』移动半页
      [Ctrl] + [u] 屏幕『向上』移动半页
      + 光标移动到非空格符的下一行
      - 光标移动到非空格符的上一行
      n n 表示『数字』,按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
      0 或功能键[Home] 移动到这一行的最前面字符处 (常用)
      $ 或功能键[End] 移动到这一行的最后面字符处(常用)
      H 光标移动到这个屏幕的最上方那一行的第一个字符
      M 光标移动到这个屏幕的中央那一行的第一个字符
      L 光标移动到这个屏幕的最下方那一行的第一个字符
      G 移动到这个档案的最后一行(常用)
      nG 移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
      gg 移动到这个档案的第一行,相当于 1G
      N 光标向下移动 n 行(常用)
    2. 复制、粘贴、删除

      命令 说明
      X,x 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
      nx 连续向后删除 n 个字符
      dd 删除游标所在的那一整行(常用)
      ndd 删除光标所在的向下 n 行
      d1G 删除光标所在到第一行的所有数据
      dG 删除光标所在到最后一行的所有数据
      d$ 删除游标所在处,到该行的最后一个字符
      d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
      yy 复制游标所在的那一行(常用)
      nyy 复制光标所在的向下 n 行
      y1G 复制游标所在行到第一行的所有数据
      yG 复制游标所在行到最后一行的所有数据
      y0 复制光标所在的那个字符到该行行首的所有数据
      Y$ 复制光标所在的那个字符到该行行尾的所有数据
      P,p p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行
      J 将光标所在行与下一行的数据结合成同一行
      c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
      u 复原前一个动作
      [Ctrl]+r 重做上一个动作
      . 重复前一个动作
    3. 搜索、替换

      命令 说明
      /word 向光标之下寻找一个名称为 word 的字符串
      ?word 向光标之上寻找一个字符串名称为 word 的字符串
      n 重复前一个搜寻的动作
      N 『反向』进行前一个搜寻动作
      :n1,n2s/word1/word2/g 在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2
      :1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2
      :1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 ,且在取代前显示提示字符给用户确认 (confirm) 是否需要取代
    4. 命令模式切换到插入模式的可用的按钮

      命令 说明
      I,i 进入插入模式(Insert mode): i 为『从目前光标所在处输入』; I 为『在目前所在行的第一个非空格符处开始输入』
      A,a 进入插入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』; A 为『从光标所在行的最后一个字符处开始输入』
      O,o 进入插入模式(Insert mode): o 为『在目前光标所在的下一行处输入新的一行』; O 为在目前光标所在处的上一行输入新的一行
      R,r 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次; R会一直取代光标所在的文字,直到按下 ESC 为止;
      vi 画面的左下角处会出现『–INSERT–』或『–REPLACE–』的字样,一定要在左下角处看到 INSERT 或 REPLACE 才能输入字符
      [Esc] 退出编辑模式,回到命令模式中
    5. 末行模式切换到指令行模式的可用的按钮

      命令 说明
      :w 保存文件
      :w! 若文件属性为『只读』时,强制写入保存文件
      :q 退出vi
      :q! 强制退出
      :wq 保存并退出
      ZZ 文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开
      :w [filename] 编辑的数据另存为filename
      :r [filename] 编辑的数据中,读入另一个filename
      :n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename
      :! Command 暂时离开 vi 到指令行模式下执行 command 的显示结果
      :set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
      :set nonu 取消行号

安装Linux的编译器GCC

  1. 打开Linux终端,输入命令如下,发现已经安装gcc

    1
    gcc –version

    img

  2. 在终端输入命令如下,卸载gcc

    1
    yum remove gcc --skip -broken

    img

  3. 下载安装gccg++的必要rpm

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    binutils-2.20.51.0.2-5.36.el6.x86_64.rpm
    cloog-ppl-0.15.7-1.2.el6.x86_64.rpm
    cpp-4.4.7-3.el6.x86_64.rpm
    gcc-4.4.7-3.el6.x86_64.rpm
    gcc-c++-4.4.7-3.el6.x86_64.rpm
    glibc-devel-2.12-1.107.el6.x86_64.rpm
    glibc-headers-2.12-1.107.el6.x86_64.rpm
    kernel-headers-2.6.32-358.el6.x86_64.rpm
    libstdc++-devel-4.4.7-3.el6.x86_64.rpm
    mpfr-2.4.1-6.el6.x86_64.rpm
    ppl-0.10.2-11.el6.x86_64.rpm

    img

  4. 在终端输入命令如下,安装上述安装包;

    1
    rpm -ivh (rpm包名称)

    1569573078991

  5. 在终端输入如下命令,查看gcc版本为4.4.7,安装成功

    1
    2
    gcc --version
    g++ --version

    img

熟悉使用GCC编译环境

  1. gcc编译的四个步骤

    1. 预处理

      1
      2
      gcc -o mine.i mine.c -E
      *.c --> *.i

      主要是把头文件展开,完成函数或结构体等的声明;

    2. 编译

      1
      2
      gcc -o mine.s mine.i -S
      *.i --> *.s

      主要是把c源码文件翻译成汇编文件;

    3. 汇编

      1
      2
      gcc -o mine.o mine.s -c
      *.s --> *.o

      主要是把汇编文件翻译成二进制的目标文件;

    4. 链接

      1
      *.o --> *.bin

      把所有的目标文件添加上和系统对接的代码,最后生成可执行程序;

    编译总过程为

    1
    2
    3
    4
    gcc -o ****.i  ****.c -E
    gcc -o ****.s ****.i -S
    gcc -o ****.o ****.s -c
    gcc -o ****.bin ****.o
  2. 新建mine.c文件,编写代码如下

img

img

实验关键里程碑数据与结果

  1. 安装red hat linux分区和选取服务

img

img

  1. 熟悉Linux文件目录的用途

    1569484636627

  2. 熟悉常用命令,mount较难理解

img

  1. GCC使用,了解编译过程如下

    1
    2
    3
    4
    gcc -o mine.i  mine.c -E
    gcc -o mine.s mine.i -S
    gcc -o mine.o mine.s -c
    gcc -o mine.bin mine.o

img

实验难点与收获

难点

  1. 安装磁盘时,分区与挂载过程中操作复杂,理解困难;
  2. usr目录和根目录名称相同的目录代表的意义不相同;
  3. gcc安装与配置需要的rpm包比较多,容易漏装;

收获

  1. 之前VMware安装虚拟机,一直使用简易安装,这次学会了使用自定义安装虚拟机;
  2. 熟悉了linux基本命令,基本学会使用命令行,思维从图形化界面到命令行有了一定的转换;
  3. Linux目录结构有了一定的了解,与windows目录结构有一定的区别;
  4. 基本学会使用vi编辑器;
  5. 了解了linuxGCC编译执行c语言文件的过程;

实验思考

该实验主要目的是熟悉linux虚拟机安装、目录结构、基本命令、GCC使用。实验内容相对基础,但是比较繁琐,尤其是熟悉基本命令,觉得可以适当精简;实验整体思路符合逻辑。