20165230 预备作业3 Linux安装及学习
安装Linux操作系统
通过学习实践基于VirtualBox虚拟机安装Ubuntu图文教程,开始了虚拟机的安装,根据教程按着步骤一步一步的完成。
-
遇到的问题:
1.在安装Ubuntu系统软件的时候,点开官网下载页出现了错误,下载未能成功
2.在选择启动盘的时候没有直接选择压缩包,而是解压后选择的文件,出现了安装错误
-
解决办法:
1.通过求助于同学,得到了Ubuntu系统软件的下载资源,得以成功下载
2.通过重新下载Ubuntu系统软件,并重新选择,最终成功安装。
Linux命令的学习
一.学习别出心裁的Linux命令学习法
了解了Linux也是一种操作系统,以及这个操作系统的架构及学习路径。
在刚开始学习时,对Linux命令,man命令以及cheat命令的理解不深,不明白它们该如何应用于实际以及有何意义,只是跟着文章所给的快捷键和命令进行实践,对三种核心命令有了粗浅的认识。二.在实验楼实践学习Linux 基础入门(新版)课程
第一节 Linux系统简介
Linux操作系统在计算机系统中包括系统调用和内核两层。
了解了Linux的历史以及Windows和Linux的不同点。Windows更贴近我们的日常生活,操作简便、面向应用广泛、兼容性好;而Linux操作系统更注重内在,安全性更高,支持开源。
第二节 基本概念及操作
- Linux本身是没有图形界面的。
- 我们通过shell程序与Linux系统打交道,它在图形界面下为了实现让我们在一个窗口中完成用户输入和显示输出。
- Linux默认提供了6个virtual consoles让用户登录。可以使用
Ctrl+Alt+F1~F6
进行切换,按下Ctrl+Alt+F7
切换回图形界面。 - Shell是可以接受用户输入命令的程序,隐藏了操作系统底层的细节。有 bash、zsh、ksh、csh 等等,Ubuntu 终端默认使用的是bash,默认的桌面环境是 GNOME 或者Unity,实验楼使用的是zsh,xfce。
- 重要快捷键
-
Tab
键可补全命令、补全目录、补全命令参数 -
Ctrl+c
强行终止当前程序 -
Ctrl+d
键盘输入结束或退出终端 -
Ctrl+s
暂停当前程序,暂停后按下任意键恢复运行 -
Ctrl+z
将当前程序放到后台运行,恢复到前台为命令fg -
Ctrl+a
将光标移至输入行头 -
Ctrl+e
将光标移至输入行末 -
Ctrl+k
删除从光标所在位置到行末 -
Alt+Backspace
向前删除一个单词 -
Shift+PgUp
将终端显示向上滚动 -
Shift+PgDn
将终端显示向下滚动 - 方向上键恢复之前输入过的命令
- 通配符用来对字符串实现模糊匹配(比如文件名、参数名)
一次性创建多个文件:
- 可通过man命令来获得某个命令的说明和使用方式的详细介绍。
- man手册内容很多,被分为8个分区
- 一般命令
- 系统调用
- 库函数,涵盖了C标准函数库
- 特殊文件(通常是/dev中的设备)和驱动程序
- 文件格式和约定
- 游戏和屏保
- 杂项
- 系统管理命令和守护进程
一般包括以下部分内容:NAME(名称)、SYNOPSIS(概要)、DESCRIPTION(说明)、EXAMPLES(示例)、SEE ALSO(参见)
- 作业
第三节 用户及文件权限管理
Linux用户管理
查看用户
-
whoami
查看当前登录用户的用户名 -
who -a
打印能打印的全部 -
who -d
打印死掉的进程 -
who -m
同am i,mom likes -
who -q
打印当前登录用户数及用户名 -
who -u
打印当前登录用户登录信息 -
who -r
打印运行等级
创建用户
在 Linux 系统里,新建/添加用户需要 root 权限,要用到sudo
这个命令,有两大前提:一是知道当前登录用户的密码,二是当前用户必须在sudo用户组。
su <user>
可以切换用户,需输入密码(Linux里输入密码是不显示的)
sudo <cmd>
可以以特权级别运行cmd命令,需要当前用户属于sudo组,且需要输入当前用户密码。比如:sudo adduser lilei
创建一个叫lilei的用户。
su - <user>
也是切换用户,同时环境变量也会跟着改变成目标用户的环境变量。比如:su -l lilei
就可以切换到lilei用户登录。
退出当前用户和退出终端一样,可以使用exit
和快捷键ctrl+d
用户组
- 查看自己属于哪些用户组
方法一:使用groups命令
其中冒号之前表示用户,后面表示该用户所属的用户组。这里可以看到 shiyanlou 用户属于 shiyanlou 用户组,每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组。
方法二:查看/etc/group文件
cat命令用于读取指定文件内容并打印到终端输出。| sort
表示将读取的文本进行一个字典排序再输出。最下面可以看到shiyanlou的用户组信息。也可以用以下方式过滤后再输出。
-
将其它用户加入 sudo 用户组
使用
usermod
命令可以为用户添加用户组,使用该命令必须有root权限。
可以直接使用root用户为其它用户添加用户组,或者用其它已经在sudo用户组的用户使用sudo命令获取权限来执行该命令。
删除用户
Linux文件权限
查看文件权限
用ls命令来查看$ ls -l
-
ls
命令的其它用法
ls -A
显示除了 '.'(当前目录),'..' 上一级目录之外的所有包含隐藏文件(Linux 下以 '.' 开头的文件为隐藏文件)
ls -dl
<目录名>查看某一个目录的完整属性,而不是显示目录里面的文件属性
ls -AsSh
显示所有文件大小,并以普通人能看懂的方式呈现,其中小 s 为显示文件大小,大 S 为按文件大小排序
变更文件所有者
- 我遇到的问题:由于前面执行了删除lilei用户的命令,于是重新创建用户,没有将其加入sudo用户组,在变更文件所有者的时候未能成功:
如图 出现了lilei is not in the sudoers file
- 解决办法:重新执行将lilei加入sudu用户组命令
sudo usermod -G sudo lilei
再变更文件所有者
修改文件权限
每个文件的三组权限(拥有者,所属用户组,其他用户,记住这个顺序是一定的)对应一个 " rwx ",也就是一个 “ 7 ”
如果我要将文件“iphone6”的权限改为只有我自己可以用那么执行:
$ chmod 700 iphone6
作业
添加一个用户 loutest,使用 sudo
创建文件 /opt/forloutest
,设置成用户 loutest 可以读写。截图并把操作过程写入实验报告。
第四节 Linux 目录结构及文件基本操作
Linux 目录结构
-
Linux 是以树形目录结构的形式来构建整个系统的,从逻辑上来说 Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。
FHS 标准
- FHS(文件系统层次结构标准)
FHS 定义了两层规范,第一层是,
/
下面的各个目录应该要放什么文件数据,例如 /etc 应该放置设置文件,/bin 与 /sbin 则应该放置可执行文件等等。第二层则是针对
/usr
及/var
这两个目录的子目录来定义。例如 /var/log 放置系统日志文件,/usr/share 放置共享数据等等。
目录路径
路径
使用 cd
命令可以切换目录,在 Linux 里面使用.
表示当前目录,..
表示上一级目录(以.
开头的文件都是隐藏文件,可以使用 ls -a
命令查看隐藏文件),-
表示上一次所在目录,~
通常表示当前用户的 home 目录。使用 pwd
命令可以获取当前所在路径(绝对路径)。
绝对路径
-
以根" / "目录为起点的完整路径,以你所要到的目录为终点
/usr/local/bin
,表示根目录下的usr
目录中的local
目录中的bin
目录。相对路径
相对于你当前的目录的路径,相对路径是以当前目录
.
为起点,以你所要到的目录为终点,表现形式如:usr/local/bin
usr
目录为/
目录下的子目录,可以省略.
;如果是当前目录的上一级目录,则需要使用..
,比如你当前目录为home
目录,根目录就应该表示为../../
,表示上一级目录(home
目录)的上一级目录(/
目录)。-
在进行目录切换的过程中可多使用
Tab
键自动补全,可避免输入错误,连续按两次 Tab 可以显示全部候选结果Linux 文件的基本操作
新建
-
新建空白文件
使用
touch
命令创建空白文件$ touch test
-
新建目录
使用
mkdir
(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性$ mkdir 文件名
创建一个多级目录:使用-p
参数,同时创建父目录, 可同时创建一个多级目录(这在有时候安装软件,配置安装路径时非常有用):$ mkdir -p father/son/grandson
复制
-
复制文件
使用
cp
(copy)命令复制一个文件或目录到指定目录。
$ cp test father/son/grandson
-
复制目录
要成功复制目录需要加上
-r
或者-R
参数,表示递归复制:
$ cp -r father family
删除
-
删除文件
使用
rm
(remove files or directories)命令,删除一个文件或目录:(可以使用-f参数强制删除)$ rm test
$ rm -f test
-
删除目录
跟复制目录一样,要删除一个目录,也需要加上
-r
或-R
参数:$ rm -r family
移动文件与文件重命名
-
移动文件
使用
mv
(move or rename files)命令,移动文件(剪切)。将文件"file1"移动到"Documents"目录mv 源目录文件 目的目录:$ mkdir Documents
$ mv file1 Documents
-
重命名文件
将文件"file1"重命名为"myfile" mv 旧的文件名 新的文件名:
$ mv file1 myfile
-
批量重命名
用
rename
命令
查看文件
-
使用
cat
,tac
和nl
命令查看文件cat
为正序显示,tac
为倒序显示,nl
命令为添加行号并打印。
如我们要查看之前从"/etc"目录下拷贝来的passwd文件:$ cat passwd
可以加上-n
参数显示行号)$ cat -n passwd
- 使用
more
工具打开passwd
文件more
和less
就是天生用来"阅读"一个文件的内容的。$ more passwd
打开后默认只显示一屏内容,终端底部显示当前阅读的进度(百分比)。可以使用Enter键向下滚动一行,使用Space键向下滚动一屏,按下h显示帮助,q退出。 -
使用
head
和tail
命令查看文件head只查看文件的头几行(默认为 10 行,不足 10 行则显示全部)tail只看尾几行。
可更直接的只看一行, 加上-n
参数,后面紧跟行数:$ tail -n 1 /etc/passwd
查看文件类型
-
使用file命令可以查看文件的类型:
$ file 文件名
编辑文件
在Linux 下面编辑文件通常我们会直接使用专门的命令行编辑器比如(emacs,vim,nano)
第五节环境变量与文件查找
环境变量
变量
变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号.
- 创建:使用
declare
命令创建一个变量名为 tmp 的变量:$ declare tmp
- 赋值:使用
=
号赋值运算符,将变量 tmp 赋值为 shiyanlou:$ tmp=shiyanlou
读取变量的值:使用
echo
命令和$
符号($
符号用于表示引用一个变量的值):$ echo $tmp
注意:并不是任何形式的变量名都是可用的,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头。
环境变量
- 环境变量的作用域比自定义变量的要大,如 Shell 的环境变量作用于自身和它的子进程。在默认情况下,当一个进程被创建时,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell中运行的大部分命令都将以 Shell的子进程的方式运行。
- 三种环境变量:
- 当前 Shell 进程私有用户自定义变量,只在当前 Shell 中有效。
- Shell 本身内建的变量。
- 从自定义变量导出的环境变量。
- 三个命令:
- set:显示当前shell所有环境变量
- env:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行
- export:显示从 Shell中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量
- 关于环境变量,可以简单的理解成在当前进程的子进程是否有效,有效则为环境变量。
- 通常习惯将环境变量名设为大写。
-
永久生效
按变量的生存周期来划分,Linux 变量可分为两类:
- 永久的:需要修改配置文件,变量永久生效;
- 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。
如果想要添加一个永久生效的环境变量,只需要打开 /etc/profile,在最后加上你想添加的环境变量
命令的查找路径与顺序
在shell中通过环境变量PATH进行搜索的。当我们在Shell中执行一个命令时,系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找,如果存在同名的命令,则执行先找到的那个。
回到上一级目录,也就是 shiyanlou 家目录,当再想运行那两个程序时,会发现提示命令找不到,除非加上命令的完整路径,但那样很不方便,如何做到想使用系统命令一样执行自己创建的脚本文件或者程序呢?那就要将命令所在路径添加到 PATH 环境变量了
添加自定义路径到“ PATH ”环境变量
PATH 里面的路径是以 : 作为分割符的:
$ PATH=$PATH:/home/shiyanlou/mybin
注意这里一定要使用绝对路径。
在PATH环境里追加路径就可以在任意目录执行那两个命令了注意需要去掉前面的 ./-
每次启动 Shell 时自动执行添加自定义路径到 PATH 的命令。
可以简单地使用下面命令直接添加内容到.zshrc
中:$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中>>
表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的>
是以覆盖的方式重定向到一个文件中,使用的时候一定要注意分辨。在指定文件不存在的情况下都会创建新的文件。修改和删除已有变量
变量修改
变量删除
使用 unset
命令删除一个环境变量:$ unset temp
如何让环境变量立即生效
- 使用
source
命令来让其立即生效,如:$ source .zshrc
-
source
命令还有一个别名就是.
,注意与表示当前路径的那个点区分开,虽然形式不一样,但作用和使用方式一样,上面的命令如果替换成.
的方式就该是:$ . ./.zshrc
注意第一个点后面有一个空格,而且后面的文件必须指定完整的绝对或相对路径名,source
则不需要。搜索文件
-
whereis 简单快速
搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。
-
locate 快而全
通过"/var/lib/mlocate/mlocate.db"数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行
updatedb
命令更新一次,所以有时候刚添加的文件,它可能会找不到。它可以用来查找指定目录下的不同文件类型。如果想只统计数目可以加上-c参数,-i参数可以忽略大小写进行查找,whereis 的-b,-m,-s同样可以是使用。
-
which 小而精
which本身是 Shell 内建的一个命令,我们通常使用which来确定是否安装了某个指定的软件,因为它只从PATH环境变量指定的路径中去搜索命令
-
find 精而细
可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索
如$ find /etc/ -name interfaces
注意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action] 。
数字雨
挑战:寻找文件
目标
- 找到sources.list文件
- 把文件所有者改为自己(shiyanlou)
- 把权限修改为仅仅只有自己可读可写
实验过程中遇到的问题
- 只输入
find
命令,提示权限不够 - 以名字来查找时没有输入全名
- 在访问文件的权限时没有输入路径
解决办法
- 修改输入
sudo find
- 输入命令
-name sources.list
- 应该输入文件所在的全部路径
/etc/apt/sources.list
第六节 文件打包与压缩
概念讲解
实战
zip压缩打包程序
-r
参数表示递归打包包含子目录的全部内容,-q
参数表示为安静模式,即不向屏幕输出信息,-o
,表示输出文件,需在其后紧跟打包输出文件名。后面使用 du
命令查看打包后文件的大小
- 设置压缩级别为 9 和 1(9 最大,1 最小),重新打包:
可见默认压缩级别应该是最高的
注意:这里只能使用绝对路径,否则不起作用
- 创建加密zip包
使用 -e
参数可以创建加密压缩包:
$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou
如果想在 Linux 创建的 zip 压缩文件在 Windows 上解压后没有任何问题,那么还需要对命令做一些修改:
$ zip -r -l -o shiyanlou.zip /home/shiyanlou
需要加上 -l
参数将 LF
转换为 CR+LF
来达到以上目的。
使用 unzip 命令解压缩 zip 文件
- 将 shiyanlou.zip 解压到当前目录:
$ unzip shiyanlou.zip
- 使用安静模式,将文件解压到指定目录:
$ unzip -q shiyanlou.zip -d ziptest
- 不解压只查看压缩包的内容可以使用
-l
参数:$ unzip -l shiyanlou.zip
-
使用
-O
(英文字母,大写 o)参数指定编码类型:unzip -O GBK 中文压缩文件.zip
rar 打包压缩命令
从指定文件或目录创建压缩包或添加文件到压缩包:
$ rm *.rar
$ rar a shiyanlou.rar .
注意:rar 的命令参数没有 -,如果加上会报错。
- 从指定压缩包文件中删除某个文件:
$ rar d shiyanlou.rar .zshrc
- 查看不解压文件:
$ rar l shiyanlou.rar
- 使用 unrar 解压 rar 文件
- 全路径解压:
$ unrar x shiyanlou.rar
- 去掉路径解压:
$ mkdir tmp
$ unrar e shiyanlou.rar tmp/
tar 打包工具
- 创建一个 tar 包:
$ tar -cf shiyanlou.tar ~
-c
表示创建一个 tar 包文件,-f
用于指定创建的文件名,注意文件名必须紧跟在 -f
参数之后,
- 解包一个文件(
-x
参数)到指定路径的已存在目录(-C
参数):$ tar -xf shiyanlou.tar -C tardir
- 只查看不解包文件
-t
参数:$ tar -tf shiyanlou.tar
-
保留文件属性和跟随链接(符号链接或软链接),有时候我们使用tar备份文件当你在其他主机还原时希望保留文件的属性(
-p
参数)和备份链接指向的源文件而不是链接本身(-h
参数):$ tar -cphf etc.tar /etc
-
创建不同的压缩格式的文件,我们只需要在创建 tar 文件的基础上添加
-z
参数,使用gzip来压缩文件。$ tar -czf shiyanlou.tar.gz ~
- 解压.tar.gz文件:
$ tar -xzf shiyanlou.tar.gz
我们要使用其它的压缩工具创建或解压相应文件只需要更改一个参数即可:
压缩文件格式 | 参数 |
---|---|
*.tar.gz | -z |
.tar.xz | -J |
*tar.bz2 | -j |
第七节 文件系统操作与磁盘管理
基本操作
查看磁盘和目录的容量
-
使用df命令查看磁盘容量
$ df
或者$ df -h
-
使用 du 命令查看目录的容量
$ du
或者du -h
-d参数指定查看目录的深度- 只查看1级目录的信息
$ du -h -d 0 ~
- 查看2级
$ du -h -d 1 ~
- 只查看1级目录的信息
- du -h #同--human-readable 以K,M,G为单位,提高信息的可读性。
- du -a #同--all 显示目录中所有文件的大小。
-
du -s #同--summarize 仅显示总计,只列出最后加总的值。
简单的磁盘管理
创建虚拟磁盘
- 使用 dd 命令创建虚拟镜像文件
从/dev/zero设备创建一个容量为 256M 的空文件
$ dd if=/dev/zero of=virtual.img bs=1M count=256
$ du -h virtual.img
-
使用 mkfs 命令格式化磁盘
$ sudo mkfs.ext4 virtual.img
-
使用 mount 命令挂载磁盘到目录树
mount [options] [source] [directory]
常用操作:mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
我遇到的问题
在挂载真正的磁盘到目录树时显示只有root用户才能执行
解决办法
尝试用$ sudo mount -o loop -t ext4 virtual.img /mnt
仍然未能成功,接着往下学习才得知由于实验楼的环境的问题(环境中使用的 Linux 内核在编译时没有添加对 Loop device的支持),所以无法挂载成功
-
使用 umount 命令卸载已挂载磁盘
$ sudo umount /mnt
-
使用 fdisk 为磁盘分区
$ sudo fdisk virtual.img
-
使用 losetup 命令建立镜像与回环设备的关联
第八节 Linux下的帮助命令
内建命令与外部命令
内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,并由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。
外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。
区分内建命令与外部命令
用type
命令
- 得到
xxx is a shell builtin
这样的结果说明是内建命令,内建命令都是在 bash 源码中的 builtins 的.def中 - 得到
xxx is /usr/sbin/xxx
这样的结果说明是外部命令,外部命令在/usr/bin or /usr/sbin等等中 -
若是得到
xxx is an alias for xx --xxx
的结果,说明该指令为命令别名所设定的名称;帮助命令的使用
help 命令
help ls
help 命令只能用于显示内建命令的帮助信息
如要显示外部命令,用ls --help
man命令
man ls
info命令
info ls