定制提示符、包管理以及存储介质

定制提示符

和 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/fd0sudo 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 校验和数知进行比较验证