基本概念及操作

一些常用快捷键

按键 作用
Ctrl+d 键盘输入结束或退出终端
Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行
Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg
Ctrl+a 将光标移至输入行头,相当于Home键
Ctrl+e 将光标移至输入行末,相当于End键
Ctrl+k 删除从光标所在位置到行末
Alt+Backspace 向前删除一个单词
Shift+PgUp 将终端显示向上滚动
Shift+PgDn 将终端显示向下滚动

Shell常用通配符

字符 含义
* 匹配 0 或多个字符
? 匹配任意一个字符
[list] 匹配 list 中的任意单一字符
[!list] 匹配 除list 中的任意单一字符以外的字符
[c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
{string1,string2,…} 匹配 sring1 或 string2 (或更多)其一字符串
{c2..c2} 匹配 c1-c2 中全部字符 如{1..10}

用户及文件权限管理

查看用户

1
2
3
4
5
$ who am i

或者

$ who mom likes

who 命令其他常用参数

参数 说明
-a 打印能打印的全部
-d 打印死掉的进程
-m 同am i,mom likes
-q 打印当前登录用户数及用户名
-u 打印当前登录用户登录信息
-r 打印运行等级

创建用户

在Linxu系统里,root账户拥护整个系统至高无上的权利,比如 新建/添加用户。

su,su-与sudo

su 可以切换到用户user,执行时需要输入目标用户的密码,sudo 可以以特权级别运行cmd命令,需要当前用户属于sudo组,且需要输入当前用户密码。su - 命令也是切换用户,同时环境变量也会跟着改变成目标用户的环境变量。

新建用户

1
$ sudo adduser lilei

切换登录用户

1
$ su -l lilei

退出当前用户跟退出终端一样可以使用 exit 命令或者使用快捷键 Ctrl+d。

用户组

查看所属用户组

方法一:使用groups命令

1
$ groups lilei

方法二:查看etc/group文件

1
$ cat /etc/group | sort

cat 命令用于读取指定文件的内容并打印到终端输出, | sort 表示将读取的文本进行一个字典排序再输出,然后你将看到如下一堆输出
可以使用命令过滤掉一些你不想看到的结果

1
$ cat /etc/group | grep -E "用户名"

etc/group 文件格式说明

/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:

group_name:password:GID:user_list

你看到上面的 password 字段为一个 ‘x’ 并不是说密码就是它,只是表示密码不可见而已。

将其它用户加入 sudo 用户组

1
2
$ su -l lilei
$ sudo ls

删除用户

1
$ sudo deluser lilei --remove-home

查看文件权限

使用较长格式列出文件:

1
$ ls -l

图解:

可能你还是不太明白,比如第一项文件类型和权限那一堆东西具体指什么,链接又是什么,何为最后修改时间,下面一一道来:

  • 文件类型

关于文件类型,这里有一点你必需时刻牢记Linux 里面一切皆文件,正因为这一点才有了设备文件( /dev 目录下有各种设备文件,大都跟具体的硬件设备相关)这一说,还有 socket(网络套接字,具体是什么,感兴趣的用户可以自己去了解或期待实验楼的后续相关课程),和 pipe (管道,这个东西很重要,我们以后将会讨论到,这里你先知道有它的存在即可)。软链接文件,链接文件是分为两种的,另一种当然是“硬链接”(硬链接不常用,具体内容不作为本课程讨论重点,而软链接等同于 Windows 上的快捷方式,你记住这一点就够了)

  • 文件权限

读权限,表示你可以使用 cat <file name> 之类的命令来读取某个文件的内容;写权限,表示你可以编辑和修改某个文件;
执行权限,通常指可以运行的二进制程序文件或者脚本文件,如同 Windows 上的 ‘exe’ 后缀的文件,不过 Linux 上不是通过文件后缀名来区分文件的类型。你需要注意的一点是,一个目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息

所有者权限,这一点相信你应该明白了,至于所属用户组权限,是指你所在的用户组中的所有其它用户对于该文件的权限,比如,你有一个艾派德,那么这个用户组权限就决定了你的兄弟姐妹有没有权限使用它破坏它和占有它。

  • 链接数

    链接到该文件所在的 inode 结点的文件名数目(关于这个概念涉及到 Linux 文件系统的相关概念知识,不在本课程的讨论范围,感兴趣的用户可以自己去了解)。

  • 文件大小

    以 inode 结点大小为单位来表示的文件大小,你可以给 ls 加上 -lh 参数来更直观的查看文件的大小。

明白了文件权限的一些概念,我们顺带补充一下关于 ls 命令的一些其它常用的用法:

    • 显示除了 ‘.’(当前目录),’..’ 上一级目录之外的所有包含隐藏文件(Linux 下以 ‘.’ 开头的文件为隐藏文件)

    可以同时使用“-A”和“-l”参数:

    1
    $ ls -Al

    查看某一个目录的完整属性,而不是显示目录里面的文件属性

    1
    $ ls -dl <目录名>

    显示所有文件的大小

    1
    $ ls -AsSh

    其中小 s 为显示文件大小,大 S 为按文件大小排序,若需要知道如何按其它方式排序

    修改文件权限

    对文件的权限做修改,这里有两种方式:

    • 方式一:二进制数字表示

    每个文件的三组权限(拥有者,所属用户组,其他用户,记住这个顺序是一定的)就对应这一个 “rwx”,也就是一个 ‘7’ ,所以如果我要将文件“iphone6”的权限改为只有我自己可以用那么就这样:

    为了演示,我先在文件里加点内容:

    1
    $ echo "echo \"hello shiyanlou\"" > iphone6

    然后修改权限:

    1
    $ chmod 700 iphone6
    • 方式二:加减赋值操作
    1
    go-rw iphone

    ‘g’’o’还有’u’,分别表示group,others,user,’+’,’-‘ 就分别表示增加和去掉相应的权限。

    FHS

    FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

    FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动(注意,不是不能,学习过程中,不要怕这些),将目录定义为四种交互作用的形态,如下表所示:


    Linux目录结构及文件基本操作

    目录路径

    路径

    使用 cd 命令可以切换目录,在 Linux 里面使用 . 表示当前目录,.. 表示上一级目录(**注意,还记得我们上一节介绍过的,以 . 开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a 命令查看隐藏文件), - 表示上一次所在目录, 通常表示当前用户的”home”目录。使用 pwd 命令可以获取当前所在路径(绝对路径)。

    进入上一级目录:

    1
    cd ..

    进入你的“home”目录:

    1
    2
    cd ~ 
    或者 cd /home/你的用户名

    使用 pwd 获取当前路径:

    1
    pwd

    绝对路径

    关于绝对路径,简单地说就是以根”/“目录为起点的完整路径,以你所要到的目录为终点,表现形式如:
    /usr/local/bin,表示根目录下的 usr 目录中的 local 目录中的 bin 目录。

    相对路径

    相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 . 为起点,以你所要到的目录为终点,表现形式如:
    usr/local/bin (这里假设你当前目录为根目录)。你可能注意到,我们表示相对路径实际并没有加上表示当前目录的那个 . ,而是直接以目录名开头,因为这个 usr 目录为 / 目录下的子目录,是可以省略这个 . 的(以后会讲到一个类似不能省略的情况);如果是当前目录的上一级目录,则需要使用 .. ,比如你当前目录为“home”目录,根目录就应该表示为 ../../ ,表示上一级目录(”home”目录)的上一级目录(”/“目录)。

    新建

    新建空白文件

    1
    2
    $ cd ~
    $ touch test

    新建目录

    创建名为”mydir”的空目录:

    1
    mkdir mydir

    使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在有时候安装软件,配置安装路径时非常有用):

    1
    $ mkdir -p father/son/grandson

    复制

    复制文件

    1
    $ cp test father/son/grandson

    复制目录

    1
    $ cp -r father family

    加上-r或者-R参数,表示递归复制

    删除

    删除文件

    1
    $ rm test

    -f 参数强制删除

    1
    $ rm -f test

    删除目录

    删除一个目录,也需要加上-r或-R参数

    1
    $ rm -r family

    移动文件与文件重命名

    移动文件

    使用mv(move or rename files)命令,移动文件(剪切)。将文件”file1”移动到”Documents”目录mv 源目录文件 目的目录

    1
    2
    $ mkdir Documents
    $ mv file1 Documents

    重命名文件

    将文件”file1”重命名为”myfile” mv 旧的文件名 新的文件名

    1
    $ mv file1 myfile

    批量重命名

    使用一个看起来更专业的命令rename来实现。不过它是要用 perl 正则表达式来作为参数,

    1
    2
    3
    4
    5
    6
    7
    8
    # 使用通配符批量创建 5 个文件
    $ touch file{1..5}.txt

    # 批量将这 5 个后缀为 .txt 的文本文件重命名为以 .c 为后缀的文件
    $ rename 's/\.txt/\.c/' *.txt

    # 批量将这 5 个文件,文件名改为大写
    $ rename 'y/a-z/A-Z/' *.c

    rename是先使用第二个参数的通配符匹配所有后缀为.txt的文件,然后使用第一个参数提供的正则表达式将匹配的这些文件的.txt后缀替换为.c,

    查看文件

    使用cat,tacnl命令查看文件

    cat为正序显示,tac倒序显示。

    cat 加上-n参数显示行号:

    1
    $ cat -n passwd

    nl 的几个参数:

    1
    2
    3
    4
    5
    6
    7
    8
    -b : 指定添加行号的方式,主要有两种:
    -b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
    -b t:只列出非空行的编号并列出(默认为这种方式)
    -n : 设置行号的样式,主要有三种:
    -n ln:在行号字段最左端显示
    -n rn:在行号字段最右边显示,且不加 0
    -n rz:在行号字段最右边显示,且加 0
    -w : 行号字段占用的位数(默认为 6 位)

    使用moreless命令分页查看文件

    使用more工具打开passwd文件:

    1
    $ more passwd

    可以使用Enter键向下滚动一行,使用Space键向下滚动一屏,按下h显示帮助,q退出。

    使用headtail命令查看文件

    1
    $ tail /etc/passwd

    加上-n参数,后面紧跟行数:

    1
    $ tail -n 1 /etc/passwd

    查看文件类型

    1
    $ file /bin/ls

    环境变量与文件查找

    环境变量

    变量

    1
    2
    3
    $ declare tmp      #使用declare命令创建一个变量名为tmp的变量
    $ tmp=shiyanlou #使用=号赋值运算符为变量 tmp 赋值为 shiyanlou
    $ echo $tmp #读取变量的值,使用echo命令和$符号

    注意:关于变量名,并不是任何形式的变量名都是可用的,变量名只能是英文字母,数字或者下划线,且不能以数字作为开头

    环境变量

    在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell中运行的大部分命令都将以 Shell 的子进程的方式运行。


    环境变量有三种:

    • 当前 Shell 进程私有用户自定义变量,如上面我们创建的 temp 变量,只在当前 Shell 中有效。
    • Shell 本身内建的变量。
    • 从自定义变量导出的环境变量。
    命令 说明
    set 显示当前 Shell 所有环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量
    env 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行
    export 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量


    注意:为了与普通变量区分,通常我们习惯将环境变量名设为大写

    命令的查找路径与顺序

    1
    2
    $ echo $PATH     #查看PATH环境变量的内容
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

    添加自定义路径到”PATH”环境变量

    1
    2
    3
    4
    5
    6
    $ PATH=$PATH:/home/shiyanlou/mybin                     #PATH里面的路径是以:作为分隔符
    .zshrc #zsh的配置文件
    .bashrc #bashrc的配置文件
    $ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc #添加内容到.zshrc
    >> #表示将标准输出以追加的方式重定向到一个文件中
    > #是以覆盖的方式重定向到一个文件

    修改和删除已有变量

    变量修改

    修改方式

    变量设置方式 说明
    ${变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据
    ${变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据
    ${变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最短数据
    ${变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
    ${变量名/旧的字串/新的字串} 将符合旧字串的第一个字串替换为新的字串
    ${变量名//旧的字串/新的字串} 将符合旧字串的全部字串替换为新的字串

    变量删除

    可以使用unset命令删除一个环境变量

    1
    $ unset temp

    环境变量生效

    1
    2
    $ source .zshrc             #使用source命令来让变量立即生效
    $ . ./.zshrc # .的作用和source一样 注意:第一个点后面有一个空格,而且后面的文件必须指定完整的绝对或相对路径名

    搜索文件

    常见的命令:whereiswhich,find,locata

    • whereis

      1
      $whereis who        #直接从数据库中查询,只能搜索二进制文件(-b),man帮助文件(-m)和源代码(-s)。
    • locate

      1
      2
      3
      4
      $ locate /etc/sh    #查找 /etc 下所有以 sh 开头的文件,此方式通过"/var/lib/mlocate/mlocate.db"数据库查找
      $ locate /usr/share/\*.jpg #查找 /usr/share/ 下所有 jpg 文件(添加*号前面的反斜杠转义)
      -c #统计数目
      -i #忽略大小写查找
    • find
      通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索

      1
      $ find /etc/ -name interfaces     #指定目录下搜索指定文件名的文件

    注意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action]

    参数 说明
    -atime 最后访问时间
    -ctime 创建时间
    -mtime 最后修改时间

    -mtime参数举例:

    • -mtime n: n 为数字,表示为在n天之前的”一天之内“修改过的文件
    • -mtime +n: 列出在n天之前(不包含n天本身)被修改过的文件
    • -mtime -n: 列出在n天之内(包含n天本身)被修改过的文件
    • newer file: file为一个已存在的文件,列出比file还要新的文件名

    文件打包与压缩

    文件打包和解压缩

    文件后缀名 说明
    *.zip zip程序打包压缩的文件
    *.rar 创建时间
    *.7z 7zip程序压缩的文件
    *.tar tar程序打包,未压缩的文件
    *.gz gzip程序(GNU zip)压缩的文件
    *.xz xz程序压缩的文件
    *.bz2 bzip2程序压缩的文件
    *.tar.gz tar打包,gzip程序压缩的文件
    *.tar.xz tar打包,xz程序压缩的文件
    *tar.bz2 tar打包,bzip2程序压缩的文件
    *.tar.7z tar打包,7z程序压缩的文件

    zip压解打包程序

    • 使用zip打包文件包
    1
    2
    3
    $ zip -r -q -o shiyanlou.zip /home/shiyanlou    #-r参数表示递归打包包含子目录的全部内容,-q参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名
    $ du -h shiyanlou.zip #du命令查看打包后文件的大小
    $ file shiyanlou.zip
    • 设置压缩级别为9和1(9最大,1最小),重新打包:
    1
    2
    3
    $ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip     #设置压缩级别-[1-9]
    $ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou -x ~/*.zip #1表示最快压缩但体积大,9表示体积最小但耗时最久
    $ du -h -d 0 *.zip ~ | sort #du命令分别查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小
    • 创建加密zip包
    1
    2
    $ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou   #-e参数可以创建加密压缩包
    $ zip -r -l -o shiyanlou.zip /home/shiyanlou #-l参数将LF转换为CR+LF

    在 Windows 为 CR+LF(Carriage-Return+Line-Feed:回车加换行),而在 Linux/Unix 上为 LF(换行),所以如果在不加处理的情况下,在 Linux 上编辑的文本,在 Windows 系统上打开可能看起来是没有换行的。

    使用unzip命令解压缩zip文件

    1
    2
    3
    4
    $ unzip shiyanlou.zip                    #将shiyanlou.zip解压到当前目录
    $ unzip -q shiyanlou.zip -d ziptest #安静模式,将文件解压到指定目录
    $ unzip -l shiyanlou.zip #仅查看压缩包的内容
    unzip -O GBK 中文压缩文件.zip #使用-O 参数指定编码类型

    rar打包压缩命令

    • 安装rar和unrar工具
    1
    2
    $ sudo apt-get update              
    $ sudo apt-get install rar unrar
    • 从指定文件或目录创建压缩包或添加文件到压缩包
    1
    2
    $ rm *.zip               #a参数添加一个目录~到一个归档文件中,如果该文件不存在就会自动创建
    $ rar a shiyanlou.rar

    注意:rar 的命令参数没有-,如果加上会报错

    • 从指定压缩包文件中删除某个文件
    1
    $ rar d shiyanlou.rar .zshrc
    • 查看不解压文件

      1
      $ rar l shiyanlou.rar
    • 使用unrar解压rar文件

      1
      $ unrar x shiyanlou.rar			#全路径解压
    1
    2
    $ mkdir tmp						#去路径解压
    $ unrar e shiyanlou.rar tmp/

    tar打包工具

    • 创建一个tar包
      1
      $ tar -cf shiyanlou.tar ~


    -c表示创建一个 tar 包文件,-f用于指定创建的文件名,注意文件名必须紧跟在-f参数之后,比如不能写成tar -fc shiyanlou.tar,可以写成tar -f shiyanlou.tar -c ~。你还可以加上-v参数以可视的的方式输出打包的文件。上面会自动去掉表示绝对路径的/,你也可以使用-P保留绝对路径符。

    • 解包一个文件(-x参数)到指定路径的已存在目录(-C参数)

      1
      2
      $ mkdir tardir
      $ tar -xf shiyanlou.tar -C tardir
    • 只查看不解包文件-t参数

      1
      $ tar -tf shiyanlou.tar
    • 保留文件属性和跟随链接

      1
      $ tar -cphf etc.tar /etc    #还原时希望保留文件的属性(-p参数)和备份链接指向的源文件而不是链接本身(-h参数)
    • 创建tar文件的基础上添加-z参数,使用gzip来压缩文件

      1
      $ tar -czf shiyanlou.tar.gz ~
    • 解压*.tar.gz文件

      1
      $ tar -xzf shiyanlou.tar.gz
    文件后缀名 说明
    *.tar.gz -z
    *.tar.xz -J
    *.tar.bz2 -j

    文件系统操作与磁盘管理

    简单文件系统操作

    查看磁盘和目录的容量

    使用df命令查看磁盘的容量

    1
    $ df

    “rootfs” : (Root File System)它是 Ramfs(Ramfs 是一个非常简单的 Linux 文件系统用于实现磁盘缓存机制作为动态可调整大小的基于 ram 的文件系统)或者 tmpfs 的一个特殊实例,它作为系统启动时内核载入内存之后,在挂载真正的的磁盘之前的一个临时文件系统。通常的主机会在系统启动后用磁盘上的文件系统替换,只是在一些嵌入式系统中会只存在一个 rootfs ,或者像我们目前遇到的情况运行在虚拟环境中共享主机资源的系统也可能会采用这种方式。

    物理主机上的 /dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示第几块硬盘(也可能是可移动磁盘)

    1
    $ df -h   #查看主机磁盘的使用情况

    使用du命令查看目录的容量

    1
    2
    3
    4
    # 默认同样以 blocks 的大小展示
    $ du
    # 加上`-h`参数,以更易读的方式展示
    $ du -h

    -d参数指定查看目录的深度

    1
    2
    3
    4
    # 只查看1级目录的信息
    $ du -h -d 0 ~
    # 查看2级
    $ du -h -d 1 ~

    简单磁盘管理

    dd命令简介

    dd命令用于转换和复制文件,不过它的复制不同于cp。之前提到过关于 Linux 的很重要的一点,一切即文件,在 Linux 上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero/dev/random)都像普通文件一样,只要在各自的驱动程序中实现了对应的功能,dd 也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在 ASCII 与 EBCDIC 编码间互换。

    dd的命令行语句与其他的 Linux 程序不同,因为它的命令行选项格式为选项=值,而不是更标准的--选项 值-选项=值dd默认从标准输入中读取,并写入到标准输出中,但可以用选项if(input file,输入文件)和of(output file,输出文件)改变。

    我们先来试试用dd命令从标准输入读入用户输入到标准输出或者一个文件:

    1
    2
    3
    4
    # 输出到文件
    $ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1
    # 输出到标准输出
    $ dd if=/dev/stdin of=/dev/stdout bs=10 count=1


    上述命令从标准输入设备读入用户输入(缺省值,所以可省略)然后输出到 test 文件,bs(block size)用于指定块大小(缺省单位为 Byte,也可为其指定如’K’,’M’,’G’等单位),count用于指定块数量。如上图所示,我指定只读取总共 10 个字节的数据,当我输入了“hello shiyanlou”之后加上空格回车总共 16 个字节(一个英文字符占一个字节)内容,显然超过了设定大小。使用和ducat命令看到的写入完成文件实际内容确实只有 10 个字节(那个黑底百分号表示这里没有换行符),而其他的多余输入将被截取并保留在标准输入。 前面说到dd在拷贝的同时还可以实现数据转换,那下面就举一个简单的例子:将输出的英文字符转换为大写再写入文件:

    1
    $ dd if=/dev/stdin of=test bs=10 count=1 conv=ucase

    使用dd命令创建虚拟镜像文件

    /dev/zero设备创建一个容量为 256M 的空文件:

    1
    2
    $ dd if=/dev/zero of=virtual.img bs=1M count=256
    $ du -h virtual.img

    使用mkfs命令格式化磁盘

    1
    $ sudo mkfs.ext4 virtual.img     #虚拟磁盘镜像格式化为ext4文件系统

    使用mount命令挂载磁盘到目录树

    1
    $ sudo mount           #查看主机已挂载的文件系统

    mount命令的一般格式

    1
    mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]

    常用操作

    1
    mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]

    挂载到/mnt目录

    1
    2
    3
    4
    5
    6
    $ mount -o loop -t ext4 virtual.img /mnt 
    # 也可以省略挂载类型,很多时候 mount 会自动识别

    # 以只读方式挂载
    $ mount -o loop --ro virtual.img /mnt
    # 或者mount -o loop,ro virtual.img /mnt

    在类 UNIX 系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。如果挂载目录中本身有文件,这些文件在挂载后将被禁止使用。

    使用umount命令卸载已挂载磁盘

    1
    2
    # 命令格式 sudo umount 已挂载设备名或者挂载点,如:
    $ sudo umount /mnt

    使用fdisk为磁盘分区

    1
    2
    # 查看硬盘分区表信息
    $ sudo fdisk -l

    输出结果中开头显示了主机上的磁盘的一些信息,包括容量扇区数,扇区大小,I/O 大小等信息。

    /dev/sda1,/dev/sda2 为主分区分别安装了 Windows 和 Linux 操作系统,/dev/sda3 为交换分区(可以理解为虚拟内存),/dev/sda4 为扩展分区其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四个逻辑分区,因为主机上有几个分区之间有空隙,没有对齐边界扇区,所以分区之间的不是完全连续的。

    1
    2
    # 进入磁盘分区模式
    $ sudo fdisk virtual.img

    使用lostup命令建立镜像与回环设备的关联

    1
    2
    3
    4
    5
    $ sudo losetup /dev/loop0 virtual.img
    # 如果提示设备忙你也可以使用其它的回环设备,"ls /dev/loop*"参看所有回环设备

    # 解除设备关联
    $ sudo losetup -d /dev/loop0

    然后再使用mkfs格式化各分区(前面我们是格式化整个虚拟磁盘镜像文件或磁盘),不过格式化之前,我们还要为各分区建立虚拟设备的映射,用到kpartx工具,需要先安装:

    1
    2
    3
    4
    5
    $ sudo apt-get install kpartx
    $ sudo kpart kpartx -av /dev/loop0

    # 取消映射
    $ sudo kpart kpartx -dv /dev/loop0
    ![](https://dn-anything-about-doc.qbox.me/linux_base/7-15.png)
    
    接着再是格式化,我们将其全部格式化为 ext4:
    
    1
    2
    3
    $ sudo mkfs.ext4 -q /dev/mapper/loop0p1
    $ sudo mkfs.ext4 -q /dev/mapper/loop0p5
    $ sudo mkfs.ext4 -q /dev/mapper/loop0p6
    格式化完成后在`/media`目录下新建四个空目录用于挂载虚拟磁盘:
    
    1
    $ mkdir -p /media/virtualdisk_{1..3}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 挂载磁盘分区
    $ sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
    $ sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
    $ sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3

    # 卸载磁盘分区
    $ sudo umount /dev/mapper/loop0p1
    $ sudo umount /dev/mapper/loop0p5
    $ sudo umount /dev/mapper/loop0p6
    然后:
    
    1
    $ df -h

    命令执行顺序控制与管道

    命令执行顺序的控制

    顺序执行多条命令

    1
    2
    3
    4
    5
    $ sudo apt-get update
    # 等待——————————然后输入下面的命令
    $ sudo apt-get install some-tool
    # 等待——————————然后输入下面的命令
    $ some-tool
    1
    2
    $ sudo apt-get update;sudo apt-get install some-tool;some-tool
    # 让它自己运行

    管道

    管道是什么,管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。管道又分为匿名管道和具名管道(这里将不会讨论在源程序中使用系统调用创建并使用管道的情况,它与命令行的管道在内核中实际都是采用相同的机制)。我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的内容中我们已经多次使用到了。具名管道简单的说就是有名字的管道,通常只会在源程序中用到具名管道。下面我们就将通过一些常用的可以使用管道的”过滤程序”来帮助你熟练管道的使用。

    1
    $ ls -al /etc | less       #过管道将前一个命令(ls)的输出作为下一个命令(less)的输入

    cut命令,打印每一行的某一个字段

    打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录

    1
    $ cut /etc/passwd -d ':' -f 1,6

    打印/etc/passwd文件中每一行的前N个字符

    1
    2
    3
    4
    5
    6
    7
    8
    # 前五个(包含第五个)
    $ cut /etc/passwd -c -5
    # 前五个之后的(包含第五个)
    $ cut /etc/passwd -c 5-
    # 第五个
    $ cut /etc/passwd -c 5
    # 2到5之间的(包含第五个)
    $ cut /etc/passwd -c 2-5

    grep命令,在文本中或stdin中查找匹配字符串

    grep命令的一般形式为:

    1
    grep [命令选项]... 用于匹配的表达式 [文件]...

    搜索/home/shiyanlou目录下所有包含”shiyanlou”的所有文本文件,并显示出现在文本中的行号

    1
    $ grep -rnI "shiyanlou" ~            #-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件

    1
    2
    # 查看环境变量中以"yanlou"结尾的字符串
    $ export | grep ".*yanlou$" #其中$就表示一行的末尾。

    wc命令

    wc 命令用于统计并输出一个文件中行、单词和字节的数目

    1
    $ wc /etc/passwd

    分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 行数
    $ wc -l /etc/passwd
    # 单词数
    $ wc -w /etc/passwd
    # 字节数
    $ wc -c /etc/passwd
    # 字符数
    $ wc -m /etc/passwd
    # 最长行字节数
    $ wc -L /etc/passwd

    1
    $ ls -dl /etc/*/ | wc -l       #结合管道来操作一下,统计 /etc 下面所有目录数

    sort排序命令

    1
    2
    3
    $ cat /etc/passswd | sort                #默认为字典排序
    $ cat /etc/passwd | sort -r #反转排序
    $ cat /etc/passwd | sort -t':' -k 3 #按特定字段排序

    -t参数用于指定字段的分隔符,这里是以”:”作为分隔符;-k 字段号用于指定对哪一个字段进行排序。这里/etc/passwd文件的第三个字段为数字,默认情况下是一字典序排序的,如果要按照数字排序就要加上-n参数

    uniq去重命令

    • 过滤重复行
    1
    |         |         | uniq
    • 输出重复行
    1
    2
    3
    4
    # 输出重复过的行(重复的只输出一个)及重复次数
    | | | uniq -dc
    # 输出所有重复的行
    | | | uniq -D

    简单的文本处理

    文本处理命令

    tr 命令

    tr 命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。

    选项 说明
    -d 删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配
    -s 去除set1指定的在输入文本中连续并重复的字符
    1
    2
    3
    4
    5
    6
    7
    # 删除 "hello shiyanlou" 中所有的'o','l','h'
    $ echo 'hello shiyanlou' | tr -d 'olh'
    # 将"hello" 中的ll,去重为一个l
    $ echo 'hello' | tr -s 'l'
    # 将输入文本,全部转换为大写或小写输出
    $ cat /etc/passwd | tr '[:lower:]' '[:upper:]'
    # 上面的'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的

    col 命令

    col 命令可以将Tab换成对等数量的空格建,或反转这个操作。

    选项 说明
    -x 将Tab转换为空格
    -h 将空格转换为Tab(默认选项)
    1
    2
    3
    4
    # 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
    $ cat -A /etc/protocols
    # 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了
    $ cat /etc/protocols | col -x | cat -A

    join 命令

    将两个文件中包含相同内容的那一行合并在一起

    选项 说明
    -t 指定分隔符,默认为空格
    -i 忽略大小写的差异
    -1 指明第一个文件要用哪个字段来对比,,默认对比第一个字段
    -2 指明第二个文件要用哪个字段来对比,,默认对比第一个字段
    1
    2
    3
    4
    5
    6
    7
    8
    # 创建两个文件
    $ echo '1 hello' > file1
    $ echo '1 shiyanlou' > file2
    $ join file1 file2
    # 将/etc/passwd与/etc/shadow两个文件合并,指定以':'作为分隔符
    $ sudo join -t':' /etc/passwd /etc/shadow
    # 将/etc/passwd与/etc/group两个文件合并,指定以':'作为分隔符, 分别比对第4和第3个字段
    $ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group

    paste命令

    在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开

    选项 说明
    -d 指定合并的分隔符,默认为Tab
    -s 不合并到一行,每个文件为一行
    1
    2
    3
    4
    5
    $ echo hello > file1
    $ echo shiyanlou > file2
    $ echo www.shiyanlou.com > file3
    $ paste -d ':' file1 file2 file3
    $ paste -s file1 file2 file3

    Linux下软件安装

    linxu上的软件安装

    通常Linux上的软件安装主要有三种方式:

    • 在线安装
    • 从磁盘安装deb软件包
    • 从二进制软件包安装
    • 从源代码编译安装

    在线安装

    1
    $ sudo apt-get install tools

    apt-get包含的常用的一些工具

    工具 说明
    install 其后加上软件包名,用于安装一个软件包
    update 从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表
    upgrade 升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update
    dist-upgrade 解决依赖关系并升级(存在一定危险性)
    remove 移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件
    autoremove 移除之前被其他软件包依赖,但现在不再被使用的软件包
    purge 与remove相同,但会完全移除软件包,包含其配置文件
    clean 移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/
    autoclean 移除已安装的软件的旧版本软件包

    apt-get常用的参数

    参数 说明
    -y 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
    -s 模拟安装
    -q 静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用
    -f 修复损坏的依赖关系
    -d 只下载不安装
    –reinstall 重新安装已经安装但可能存在问题的软件包
    –install-suggests 同时安装APT给出的建议安装的软件包

    安装软件

    1
    $ sudo apt-get --reinstall install  <软件包名>

    软件升级

    1
    2
    3
    4
    5
    6
    # 更新软件源
    $ sudo apt-get update
    # 升级没有依赖问题的软件包
    $ sudo apt-get upgrade
    # 升级并解决依赖关系
    $ sudo apt-get dist-upgrade

    卸载软件

    1
    sudo apt-get remove w3m
    1
    2
    3
    4
    5
    # 不保留配置文件的移除
    $ sudo apt-get purge w3m
    # 或者 sudo apt-get --purge remove
    # 移除不再需要的被依赖的软件包
    $ sudo apt-get autoremove

    软件搜索

    1
    sudo apt-cache search softname1 softname2 softname3……