目录
第1关:Linux 文件目录
任务描述
欢迎进行
Linux
世界,当你下载、安装了某个Linux
发行版,体验了Linux
桌面并安装了一些你喜爱和需要的软件之后,应该去了解下Linux
真正的魅力所在:命令行。 每一个Linux
命令其实就是一个程序,借助这些命令,我们可以办到非常多的事情。 第一个任务就是了解Linux
的目录结构,与基本使用命令
相关知识
为了完成本关任务,你需要掌握:
1.切换目录;
2.查看文件;
3.创建文件。
查看目录
进入目录之后使用
ls
命令查看当前目录下的内容。ls
命令的可用参数:-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等; -a:显示所有文件和文件夹(包括隐藏文件/文件夹)。
文件操作
Linux
系统中最常用的文件操作有创建、删除文件等。创建文件
Linux 中创建文件的常用命令是
touch
,命令格式如下:
touch filename
有时可能需要创建一个空的文件的情况。在这种情况下,可以使用
touch
命令来轻松创建一个空文件。例如:创建一个新的文件
testfile
可以使用如下命令。
touch testfile
如果想同时创建多个文件也可以使用
touch
命令完成,具体格式如下:
touch file1 file2 ...
只需将不同的文件名用空格分隔即可完成创建多个文件。
删除文件
Linux
中常用的删除文件的命令是rm
,使用格式如下:
rm [命令选项] filename
常用命令选项:
-f:强制删除文件或目录; -r或-R:递归处理,将指定目录下的所有文件与子目录一并处理; -i:删除已有文件或目录之前先询问用户。
例如,删除我们刚刚创建的文件
testfile
可以使用如下命令。
rm -f testfile
文件夹操作
Linux
中关于文件夹的操作主要包括创建和删除等。创建文件夹
Linux
中创建文件夹命令是mkdir
,命令格式如下:
mkdir [命令选项] dirname
常用命令选项:
-p或--parents
若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;例如:我们新创建一个文件夹
testdir
可以使用如下命令。
mkdir testdir
因为新创建的文件夹是一个空的文件夹,所以使用
ls -l
显示的结果是空。
删除文件夹
Linux
中删除文件夹的命令是rmdir
或者rm -r
,命令格式如下:
rmdir [命令选项] dirname
常用命令选项:
-p或--parents:删除指定目录后,若该目录的上层目录已变成空目录,则将其一并删除;
例如:将刚刚新创建的文件夹
testdir
删除可以使用如下命令。
rmdir testdir
文件和文件夹拷贝
Linux
使用cp
命令用来将一个或多个源文件或者目录复制到指定的目录中,命令格式如下:
cp [命令选项] 源文件 目的文件
常用命令选项:
例如:新建一个文件-f:强行复制文件或目录,不论目标文件或目录是否已存在; -i:覆盖既有文件之前先询问用户; -p:保留源文件或目录的属性; -R/r:递归处理,将指定目录下的所有文件与子目录一并处理。
newfile
和一个文件夹newdir
,将newfile
复制到newdir
目录下。具体命令如下。touch newfile mkdir newdir cp newfile newdir
文件和文件夹移动/重命名
Linux 使用
mv
命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中,命令格式如下:
mv [命令选项] 源文件 目标文件
常用命令选项:
例如:新建一个文件-f:强行复制文件或目录,不论目标文件或目录是否已存在; -i:覆盖既有文件之前先询问用户; -p:保留源文件或目录的属性; -R/r:递归处理,将指定目录下的所有文件与子目录一并处理'。
newfile
和一个文件夹newdir
,将newfile
剪切到newdir
目录下,并重新命名为newfileCpy
。具体命令如下。
touch newfile mkdir newdir mv newfile newdir/newfileCpy
作答要求
根据相关知识,完成下列任务:
1.在根目录下创建一个文件夹命名为
linux
;2.在根目录下创建一个文件命名为
hello.txt
;3.将文件复制到
linux
文件夹下,并且改名为1.txt
;4.删除根目录下的
hello.txt
。
答案及具体操作:
打开终端
按顺序如下输入
cd.. //返回上一级 cd.. //返回上一级 mkdir linux //创建linux文件夹 touch hello.txt //创建hello.txt文件 cp hello.txt linux/1.txt //赋值hello.txt文件到linux文件夹内,并改名为1.txt rm hello.txt //删除hello.txt文件
第2关:Linux 文件操作命令
任务描述
第二个任务就是了解
Linxu
的文件查看命令,文件编辑基本命令。
相关知识
为了完成本关任务,你需要掌握: 1.文件查看命令。 2.文件编辑基本命令。
文件查看命令
我们要查看一些文本文件的内容时,要使用文本编辑器来查看。在
Linxu
下,可以使用一些命令预览文本文件中的内容,而不必使用文本编辑器打开查看。就好比查看图片一般点击图片就可以查看,不需要下载专门的图片软件。本关卡主要介绍的是常用查看命令,例如:cat、head、tail 与 nl 。
cat 命令
cat
命令用于连接文件并打印到标准输出设备上,有很多叫它“猫咪”命令,但cat
命令其实是 concatenate(连续)的缩写,即连续显示文本内容。cat
命令常常用于查看内容较少的文件,因为文件太大时,前面的内容就滚出屏幕,看不到了。head 命令
head
命令可用于查看文件的开头部分的内容,有一个常用的参数-n
用于显示行数,默认为 10,即显示 10 行的内容。如果查看文件前 5 行,可以使用命令
head -5 山谷的起点.txt
。tail 命令
tail
命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail
会自己主动刷新,确保你看到最新的档案内容。 查看最后文件 5 行命令tail -5 山谷的起点.txt
。nl 命令
nl
命令将指定的文件添加行号标注后写到标准输出。空行不显示行号。文件编辑基本命令
对于文件的编辑操作可以使用
vi/vim
编辑器,vim
是vi
的升级版,二者操作基本上相同。 对于编辑器的基本命令如下:vi filename
:打开文件。 键盘输入i
或者a
进行编辑:最底下出现insert
就进入编辑模式可以进行编辑了。 键盘按Esc
键:退出编辑模式。 键盘输入:q!
:强制退出编辑并不保存。 键盘输入:wq
或者:x
:保存文件并退出。
编程要求
根据提示,在右侧图形化页面打开终端在
/home/headless
文件夹中创建文件test.txt
,在文件中输入Hello,Linux!
。测试说明
平台会对你创建的 test.txt 进行测试: 是否成功创建文件
test.txt
,文件内容是否为Hello,Linux!
。 预期输出:test.txt创建成功!
文件内容正确!
答案及具体操作:
打开终端
按顺序如下输入
pwd //用来查看是否位要求目录 /home/headless //如果显示这一串则代表是所要求目录 touch test.txt //创建一个test.txt文件 ls //查看是否创建成功 vi test.txt 进入test.txt文件中编辑
在出现的页面中按i键进入编辑模式
输入Hello,Linux!
如下:
完成后按Esc键退出编辑模式
按Shift+:键
之后输入wq,按下回车键Enter,保存当前文件并退出
q!不保存当前文件并退出
第3关:Linux 权限管理
任务描述
本关任务:根据所学知识,完成文件权限的修改。
相关知识
为了完成本关任务,你需要掌握:
- 如何创建和删除用户以及用户的权限管理;
- 如何设置文件的访问权限。
Linux
的权限管理主要分为两类:用户和文件。接下来我们会对这两类进行详细介绍。用户管理
从广义上讲,
Linux
系统账户包括用户账号和组账号两类。用户账号又分为普通用户账号和超级用户账号(root)。root 用户在系统内是属于独一无二的超级管理员,(相当于 Windows 中的 System 最高权限)。
而普通用户在相关的操作中需要 ROOT 的许可。而 root 用户可以拥有所有系统权限。用户可以被允许使用 sudo 命令,临时赋予 root 权限。
创建用户
Linux
中使用 useradd 命令来创建一个新用户。命令格式格式:useradd [命令参数] 参数
常见命令参数:
-d<登入目录>:指定用户登入时的启始目录; -D:查看或变更预设值; -g<群组>:指定用户所属的群组; -m:自动建立用户的登入目录; -M:不要自动建立用户的登入目录; -s:指定用户登入后所使用的shell。
useradd
必须以 root 权限才能执行,如果是普通用户想创建一个新用户时,需要在命令前加sudo
命令来提升权限为 root 权限。我们通过下面的几个案例来掌握如何创建用户。
创建一个名为 edu 的用户:
Linux
用户信息是保存在/etc/passwd
文件中,我们可以使用命令tail /etc/passwd
查看/etc/passwd
文件最后几行中是否存在刚刚新创建的edu
用户信息。用户密码管理
我们创建完一个新用户后,往往还需要为该用户设置一个登录密码,我们使用 passwd 命令修改用户密码
命令格式:
passwd 参数 用户名
常见命令参数:
-d 删除密码; -l 停止账号使用; -S 显示密码信息。
passwd
必须以 root 权限才能执行,如果是普通用户想执行passwd
时,需要在命令前加sudo
命令来提升权限为 root 权限。为 edu 用户设置密码:123123
使用
passwd
命令为 edu 用户设置密码时,可以看到需要输入两次密码,目的是为了确保两次输入的密码一致。
Linux
中用户的登录密码是存放在/etc/shadow
文件中,/etc/shadow
文件中存放的是加密过后的密码,所以在/etc/shadow
文件中看到的密码是加密过后的密文。我们同样可以使用
passwd
命令来清除用户的密码。使用
passwd
命令清除用户 test 的登录密码,使用tail -n 1 /etc/shadow
命令查看/etc/shadow
文件的最后一行可以看出 test 用户密码部分为空,此时 test 用户是没有密码的。用户登录
当我们在
Linux
中添加用户后,我们可以使用该用户登录系统。
su
命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号的密码。 当使用su
命令切换用户后,使用exit
命令退出当前身份,返回原有登录用户身份。 注:如果当前用户身份是 root,则使用 su 命令切换到其他用户的时候不需要相应用户的密码。 命令格式:su 参数 用户名
参数为登录的用户名,如果没有参数,则默认切换为 root 用户。 常见命令参数
-c\<指令\> 或 --command=\<指令\>:执行完指定的指令后,即恢复原来的身份; -l 或 --login:改变身份时,也同时变更工作目录,以及 HOME,SHELL,USER,logname。此外,也会变更 PATH 变量; -m,-p 或 --preserve-environment:变更身份时,不要变更环境变量; -s\<shell\> 或 --shell=\<shell\>:指定要执行的 shell。
su
命令所有使用者都可以执行。使用
exit
命令退出当前用户:删除用户
Linux
中使用userdel
命令来删除一个已经存在的用户。命令格式:
userdel 参数 用户名
常见命令参数:
-f:强制删除用户,即使用户当前已登录; -r:删除用户的同时,删除与用户相关的所有文件。
userdel
必须以 root 权限才能执行,如果是普通用户想使用该命令时,需要在命令前加sudo
命令来提升权限为 root 权限。使用
userdel
命令删除一个已经存在的用户 edu,并且自动删除其家目录文件。文件管理
Linux
系统中的每个文件都有访问许可权限,文件的访问权限分为只读,只写和可执行三种。只读权限表示只允许读其内容,而禁止对其做任何的更改操作。
只写权限表示允许修改文件的内容。
可执行权限表示允许将该文件作为一个程序执行。
每一文件的访问权限都有三组,每组用三位表示,分别为文件所属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。
linux
文件有不同的颜色,不同的颜色可以用于区分文件的类型,但是需要为文件配置相应的权限,否则可执行文件会出现无法执行的情况。 蓝色代表目录,绿色代表可执行文件,红色表示压缩文件,浅蓝色表示链接文件,灰色表示其他文件,红色闪烁表示链接的文件有问题了,黄色表示设备文件。当用
ls -l
或ll
命令显示文件的详细信息时,最左边的一列为文件的访问权限。例如显示 test 文件详细信息:修改文件权限
Linux
中使用chmod
命令来修改文件权限。文字设定法具体命令如下:
chmod [who] [ + 或 - 或 = ] [mode] 文件名
who 参数如下:
u 表示“用户(user)”,即文件或目录的所有者; g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户; o 表示“其他(others)用户”; a 表示“所有(all)用户”,它是系统默认值。
操作符如下:
+:添加某个权限; -:取消某个权限; =:赋予给定权限并取消其他所有权限。
mode 参数如下:
r 可读; w 可写; x 可执行。
数字设定法具体命令如下:
chmod [mode] 文件名
mode 为具体的数字。
首先了解用数字表示的属性的含义:0 表示没有权限,1 表示可执行权限,2 表示可写权限,4 表示可读权限,然后将其相加。所以数字属性的格式应为 3 个从 0 到 7 的八进制数,其顺序是 u、g 和 o。
我们通过几个案例来为大家详细展示该命令的使用:
- 创建一个名为 testFile 的文件,将该文件的所有用户权限设置为仅读权限,可以使用如下命令:
- 将文件 testFile 的所有用户权限设置为可读可写,同组用户权限设置为只读,可以使用如下命令:
- 将文件 testFile 的权限设置为所有用户可读可写可执行,同组用户设置为可读可执行,其他用户设置为可读,可以使用如下命令:
以上的权限我们是针对所有用户的,我们也可以针对用户、同组用户、其他用户,只用将上面命令的 a 替换成相应的参数即可。
到了这里,针对文件的权限就讲解完成了,
Linux
奉行一切皆文件,所以目录的权限修改也是如此。
编程要求
打开右侧图形化界面的命令行,在命令行中完成如下功能:
在 /root 目录下创建 oldFile1、oldFile2、oldFile3、oldFile4 四个文件;
给 oldFile1 增加所有者可执行权限;
将 oldFile2 的同组用户权限删除可读权限;
为系统已存在文件 oldFile3 的其他组用户权限添加可执行权限;
将系统已存在文件 oldFile4 的权限设置所有者权限为可读,同组用户权限为可写,其他用户权限为可执行。
答案及具体操作:
按顺序如下输入
cd /root //进入/root目录 //创建oldFile1、oldFile2、oldFile3、oldFile4 四个文件 touch oldFile1 touch oldFile2 touch oldFile3 touch oldFile4 chmod u+x oldFile1 //给 oldFile1 增加所有者可执行权限 chmod g-r oldFile2 //将 oldFile2 的同组用户权限删除可读权限; chmod o+x oldFile3 //为系统已存在文件 oldFile3 的其他组用户权限添加可执行权限 //将系统已存在文件 oldFile4 的权限设置所有者权限为可读,同组用户权限为可写,其他用户权限为可执行 chmod u=r oldFile4 chmod g=w oldFile4 chmod o=x oldFile4
第4关:实验环境练习
任务描述
本关任务:修改 Linux 0.11 内核程序,将系统启动时显示的字符串由原来的
Partition table ok.
变为Hello, world!
。 通过本关任务,可以熟悉 Linux 0.11 内核实验环境,掌握内核程序的编辑、编译和测试方法。
相关知识
为了完成本关任务,你需要: 1.了解实验环境; 2.测试内核是否正常; 3.查看内核源码; 4.修改内核源码; 5.重新编译内核; 6.测试新内核是否正常。
1.了解实验环境
本课程将会在 Ubuntu 16.04 下进行学习,Ubuntu 属于
Linux
衍生出来的以桌面应用为主的Linux
操作系统,Linux
操作系统的使用与Windows
基本上不同,所以最初会觉得无法理解,但是本质上还是差不多的。本实验将使用 Bochs 模拟硬件环境,在完成对代码的修改或编译之后将使用
run
去启动新的虚拟机,环境都是准备好,可以直接使用的,只需要使用脚本去启动就行了。 本实验中已经给出了完整的linux 0.11
内核文件放在/root/os/linux-0.11-lab/0/linux
中,可以直接使用。本课程的实验在目录
~/os/linux-0.11-lab
下进行,此目录下的内容如下:其中各目录和文件的含义是:
- 脚本文件
run*
:以不同模式运行虚拟机,脚本 run 采用正常模式,脚本 rundbg 采用 bochs 调试模式(汇编级),脚本 rungdb 采用 gdb 调试模式( C 语句级),这三个模式都用于内核测试。 用于启动虚拟机的内核映像文件是cur/linux/
目录下的Image
; 虚拟机的根文件系统是images
文件夹下的rootimage-0.11
;
- 目录
0
:存放有 Linux 0.11 内核的源代码及其 Source-Insight 工程文件,本实训中使用 VSCode 代替 Source-Insight ,不需要使用到 Source-Insight ,只需要使用到linux
文件夹中的源码;
- 目录
conf
:存放有虚拟机的配置文件,这些配置文件描述了虚拟机的硬盘、软盘、内存大小等参数;
- 目录
images
:包含虚拟机的硬盘(根文件系统)和软盘的映像文件;其中映像文件
hdimage-devel
用作应用开发模式的硬盘,里面包含应用程序编译所需的 gcc 等软件。脚本run
、rundbg
和rungdb
用软盘作为启动盘,对应的软盘映像文件是cur/linux/Image
。
cur
是一个符号链接,指向当前分析的内核目录,现在指向目录0
,可以当作是一个快捷方式。2.测试内核是否正常
运行
run
脚本就会使用在~/os/linux-0.11-lab
目录下的内核映像cur/linux/Image
启动 Linux 0.11 。虽然这个虚拟机的硬盘容量只有 1 MB ,但它目前可以满足内核分析的需要。
3.查看内核源程序
关闭虚拟机,然后使用 VSCode 打开源码所在文件夹,选择 File ,然后选择 Open Folder ;
找到
linux
文件夹,然后确认打开;可以看到文件夹下所有的源码都已经被导入了,可以在这里开始对源码进行修改了。
4.修改内核源码
在源码中可以修改很多东西,例如修改开机画面中的字符串
Loading system ...
,将其修改为Loading linux 0.11
,这里需要注意一点,不能太长而影响生成的目标文件的大小。使用搜索功能,搜索关键词
Loading
,在结果中找到Loading system ...
,将其修改为Loading linux 0.11
。 如果知道文件的具体位置,也可以在命令行中使用vim
对配置文件进行修改,只需要找到文件中对应的地方进行修改,和在 VSCod 里面修改结果都是一样的。修改完毕之后点击 File 然后选择 Save All ,保存所有修改即可。
5.重新编译内核
在内核源码目录
~/os/linux-0.11-lab/0/linux
中使用make
命令重新编译内核;下图是编译输出的结果,可以看到被修改的文件
bootsect.s
已经重新编译成功,这是只编译修改过的文件,有时为了可靠也可以完全编译;完全编译需要将旧的编译文件清除,使用
make clean
命令清除编译文件,然后重新使用make
命令编译,只不过完全编译的时间相对较长;上图是编译之后的结果,Image 即为生成的完整内核映像,包含引导代码;tools 目录下有内核的主体可执行文件 system ,其符号文件是 System.map ,包含变量和函数的地址,其链接时的详细布局信息在文件 System.map.2 中。
6.测试新内核是否正常
切换到
linux-0.11-lab
目录下使用./run
启动脚本使用新的内核运行虚拟机;可以看到虚拟机的加载的字符串已经从原来的
Loading system ...
,变为Loading linux 0.11
了。
编程要求
根据相关知识,将系统启动时显示的字符串由原来的
Partition table ok.
变为Hello, world!
。注:
1.字母区分大小写,符号使用英文输入法输入,请注意作答的时候注意不要写错了。
2.评测之前请关闭已经启动的虚拟机之后才可以点击评测!!!
答案及具体操作:
按如下操作顺序
cd ~/os/linux-0.11-lab //进入此目录 ./run //运行虚拟机查看当前显示结果
显示结果如下
打开桌面VSCode左上角File中选择Open Folder
如下进入文件夹先进入os文件夹
再进入linux-0.11-lab文件夹
再进入0文件夹
最后单击linux文件夹后点击右下角ok
在搜索里输入ok.,按下回车进行搜索并更改内容为
Hello, world!
注意必须要一模一样
保存
终端中继续按顺序输入cd 0 //进入0文件夹 cd linux //进入linux文件夹 make //重新编译 cd .. //返回上一级 cd .. //返回上一级 ./run //运行
结果如下显示更改成功