Red Hat Linux 的安装和使用
实验目的
本次实验主要熟悉了 Linux 的一个发行版 ——Red Hat Linux
的安装及使用。在安装过程中,我也查阅了一些资料,了解到了这个系统的一些细节和常用操作。为之后的进程管理等实验创建好实验环境和平台。
本次还进行了 gcc 编译器的安装,安装编译器的过程中,我了解了 Red Hat Linux
下软件安装的一般方法 ——rpm
,也了解到一些库的安装可能依赖于另外的一些库,从而需要提前安装上其他库。了解 gcc
编译器,作为编译.c
文件的一个工具,在今后在 Linux 系统下的 C 程序编程中会起到至关重要的作用。
步骤
安装 Red Hat Linux
本次实验用到的 rhel 版本
为锻炼好日后独立装载操作系统的能力,本次安装使用基于 VMware 虚拟机的手动安装方法,在网络上下载好 rhel7.2 版本的光盘镜像,然后使用光盘加载到虚拟机中,修改 BIOS 为光盘启动优先,以开启手动安装。
配置过程不再详述。此过程其他截图至实验报告 3.1 节中查看。 安装结束后,重启进入系统。
Linux 文件系统
Linux 目录结构
进入系统后,我们可以看到根目录中都有一些什么文件夹。点击桌面的家目录,然后单击左侧的 “计算机”,或者借用命令 ls /
就可以看到。其中有 /bin
,/boot
,/dev
,/etc
,/home
,/lib
,/lib64
,/media
,/mnt
,/opt
,/proc
,/root
,/run
,/sbin
,/srv
,/sys
,/tmp
,/usr
,/var
这么多目录,它们的作用简单介绍如下:
存放二进制可执行文件,Linux 系统的常用命令(ls
、mkdir
、cp
等)就在其中。
存放用于 Linux 系统引导时使用的各种文件。
存放设备文件,在 Linux 下,“万物皆文件”,所有的外部设备对应了 dev
下的一个文件,例如 dev/sdax
对应了系统下的第一块硬盘的第 x 个分区。
存放系统管理与配置文件。
存放用于 Linux 系统引导时使用的各种文件。
所有非 root 用户文件的根目录,用户 “家目录” 为 /home/<用户名>
,可以用 ~
表示。
存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似 windows 里的.dll
文件,存放了根文件系统程序运行所需的共享文件。
RedHat 中 /lib
里面是 32 位的库,/lib64
里面是 64 位的库。
是挂载多媒体设备的目录,如默认情况下的光盘、优盘、硬盘等设备都挂载在此目录。
一般挂载镜像和硬盘一类的目录。
额外安装的可选应用程序包所放置的位置。
虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
系统超级管理员的用户主目录。
内有很多 pid 文件,表示当前系统运行中的进程。pid 文件中存储了进程号,可以用于 kill
等操作。
superuser binary,存放系统管理员所使用的管理程序。
主要用来存储本机或本服务器提供的服务或数据。
包括系统所有的硬件信息以及内核模块等信息。
系统产生临时文件的存放目录。
usr 是 Unix Software Resource 的缩写, 也就是 Unix 操作系统。软件资源所放置的目录,而不是用户的数据;所有系统默认的软件都会放置到 /usr
。
/var
包含系统一般运行时要改变的数据。通常这些数据所在的目录的大小是要经常变化或扩充的。原来 /var
目录中有些内容是在 /usr
中的,但为了保持 /usr 目录的相对稳定,就把那些需要经常改变的目录放到 /var
中了。
Linux 目录功能
提前在 mnt
目录下创建好了 usb
文件夹。
向虚拟机插入 U 盘后,fdisk -l
有了一些额外的输出,是这样的
其中,dev/sdb
应该就是插入的 U 盘。
实际上,此时操作系统中已经可以看到这个 U 盘了。
再运行 mount
命令已经没有作用了
可以看到,它实际上已经挂载到了 /run/media/root/设备号
文件夹下。桌面上已经有了盘符显示。
再运行 unmount
命令卸载 U 盘,桌面移动盘图标会消失。
Linux 系统基本命令行操作
格式:shutdown [option] time [warning]
1 | shutdown now |
除了 shutdown
以外,halt
、poweroff
、init 0
也可以关机。
1 | shutdown -r now |
init 6
也可以重启。
1 | shutdown [offset] [message] |
注意提示为 The system is going down for power-off…
1 | shutdown -c |
注意提示 The system shutdown
has been cancelled …
1 | shutdown -r [time] [isBackground] |
&
表示将当前命令放在后台运行,命令行中可能还要做一些工作。(防止终端被卡住)-r
表示 reboot,重启系统。
注意提示是 The system is going down for reboot …
此时如果打开其他终端,重启警告信息会一分钟发送一次。
-k <int>
表示警告信息提示次数,提示完毕后,系统将关机。警告信息提示频率默认为 1 分钟 1 次。
格式:ls [option] [path]
ls 命令一般用于列出 Linux 中文件夹下的文件列表。
在任何参数都不加的情况下,输出当前目录的非隐藏文件列表。
-l
参数使得输出结果以列表形式展示。最上端的 “总用量” 代表当前目录下所有文件所占用的空间总和,下方输出,从左到右分别代表文件属性(文件类型 + 权限属性)、硬链接数(指向该文件的链接数)、文件(目录)拥有者、文件(目录)拥有者所在的用户组、文件所占用的空间(以字节为单位)、文件(目录)最近访问(修改)时间、文件名(如果是一个符号链接,那么会有一个 “→” 箭头符号,后面跟一个它指向的文件名)。
-d
参数代表只显示目录。
-a
表示显示隐藏文件,在 Linux 系统下,认为以英文句点 (.) 开头的文件名为隐藏文件。
..
和.
是特殊的隐藏文件,分别代表上级目录和本级目录。-s
代表显示各个文件的大小,后面的-S
代表以文件大小对输出结果排序。- Linux 系统下,认为每一个目录 “大小” 为 4kb。
格式:[cp/mv] [option] [pathfrom] [pathto]
cp 命令一般用于复制文件或目录。mv 命令一般用于剪切文件或目录,也可以用于重命名。
在实验准备之前,先在 data 目录下写一个 1.txt 文件,内容为 "welcome to linux!"。
把它复制到同一个目录下
把它移动到文件夹 a 下面
要把上一步的文件复制到另一个文件夹下
-i 表示交互提示 (interactive),在覆盖文件前会弹出提示。
现在我们看到直接复制文件夹是不行的。
此时需要 - r 参数,表示递归复制文件夹下的所有内容 (recursive)。
格式:rm [option] [dirname|filename]
rm
命令一般用于删除文件或目录。
实验环境在 /root/data
文件夹下,文件列表如第一条命令执行结果所示。
可以看到,直接 rm
目录名是无法删掉目录的(加上 -d
选项也只能移除空的目录),而 rm
文件名是可以删除文件的(权限足够的情况下)。
删除目录要用 -r
选项,实际上,它递归移除了其中的所有文件 (recursive)。从上图中也可以看到,目录名、文件名都支持通配符。
-f
表示强制删除 (force),没有任何提示。删除文件夹时一般与 -r
参数配合,以省掉频繁的确认过程。
格式:mkdir [option] [dirname]
mkdir
命令一般用于创建目录。
在进行下一步操作前,data
文件夹为空
在当前目录下直接创建 a、b、c 文件夹
试图用同样方法在 a
文件夹下建立 test/t
1 两级目录。嗯?不行?创建多级目录时,最好使用 -p
选项,建立必要的父文件夹结构。下右图为创建效果
-m
指定了当前文件夹的权限属性。这回就涉及到了 ls -l
命令输出的左侧的第一个字段了。实际上,r:read
就是读权限,用数字 4 表示,w:write
就是写权限,用数字 2 表示,x:excute
就是执行权限,用数字 1 表示。第一组 rwx
表示文件拥有者权限,第二组 rwx
表示与拥有者同用户组的权限,最后一组表示其他用户权限。
例如,用于 ssh 登录的 authorized_keys
文件的权限值为 600,只允许当前用户的写和读权限,其他用户没有任何权限,这样做是出于安全的考虑。
格式:rmdir [option] [dirname]
rmdir
命令一般用于删除空目录。和 rm -d
的作用效果一致
格式:cd [option] dirname
cd
用于改变当前工作路径,影响后续命令的执行路径 (change directory)。
pwd [option]
pwd
用于打印出当前工作路径 (print working directory)
格式:cat [option] file ...
cat
命令一般用于拼接 (concatenate) 文件或标准输入,并在标准输出中输出结果。
格式:find [dir]... [option]
find
命令一般用于查找文件。一般有 -name
和 -type
两种选项
-print
用于打印出所有查找结果。
-user
用于指定查找的用户范围。
-exec <command> {} \;
用于将查找到的文件执行 command 命令,比如以下截图命令为删除空文件(大小为 0 的文件)。
注意:大括号和反斜杠之间有一个空格
格式:grep [option] [pattern] [file]
grep
命令用于从文件中查找给定格式的字符串并打印出来。
从下图的演示结果来看,-i
选项为忽略大小写的查找(用例文本没写出这一点来),-n
开启了行号显示。对于查找大文件的相关字符串有一定帮助。
格式:more [option] file [...]
用于分页显示大文件。类似于 cat
。
在分页显示模式中,按 Space 可以前进一页,Backspace 可以后退一页,q 键退出此模式。模式截图如下。
more
还可以和其他命令配合使用,比如要列出一个目录下的文件,由于内容太多,我们应该用 more
来分页显示
1 | ls -l /usr/lib | more |
-c
创建新的压缩文件-v
显示详细的处理信息-f
要操作的文件名,这里是所有 txt 文件- 会打包成
tar
格式
怎么生成文件大小反而更大了?
还得调用 -z
参数!(实际调用了 gzip 程序进行压缩)生成的.tar.gz
文件体积果然减小了。
-x
选项用于解压 (extract) 文件tar
文件至少要用-xf
选项,tar.gz
文件至少要用-zxf
选项。
gzip
命令主要用于 gz
格式的压缩。
--best
指以最高压缩比进行压缩(也可以用 -9
来指定),同时,有以最快速度进行压缩的选项,为 --fast
或 -1
。
-l
查看当前所有 gz
压缩文件的信息(包括压缩前后大小,压缩比,原文件名)
-d
选项可以解压 gz
格式的压缩文件。在这里可以验证原来文本文件的大小。
unzip
主要用于 zip
格式压缩文件的解压。
-d
选项可以指定解压至哪一个文件夹。而 unzip
的默认处理方式为 -j
,即直接解压至压缩包同级目录下。注意到 inflating
的输出有所不同。
格式:chmod [who] [操作符] [mode] 文件名
chmod
用于修改文件的权限标志位。
who 选项中,g 指同组用户 (group),o 指其他用户 (others),u 指当前用户 (user),a 指所有人 (all=g+o+u)。
操作符 +/-/= 分别代表增加权限、减少权限、设定权限为,mode 为 rwx 三种,分别对应读取,写入,执行权限。
新创建的文件一般没有执行权限,需要 chmod +x
来添加权限,然后在可执行文件所在文件夹下运行。这一点似乎 root 用户也不例外。
登录另一个用户尝试读、写、执行,发现均显示 “权限不够”,证明文件权限被正确设置为 600
,即其他用户没有任何权限。
同理,也可以使用八进制掩码来设置文件权限,其中 r 的权值为 4,w 的权值为 2,x 的权值为 1,分别对应了读、写、执行权限。
格式:chgrp [username] [file]
chgrp
用于更改文件所属的用户组。
执行后发现 ls -l
的第四列结果(文件所属用户组)发生变化。
格式:chown [options] user[:group] file...
chown
用于更改文件属主(和用户组)。
格式:passwd <用户名>
passwd
命令用于更改一个用户的 unix 密码,在更改的过程中,发现它有一定的强度要求。而且输入的密码不会在屏幕上回显。
使用 passwd -S <用户名>
可以打印出目标用户的密码情况。嗯,SHA512 算法还是相对来说比较安全的……
su <用户名>
可以不注销当前登录态的情况下切换用户,视密码是否为空而提示输入相应用户密码。(当时 root 有密码,testusr 没有密码)
write 命令用于传讯息给其他使用者。在执行 write 用户名 后,把要传输的信息打过去,按 ctrl+c 结束,传输的信息就会显示在那个用户名的终端里。 在这里,我使用了本地的另一台虚拟机 Kali Linux,以 ssh 方式访问 rhel 机器,来模拟多用户访问的情况。以下为测试效果。
使用 mesg n
可以关闭终端机的写入权限(实际上上图的情况是表明输出权限也一并被关闭)。mesg y
可以重新打开。
free
命令用于查看系统中已用空间和可用空间。表头从左到右的含义为总空间,已用空间,空余空间,共享空间,缓存空间,可用空间。第一行为存储区,第二行为交换区。
-b | -k | -m
表示以字节,千字节,兆字节的方式来显示数据,可读性更强,不过要使可读性最强,可以使用 -h
选项。
df
命令用于显示目前在 Linux 系统上的文件系统的磁盘使用情况统计。
-a
选项包含所有的具有 0 Blocks 的文件系统,-T
选项显示文件系统的形式。
-t
代表限制列出文件系统的类型,由于当前系统没有 ext3
格式的类型,所以会显示 “未处理文件系统”。
-h
使其中输出的值(指容量相关值)更加具有可读性。
du
命令用于显示目录或文件的大小。默认统计当前文件夹大小。
du –a /
的结果,输出很长,只截取了后面的部分,最底部的 “3283432” 为总用量,-a
选项则列出了所有文件及目录的大小
-s
选项仅显示总计容量大小,配合 -h
选项可以快速统计某目录的所占空间大小。
dd
命令用于以指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。经常用于备份设备数据。
由于设备短缺,测试只好使用从文件复制到本地硬盘中。可以看到一些输出。
直接运行 dd
命令是从标准输入传送到标准输出。
fdformat
主要用于低阶格式化软盘,对设备要求较高,由于手边设备有限,并不能得出结果。
at
命令:用于安排临时任务(与周期性任务 crontab
有所不同)
输入 at <time>
后,进入 at 命令模式,以 ctrl+D 结束任务输入。
atq
可以用于查看当前任务列表,atrm <id>
可以删除临时任务
比如,上图描述了在 14:45 分时,列出用户家目录的文件列表,并把它放入 1.txt
文件中。执行效果如下
命令执行通常会阻塞住当前的终端,如果命令执行时间很长,而碰巧又想执行别的命令,就会相当麻烦,&
可以是当前命令转入后台运行,即使关闭当前终端也不会中断其运行。可以使用 bg
查看后台任务,fg
将后台任务转回终端查看。
这里,my_ls
添加了 sleep
语句,方便查看后台运行效果
who
命令显示关于当前在本地系统上的所有用户的信息。显示以下内容:登录名、tty、登录日期和时间,如果用户是从一个远程机器登录的,那么该机器的主机名也会被显示出来。
w
命令显示目前登入系统的用户信息。执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序。(testusr
没登录,所以这里没有他的信息)
ps
命令列出系统中当前运行的那些进程,是当前那些进程的快照。
STAT 字母表示:
- R 运行 runnable (on run queue)
- S 中断 sleeping
- D 不可中断 uninterruptible sleep (usually IO)
- T 停止 traced or stopped
- Z 僵死 a defunct (‘zombie’) process
-u
选择用户名。
-l
长格式。多了 F,wchan,C 等字段。
-a
显示一个终端的所有进程,除了会话引线。
-x
显示没有控制终端的进程,同时显示各个命令的具体路径。最常见的组合为 -aux
,通常配合管道 grep
来找到要停止的进程。
kill [sig] <pid>
杀死进程,强杀进程一般使用信号 -9(SIGKILL)
,因为其他信号都可以被忽略
在终端中回显输出用户的字符串。
显示日历。
输出日期和时间。
清空当前终端中的内容(实际上表现为滚动条向下滚动)。
Vi 的基本使用
Linux 系统中一般会内置 vi 作为文本编辑器,用命令
vi xxx
启用后,有三种模式:命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。刚刚进入 vi 时,是命令模式,任何输入字符不会加入文件中,而是被解析为命令运行,想要进入输入模式,需要按键盘 i 键。输入完成后,可按 ESC 键退回命令模式。要退出程序,需要按: 键,切换到底线命令模式中,然后输入 q 不保存退出或输入 w 保存退出。底线命令模式中支持的命令比命令模式要多。
下面是一些命令的运行效果截图。
Linux 系统中的 gcc 编译器
GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C 语言。GCC 很快地扩展,变得可处理 C++。后来又扩展为能够支持更多编程语言,如 Fortran、Pascal、Objective-C、Java、Ada、Go 以及各类处理器架构上的汇编语言等,所以改名 GNU 编译器套件(GNU Compiler Collection)。
安装 Linux 系统时本应选择预装 gcc 套件的,但当时并没有考虑到这个需求。还好 Red Hat 的镜像中有 gcc 的软件包,仍旧可以安装。安装过程不再详述。
用 vi 编写一个简单的 c 程序,保存为 hello.c
。
1 | /*--hello.c--*/ |
使用 gcc
命令编译该源代码。-o
参数指定生成目标文件,它可以直接执行(有 x 权限)。
1 | gcc hello.c -o hello |
1 | ./hello |
实验关键里程碑数据与结果
安装 Red Hat Linux
安装 gcc 编译器
实验难点与收获
完成本实验花费了个人约 8 个小时的时间,其中有 6 个小时的 “上机” 时间(在系统),剩余时间用于实验报告的写作上。感觉这次的实验还是很简单的,基本上没有难点,除了最后在配置 gcc 软件包时,需要先安装大量依赖软件包,占用了一些时间。
实验思考
-
通过本实验,我感受到了 Linux 系统相对于 Windows 的强安全性。
- 首先,Linux 系统在终端中输入任何密码时,都不会有回显,在设置用户密码时,要求它有一定的强度(≥8 个字符,且还要通过字典检查)
- 除了 root 用户,所有其他用户的根目录均局限于
home
目录下,由于权限码的限制,一旦离开了home
目录,便很难再拥有权限操作文件,因为往往系统文件的权限值对于其他用户均设置为很低的值,而且 Red Hat Linux 对于创建的新用户,默认是连 sudo 权限都没有的(下图,还带着提示),这意味着他们几乎不可能进入系统空间和其他用户的空间,也更不可能列出文件目录或者是执行文件。
-
Linux 系统的命令是相对于 Windows 系统来说最大的不同点,用惯了图形化界面操作系统的人,总归对冷冰冰的命令行页面下不去手。这次的安装虽然装的是带有 GUI 界面的服务器版本(下图),但主要的操作还是放到了命令行中,因为可以很直观的看到输出。
-
上手使用了一些 Linux 中的命令后,感觉还是比较好掌握的,因为它们基本上是一些英文单词的缩写。命令格式也非常好理解,一个短横线往往跟短选项,而两个短横线往往跟长选项。有些短选项是可以合并的(比如
ls -la
等价于ls -l -a
)。