定制提示符、包管理以及存储介质
定制提示符
和 Linux 中的很多提示符一样,shell 提示符的可配置性很高。尽管大多数用户并不重视提示符,但是,一旦我们学会了怎样控制它,它就会成为一种相当有用的设备
提示符的分解
系统默认提示符看起来如下所示
[me@linuxbox ~]$
提示符是由名为 PS1(prompt string 1 的缩写,即提示符字符串 1)
的环境变量定义的, echo
命令可以帮助用户看到 PS1
的值
echo $PS1
=> [\u@\h \W]\$
可以看出,PS1 包含了一些提示符中出现的符号,它会与下表中的由反斜杠转义的特殊字符有关
\a
:ASCII 铃声,在遇到该转义字符时,计算机发出哔哔声
\d
:当前日期,以星期、月、日的形式表示,如 Mon May 26
\h
:本地机器的主机名,但是不带域名
\H
:完整的主机名
\j
:当前 shell 会话中进行的任务个数
\l
:当前设备名称
\n
:换行符
\r
:回车符
\s
:shell 程序的名称
\t
:当前时间(24 小时制),格式为小时:分钟:秒
\T
:当前时间(12 小时制)
\@
:当前时间(12 小时制,格式为 AM/PM)
\A
:当前(24 小时制),格式为小时:分钟
\u
:当前用户的用户名
\v
:shell 的版本号
\V
:shell 的版本号和发行号
\w
:当前工作目录名
\W
:当前工作目录名称的最后一部分
\!
:当前命令的历史编号
\#
:当前 shell 会话中输入的命令数
\$
:在非管理员全县辖输出 $
,管理员权限下输出 #
\[
:标志一个或多个非打印字符序列的开始。用于嵌入非打印的控制字符,使其以一定方式操纵总段仿真器,比如移动光标或更改文本颜色
\]
:标志着非现实字符序列的结束
尝试设计提示符
通过这个特殊字符列表我们可以更该提示符来查看效果。我们首先备份现有字符串以便过后进行恢复,为此,将现有的字符串赋值到我们创建的另外一个 shell 变量中
ps1_old="$PS1"
添加颜色
大多数终端都会响应某些非打印字符序列,来控制光标位置、字符属性(如颜色、粗体、文本闪烁等)等内容。现在先来讲解颜色
字符颜色是由发送到终端的仿真器的一个 ANSI 转义代码来控制的,该转义代码嵌入到了要显示的字符流中。控制代码不会打印到屏幕上,而是被终端解释为一条指令。 \[
和 \]
这两个序列用来封装非打印字符串,一个 ANSI 转义代码以八进制 033 开始,后面跟着一个可选的字符属性,之后是一条指令。例如,将文本颜色设置为正常(attribute = 0)、黑色代码是 \033[0;30m
下表列出了可用的文本颜色,需要注意的是,这些颜色分为两组,区别在于是否应用了粗体(bold)属性,这个属性使得色彩分为深色和浅色
033[0;30m
:黑色
033[0;31m
:红色
033[0;31m
:绿色
033[0;32m
:棕色
033[0;33m
:蓝色
033[0;34m
:紫色
033[0;35m
:青色
033[0;36m
:淡灰色
033[0;37m
:深灰色
033[1;30m
:淡红色
033[1;31m
:深红色
033[1;32m
:淡绿色
033[1;33m
:黄色
033[1;34m
:淡蓝色
033[1;35m
:淡紫色
033[1;36m
:淡青色
033[1;37m
:白色
现在我们创造红色的提示符
PS1="\[\033[0;31m]<\u@\h \W>\$\[\033[0m\]"
使用下标代码可以设置文本的背景颜色,背景颜色不支持粗体属性
033[0;40m
:黑色
033[0;41m
:红色
033[0;42m
:绿色
033[0;43m
:棕色
033[0;44m
:蓝色
033[0;45m
:紫色
033[0;46m
:青色
033[0;47m
:淡灰色
文本除了正常的(0)和粗体(1)属性外,开可以设置为下划线(4),闪烁(5)和斜体(7)
移动光标
转移代码也可以用来定位光标。比如在提示符出现的时候,这些转移代码通常用来在屏幕的不同位置(比如屏幕上方的一角)显示一个时钟或其他信息。下表为可以定位光标的转移代码
033[1;cH
:将光标移动至 1 行 c 列
033[nA
:将光标向上移动 n 行
033[nB
:将光标向下移动 n 行
033[nC
:将光标向前移动 n 个字符
033[nD
:将光标向后移动 n 个字符
033[nB
:清空屏幕并将光标移动至左上角(第 0 行第 0 列)
033[1;cH
:清空当前光标位置到行末的内容
033[1;cH
:存储当前光标位置
033[1;cH
:恢复之前存储的光标位置
保存提示符
很显然,用户不会想要每次都输入这样一长串代码,所以就需要将提示符存储在某个地方,将提示符添加到 .bashrc
文件中是一个一劳永逸的解决办法
常见任务和主要工具
软件包管理
决定 Linux 发行版本最重要的因素是软件包系统和支持该发行版本社区的活力。软件包管理是一种在系统上安装、维护软件的方法。虽然所有主流的 Linux 发行版本都提供了强大而复杂的维持系统运行的图形化见面操作主程序,但学习命令行程序同样重要
软件包系统
不同的 Linux 发行版用当是不同的软件包系统,并且原则上,适用于一种发行版的软件包与其他版本是不兼容的。大多数版本采用的还是下表中所列的两个软件包系统
Debian 类(.deb 技术):Debian、Ubuntu、Xandros、Linspire
Red Hat 类(.rpm 技术):Fedora、CentOS、Red Hat Enterprise Linux,openSUSE、Mandriva、PCLinuxOS
软件包系统工作方式
Linux 系统所有软件都可在网上找到,并且多数是一软件包文件的形式由发行商提供,其余以可手动安装的源代码形式存在
软件包文件
包文件是组成软件包系统的基本软件单元,它是由组成软件包的文件压缩而成的文件集。许多软件包中还包含了安装软件包前后执行配置任务的安装脚本
包文件通常由软件维护者创建,改为护着通常(并不总是)是发行商的职员。包维护者从上游供应商获得软件源代码,然后进行编译,并创建包的元数据及其他必须的安装脚本
库 如今多数软件包均由发行商或感兴趣的第三方创建。LInux 用户可以从其所使用的 Linux 版本的中心库中获得软件包
在软件开发生命周期的不容阶段,一个发行版本可能会维护多个不同仓库
依赖关系
几乎没有任何一个程序是独立的。与之相反,程序之间相互依赖彼此完成既定工作。一些共有的操作,比如输入/输出操作,就是有多个程序共享的例程执行。这些例程存储在共享库里面,共享库里面的文件为国歌程序提供必要的服务。现代软件包管理系统都提供依赖性解决策略,从而确保用户安装了软件包的同时也安装了其所有的依赖关系
高级和低级软件包工具 软件包管理系统通常包含两类工具——执行如安装、删除软件包文件等任务的低级工具和进行元数据搜索及提供依赖性解决的高级工具。本章主要介绍 Debian 类型的系统所提供的软件包工具和最近的 Red-Hat 系列产品使用的工具
常见软件包管理任务
命令行软件包管理工具可以完成许多操作,下面我们介绍一些常见的,有一点要说明,低级工具也支持软件包文件的创建,但不在本书的讨论范围
在库里面查找软件包
通过使用高级工具来搜索库元数据时,我们可以根据包文件名或其描述来查找该包
Debian 系统: apt-get update
apt-cache search search_string
Red Hat 系统: yum search search_string
例如,在 Red Hat 系统的 yum 库中搜索 emacs 文本编辑器的代码如下
yum search emacs
安装库中的软件包
高级工具允许从库中下载、安装软件包,同时安装所有的依赖包
Debian 系统: apt-get update
apt-get install package_name
Red Hat 系统: yum install package_name
例如,在 Debian 系统安装 apt 元数据库中的 emacs 文本编辑器的代码如下
apt-get update
apt-get install emacs
安装软件包文件中的软件包
如果软件包文件并不是从库源中下载的,那么我们就可用低级工具直接安装
Debian 系统: dpkg --install package_file
Red Hat 系统: rpm -i package_file
删除软件包
卸载软件包既可利用高级工具也可利用低级工具,高级工具命令如下
Debian 系统: apt-get remove package_name
Red Hat 系统: yum erase package_name
更新软件包
最常见的软件包管理任务是保持系统安装最新的软件包
Debian 系统: apt-get update
apt-get upgrade
Red Hat 系统: yum update
更新软件包文件中的软件包
如果软件包的更新版本已从非库源中下载,那么我就可以用下表命令进行安装更新取代原版本
Debian 系统: dpkg --install package_file
Red Hat 系统: rpm -U package_file
列出已安装的软件包列表
Debian 系统: dpkg --list
Red Hat 系统: rpm -qa
判断软件是否安装
Debian 系统: dpkg --status package_name
Red Hat 系统: rpm -q package_name
显示已安装软件包的相关信息
Debian 系统: apt-cache show package_name
Red Hat 系统: yum info package_name
查看某具体文件由哪个软件包安装得到
Debian 系统: dpkg --search file_name
Red Hat 系统: rpm -qf file_name
存储介质
对于诸如硬盘之类的物理存储器、网络存储器以及像 RAID 和 LVM 之类的虚拟存储器,Linux 都有惊人的处理能力
挂载、卸载存储设备
多数情况下,设备只要连接上系统就能运作。但是,像服务器这类的非图形界面的的操作系统通常都有一些机制的存储需求和复杂的配置要求,所以在这类系统中管理存储设备很大程度上还是靠手动操作
管理存储设备搜先要做的就是将该设备添加到文件系统树中,从而允许操作系统可以操作该设备,这个过程称之为挂在。这与 MS-DOS、Windows 不同,它们对于每个设备都有独立的树
查看已挂载的文件系统列表
mount
命令用于文件系统挂载,不带任何参数输入该命令会调出目前已经挂载过的文件系统列表,文件地格式是:device on mont_point type filesystem_type (options)
获取设备名后,便可以写在该设备,然后将其挂载在文件系统树的另外一个节点上。进行此操作,必须首先获得超级用户权限,使用 unmount
命令卸载
unmount device
为什么卸载如此重要?
free 命令会输出关于存储器使用情况的一些数据,buffer(缓存)就包括在其中,计算机系统是以运行得尽可能快为原则设计的,阻碍计算机运行速度的一大因素就是低速设备。计算机可以把尊卑发给低速设备的数据先发送给缓冲区,从而计算机能尽快返回去处理其他进程
卸载设备能够确保缓存中的所有剩余数据全部写入设备,从而设备能被安全移除
确定设备名称
如果读者使用的系统不能自动挂载可移动设备,那么下面介绍的方法来命名插入系统的可移动设备。首先,对 /var/log/messages
文件进行实时查看
sudo tail -f /var/log/messages
接着插入可移动设备,再插入瞬间,内核就能检测到设备
之后注意用 []
包裹的设备名,直接用 sudo mount /dev/sdb1 /mnt/flash
即可挂载到闪存节点
创建新的文件系统
将一个使用 FAT32 文件系统的闪存驱动器重新格式化为 Linux 本地文件系统,需要两个步骤:1. 在对现有分区不满意的情况下创建一个新的分区布局;2. 在驱动器上创建一个新的空文件系统
下面是一个格式化闪存驱动器的例子
使用 fdisk 命令进行磁盘分区
fdisk
命令实现用户与磁盘设备(比如硬盘驱动器和闪存驱动器)进行较低层次的直接交互。该工具可以用来编辑、删除以及创建设备分区。使用闪存前,我们必须首先将其卸载,然后在启动 fdisk 程序
sudo umount /dev/sdb1
sudo fdisk /dev/sdb
程序启动后,会出现如下提示信息:
Command (m for help):
输入 m
会出现程序菜单,接着按下 p
打印显示设备分区列表,之后我们需要将分区类型改为新的分区 ID 也就是 Linux 分区,按下 l
显示所有可能分区类型的对照表。之后输入 t
和新的 ID 就完成了分区 ID 的修改,之后我们就该向设备写入修改后的分区表,然后退出,输入 w
用 mkfs 命令创建新的文件系统
分区编辑已完成,我们便可以在内存上创建新的文件系统。 mkfs
命令可以用来创建各种类型的文件系统,比如我们想要创建 ext3 文件系统
sudo mkfs -t ext3 /dev/sdb
测试、修复和文件系统
系统每次启动时,挂载文件系统前都会惯例性地检查文件系统的完整性,此检查过程是由 fsck(filesystem check 的缩写)程序完成的,ftab 文件的每个条目末尾的数字正是对应设备的检查优先级。
除了检查文件系统的完整性外,fsck 还能修复损坏的文件系统,修复程度取决于损坏程度。对于类 UNIX 系统,已修复文件会放在系统根目录下的 lost + found
目录中
下面的命令可以用来检查闪存
sudo fsck /dev/sdb1
在 UNIX 文化中 fsck 是 fuck 的代替写法
格式化软盘
首先对软盘进行一个低级格式化操作,然后创建一个文件系统
sudo fdformat /dev/fd0
后 sudo mkfs -t msdos /dev/fd0
直接从/向设备转移数据
虽然,我们通常认为电脑上的数据都是以文件的形式存储的,但也有可能会认为数据以"原始"形式存储。以磁盘驱动器为例,它包含了许多被操作系统当作目录或文件的数据“块”。如果可以简单地把磁盘驱动器当作一个大数据块集,那么我们就可以执行一些有用任务,诸如克隆设备等
dd 程序可以完成这样的任务,该命令将数据块从一个地方复制到另一个地方,由于历史原因,该命令使用句法比较独特
dd if=input_file of=output_file [bs=block_size [count=blocks]]
假定现有两个容量一样的 U 盘,并且我们希望将第一个 U 盘里的内容准确完全地复制到第二个 U 盘里面
dd if=/dev/sdb of=/dev/sdc
或者,如果只有 i 的一个盘连接到电脑上,那么我们可以将其内容先复制到一个普通的文件里以备后续储存或复制
dd if=/dev/sdb of=flash_drive.img
dd 是由 data definition 两个单词缩写而来,千万不要把指定的设备名输入错
创建 CD-ROM 映像
向 CD-ROM 写入数据包括两个步骤:拆功能键一个 ISO 映像文件,也就是 CD-ROM 文件系统映像;其次,将此映像文件写入到 CD-ROM 介质中
创建一个 CD-ROM 文件映像副本
dd if=/dev/cdrom of=ubuntu.iso
该方法适用于数据类 DVD,但不适用于音频 DVD,因为音频 DVD 并不适用文件系统实现存储。对于音频 CD,可以使用 cdrdao
命令
从文件集合中创建映像文件
enisoimage 程序通常用于创建包含一个文件目录的 ISO 映像文件。首先我们创建一个目录,该目录包含了我们希望加进映像文件里的文件,然后运行 enisoimage 程序创建映像文件。
genisoimage -o cd-rom -R -J ~/cd-rom-files
向 CD-ROM 写入映像文件
映像文件创建好后,下一步是将其刻录进光学介质中。下面我们所讨论的大部分命令都是用于 CD-ROM 和 DVD 介质
直接挂载 ISO 映像文件
当 ISO 映像文件仍在硬盘上时,我们可以把它当作已存在于光学介质中,并且有一个敲门可以实现该映像文件的挂载就是通过增加 -o loop
选项来挂载,如此便可以把映像文件当作设备一样挂载在文件系统树上了
mkdir /mnt/iso_image
mount -t iso9660 -o loop image.iso /mnt/iso_image
在上面例子中,我们创建了一个叫做 /mnt/iso_image
挂载节点并将 image.iso
映像文件挂载在该节点上。映像文件挂载成功后,就可以把它当作真实的 CD-ROM 或 DVD
擦除可读写 CD-ROM
可擦写 CD-ROM 在重用之前需要被擦除或清空,我们可以通过 wodim
命令指定光盘刻录机操作对象的设别名以及所要执行的擦除类型来完成, wodim
程序提供多种擦除类型,最基本的就是 fast 类型
wodim dev=/dev/cdrw blank=fast
写入映像文件
同样我们使用 wodim
命令写入映像文件,通过指定写入的光介质刻录设备的名字以及映像文件的名字来完成
wodim dev=/dev/cdrw image.iso
附加认证
通常,确认所下载的 ISO 映像文件是否完整大有必要,多数情况下,ISO 映像文件的发行商提供一个校验和文件,检验和是通过一种奇异的数学计算得到而以数字形式表示的计算值,它代表了目标文件的内容。示例如下
md5sum image.iso
得出校验和后与供应商提供的 md5sum
校验和数知进行比较验证