Gabriel Cánepa 发布的文章

在“Linux 平台下 Python 脚本编程入门”系列之前的文章里,我们向你介绍了 Python 的简介,它的命令行 shell 和 IDLE(LCTT 译注:python 自带的一个 IDE)。我们也演示了如何进行算术运算、如何在变量中存储值、还有如何打印那些值到屏幕上。最后,我们通过一个练习示例讲解了面向对象编程中方法和属性概念。

在 Python 编程中写 Linux Shell 脚本

本篇中,我们会讨论控制流(根据用户输入的信息、计算的结果,或者一个变量的当前值选择不同的动作行为)和循环(自动重复执行任务),接着应用我们目前所学东西来编写一个简单的 shell 脚本,这个脚本会显示操作系统类型、主机名、内核版本、版本号和机器硬件架构。

这个例子尽管很基础,但是会帮助我们证明,比起使用一般的 bash 工具,我们通过发挥 Python 面向对象的特性来编写 shell 脚本会更简单些。

换句话说,我们想从这里出发:

# uname -snrvm

检查 Linux 的主机名

用 Python 脚本来检查 Linux 的主机名

或者

用脚本检查 Linux 系统信息

看着不错,不是吗?那我们就挽起袖子,开干吧。

Python 中的控制流

如我们刚说那样,控制流允许我们根据一个给定的条件,选择不同的输出结果。在 Python 中最简单的实现就是一个 if/else 语句。

基本语法是这样的:

if 条件:
    # 动作 1
else:
    # 动作 2

当“条件”求值为真(true),下面的代码块就会被执行(# 动作 1代表的部分)。否则,else 下面的代码就会运行。 “条件”可以是任何表达式,只要可以求得值为真或者假。

举个例子:

  1. 1 < 3 # 真
  2. firstName == "Gabriel" # 对 firstName 为 Gabriel 的人是真,对其他不叫 Gabriel 的人为假
  • 在第一个例子中,我们比较了两个值,判断 1 是否小于 3。
  • 在第二个例子中,我们比较了 firstName(一个变量)与字符串 “Gabriel”,看在当前执行的位置,firstName 的值是否等于该字符串。
  • 条件和 else 表达式都必须跟着一个冒号(:)。
  • 缩进在 Python 中非常重要。同样缩进下的行被认为是相同的代码块。

请注意,if/else 表达式只是 Python 中许多控制流工具的一个而已。我们先在这里了解以下,后面会用在我们的脚本中。你可以在官方文档中学到更多工具。

Python 中的循环

简单来说,一个循环就是一组指令或者表达式序列,可以按顺序一直执行,只要条件为真,或者对列表里每个项目执行一一次。

Python 中最简单的循环,就是用 for 循环迭代一个给定列表的元素,或者对一个字符串从第一个字符开始到执行到最后一个字符结束。

基本语句:

for x in example:
    # do this

这里的 example 可以是一个列表或者一个字符串。如果是列表,变量 x 就代表列表中每个元素;如果是字符串,x 就代表字符串中每个字符。

>>> rockBands = []
>>> rockBands.append("Roxette")
>>> rockBands.append("Guns N' Roses")
>>> rockBands.append("U2")
>>> for x in rockBands:
        print(x)
或
>>> firstName = "Gabriel"
>>> for x in firstName:
        print(x)

上面例子的输出如下图所示:

学习 Python 中的循环

Python 模块

很明显,必须有个办法将一系列的 Python 指令和表达式保存到文件里,然后在需要的时候取出来。

准确来说模块就是这样的。比如,os 模块提供了一个到操作系统的底层的接口,可以允许我们做许多通常在命令行下执行的操作。

没错,os 模块包含了许多可以用来调用的方法和属性,就如我们之前文章里讲解的那样。不过,我们需要使用 import 关键词导入(或者叫包含)模块到运行环境里来:

>>> import os

我们来打印出当前的工作目录:

>>> os.getcwd()

学习 Python 模块

现在,让我们把这些结合在一起(包括之前文章里讨论的概念),编写需要的脚本。

Python 脚本

以一段声明文字开始一个脚本是个不错的想法,它可以表明脚本的目的、发布所依据的许可证,以及一个列出做出的修改的修订历史。尽管这主要是个人喜好,但这会让我们的工作看起来比较专业。

这里有个脚本,可以输出这篇文章最前面展示的那样。脚本做了大量的注释,可以让大家可以理解发生了什么。

在进行下一步之前,花点时间来理解它。注意,我们是如何使用一个 if/else 结构,判断每个字段标题的长度是否比字段本身的值还大。

基于比较结果,我们用空字符去填充一个字段标题和下一个之间的空格。同时,我们使用一定数量的短线作为字段标题与其值之间的分割符。

#!/usr/bin/python3
# 如果你没有安装 Python 3 ,那么修改这一行为 #!/usr/bin/python

# Script name: uname.py
# Purpose: Illustrate Python OOP capabilities to write shell scripts more easily
# License: GPL v3 (http://www.gnu.org/licenses/gpl.html)

# Copyright (C) 2016 Gabriel Alejandro Cánepa
# ​Facebook / Skype / G+ / Twitter / Github: gacanepa
# Email: gacanepa (at) gmail (dot) com

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see .

# REVISION HISTORY
# DATE        VERSION AUTHOR         CHANGE DESCRIPTION
# ---------- ------- --------------
# 2016-05-28 1.0     Gabriel Cánepa    Initial version

### 导入 os 模块
import os

### 将 os.uname() 的输出赋值给 systemInfo 变量
### os.uname() 会返回五个字符串元组(sysname, nodename, release, version, machine)
### 参见文档:https://docs.python.org/3.2/library/os.html#module-os
systemInfo = os.uname()

### 这是一个固定的数组,用于描述脚本输出的字段标题
headers = ["Operating system","Hostname","Release","Version","Machine"]

### 初始化索引值,用于定义每一步迭代中
### systemInfo 和字段标题的索引
index = 0

### 字段标题变量的初始值
caption = ""

### 值变量的初始值
values = ""

### 分隔线变量的初始值
separators = ""

### 开始循环
for item in systemInfo:
    if len(item) < len(headers[index]):
     ### 一个包含横线的字符串,横线长度等于item[index] 或 headers[index]
     ### 要重复一个字符,用引号圈起来并用星号(*)乘以所需的重复次数 
     separators = separators + "-" * len(headers[index]) + " "
     caption = caption + headers[index] + " "
     values = values + systemInfo[index] + " " * (len(headers[index]) - len(item)) + " "
    else:
     separators = separators + "-" * len(item) + " "
     caption =  caption + headers[index] + " " * (len(item) - len(headers[index]) + 1)
     values = values + item + " "
    ### 索引加 1
    index = index + 1
### 终止循环

### 输出转换为大写的变量(字段标题)名
print(caption.upper())

### 输出分隔线
print(separators)

# 输出值(systemInfo 中的项目)
print(values)

### 步骤:
### 1) 保持该脚本为 uname.py (或任何你想要的名字)
### 并通过如下命令给其执行权限:
### chmod +x uname.py
### 2) 执行它;
### ./uname.py

如果你已经按照上述描述将上面的脚本保存到一个文件里,并给文件增加了执行权限,那么运行它:

# chmod +x uname.py
# ./uname.py

如果试图运行脚本时你得到了如下的错误:

-bash: ./uname.py: /usr/bin/python3: bad interpreter: No such file or directory

这意味着你没有安装 Python3。如果那样的话,你要么安装 Python3 的包,要么替换解释器那行(如果如之前文章里概述的那样,跟着下面的步骤去更新 Python 执行文件的软连接,要特别注意并且非常小心):

#!/usr/bin/python3

#!/usr/bin/python

这样会通过使用已经安装好的 Python 2 去执行该脚本。

注意:该脚本在 Python 2.x 与 Pyton 3.x 上都测试成功过了。

尽管比较粗糙,你可以认为该脚本就是一个 Python 模块。这意味着你可以在 IDLE 中打开它(File → Open… → Select file):

在 IDLE 中打开 Python

一个包含有文件内容的新窗口就会打开。然后执行 Run → Run module(或者按 F5)。脚本的输出就会在原始的 Shell 里显示出来:

执行 Python 脚本

如果你想纯粹用 bash 写一个脚本,也获得同样的结果,你可能需要结合使用 awksed,并且借助复杂的方法来存储与获得列表中的元素(不要忘了使用 tr 命令将小写字母转为大写)。

另外,在所有的 Linux 系统版本中都至少集成了一个 Python 版本(2.x 或者 3.x,或者两者都有)。你还需要依赖 shell 去完成同样的目标吗?那样你可能需要为不同的 shell 编写不同的版本。

这里演示了面向对象编程的特性,它会成为一个系统管理员得力的助手。

注意:你可以在我的 Github 仓库里获得 这个 python 脚本(或者其他的)。

总结

这篇文章里,我们讲解了 Python 中控制流、循环/迭代、和模块的概念。我们也演示了如何利用 Python 中面向对象编程的方法和属性来简化复杂的 shell 脚本。

你有任何其他希望去验证的想法吗?开始吧,写出自己的 Python 脚本,如果有任何问题可以咨询我们。不必犹豫,在分割线下面留下评论,我们会尽快回复你。


via: http://www.tecmint.com/learn-python-programming-to-write-linux-shell-scripts/

作者:Gabriel Cánepa 译者:wi-cuckoo 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写。大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会给你带来一些其它的好处。

在 Linux 中学习 Python 脚本编程

首先,我们会使用 Python 的命令行工具,还会接触到 Python 的面向对象特性(这篇文章的后半部分会谈到它)。

学习 Python 可以助力于你在桌面应用开发数据科学领域的职业发展。

容易上手,广泛使用,拥有海量“开箱即用”的模块(它是一组包含 Python 语句的外部文件),Python 理所当然地成为了美国计算机专业大学生在一年级时所上的程序设计课所用语言的不二之选。

在这个由两篇文章构成的系列中,我们将回顾 Python 的基础部分,希望初学编程的你能够将这篇实用的文章作为一个编程入门的跳板,和日后使用 Python 时的一篇快速指引。

Linux 中的 Python

Python 2.x 和 3.x 通常已经内置在现代 Linux 发行版中,你可以立刻使用它。你可以终端模拟器中输入 pythonpython3 来进入 Python shell, 并输入 quit() 退出。

$ which python
$ which python3
$ python -v
$ python3 -v
$ python
>>> quit()
$ python3
>>> quit()

在 Linux 中运行 Python 命令

如果你希望在键入 python 时使用 Python 3.x 而不是 2.x,你可以像下面一样更改对应的符号链接:

$ sudo rm /usr/bin/python 
$ cd /usr/bin
$ ln -s python3.2 python # Choose the Python 3.x binary here

删除 Python 2,使用 Python 3

顺便一提,有一点需要注意:尽管 Python 2.x 仍旧被使用,但它并不会被积极维护。因此,你可能要考虑像上面指示的那样来切换到 3.x。2.x 和 3.x 的语法有一些不同,我们会在这个系列文章中使用后者。

另一个在 Linux 中使用 Python 的方法是通过 IDLE ( Python 集成开发环境 the Python Integrated Development Environment ),这是一个为编写 Python 代码而生的图形用户界面。在安装它之前,你最好查看一下适用于你的 Linux 发行版的 IDLE 可用版本。

# aptitude search idle     [Debian 及其衍生发行版]
# yum search idle          [CentOS 和 Fedora]
# dnf search idle          [Fedora 23+ 版本]

然后,你可以像下面一样安装它:

$ sudo aptitude install idle-python3.2    # I'm using Linux Mint 13

安装成功后,你会看到 IDLE 的运行画面。它很像 Python shell,但是你可以用它做更多 Python shell 做不了的事。

比如,你可以:

  1. 轻松打开外部文件 (File → Open);

Python Shell

  1. 复制 (Ctrl + C) 和粘贴 (Ctrl + V) 文本;
  2. 查找和替换文本;
  3. 显示可能的代码补全(一个在其他 IDE 里可能叫做“智能感知”或者“自动补完”的功能);
  4. 更改字体和字号,等等。

最厉害的是,你可以用 IDLE 创建桌面应用。

我们在这两篇文章中不会开发桌面应用,所以你可以根据喜好来选择 IDLE 或 Python shell 去运行下面的例子。

Python 中的基本运算

就像你预料的那样,你能够直接进行算术操作(你可以在你的所有运算中使用足够多的括号!),还可以轻松地使用 Python 拼接字符串。

你还可以将运算结果赋给一个变量,然后在屏幕上显示它。Python 有一个叫做拼接 (concatenation) 的实用功能——给 print 函数提供一串用逗号分隔的变量和/或字符串,它会返回一个由你刚才提供的变量依序构成的句子:

>>> a = 5
>>> b = 8
>>> x = b / a
>>> x
1.6
>>> print(b, "divided by", a, "equals", x)

注意,你可以将不同类型的变量(数字,字符串,布尔符号等等)混合在一起。当你将一个值赋给一个变量后,你可以随后更改它的类型,不会有任何问题(因此,Python 被称为动态类型语言)。

如果你尝试在静态类型语言中(如 Java 或 C#)做这件事,它将抛出一个错误。

学习 Python 的基本操作

面向对象编程的简单介绍

在面向对象编程(OOP)中,程序中的所有实体都会由对象的形式呈现,并且它们可以与其他对象交互。因此,对象拥有属性,而且大多数对象可以执行动作(这被称为对象的方法)。

举个例子:我们来想象一下,创建一个对象“狗”。它可能拥有的一些属性有颜色品种年龄等等,而它可以完成的动作有 叫()吃()睡觉(),诸如此类。

你可以看到,方法名后面会跟着一对括号,括号当中可能会包含一个或多个参数(向方法中传递的值),也有可能什么都不包含。

我们用 Python 的基本对象类型之一——列表来解释这些概念。

解释对象的属性和方法:Python 中的列表

列表是条目的有序组合,而这些条目所属的数据类型并不需要相同。我们像下面一样来使用一对方括号,来创建一个名叫 rockBands 的列表:

你可以向 rockBandsappend() 方法传递条目,来将它添加到列表的尾部,就像下面这样:

>>> rockBands = []
>>> rockBands.append("The Beatles")
>>> rockBands.append("Pink Floyd")
>>> rockBands.append("The Rolling Stones")

为了从列表中移除元素,我们可以向 remove() 方法传递特定元素,或向 pop() 中传递列表中待删除元素的位置(从 0 开始计数)。

换句话说,我们可以用下面这种方法来从列表中删除 “The Beatles”:

>>> rockBands.remove("The Beatles")

或者用这种方法:

>>> rockBands.pop(0)

如果你输入了对象的名字,然后在后面输入了一个点,你可以按 Ctrl + space 来显示这个对象的可用方法列表。

列出可用的 Python 方法

列表中含有的元素个数是它的一个属性。它通常被叫做“长度”,你可以通过向内建函数 len 传递一个列表作为它的参数来显示该列表的长度(顺便一提,之前的例子中提到的 print 语句,是 Python 的另一个内建函数)。

如果你在 IDLE 中输入 len,然后跟上一个不闭合的括号,你会看到这个函数的默认语法:

Python 的 len 函数

现在我们来看看列表中的特定条目。它们也有属性和方法吗?答案是肯定的。比如,你可以将一个字符串条目转换为大写形式,并获取这个字符串所包含的字符数量。像下面这样做:

>>> rockBands[0].upper()
'THE BEATLES'
>>> len(rockBands[0])
11

总结

在这篇文章中,我们简要介绍了 Python、它的命令行 shell、IDLE,展示了如何执行算术运算,如何在变量中存储数据,如何使用 print 函数在屏幕上重新显示那些数据(无论是它们本身还是它们的一部分),还通过一个实际的例子解释了对象的属性和方法。

下一篇文章中,我们会展示如何使用条件语句和循环语句来实现流程控制。我们也会解释如何编写一个脚本来帮助我们完成系统管理任务。

你是不是想继续学习一些有关 Python 的知识呢?敬请期待本系列的第二部分(我们会在脚本中将 Python 和命令行工具的优点结合在一起),你还可以考虑购买我们的《终极 Python 编程》系列教程(这里有详细信息)。

像往常一样,如果你对这篇文章有什么问题,可以向我们寻求帮助。你可以使用下面的联系表单向我们发送留言,我们会尽快回复你。


via: http://www.tecmint.com/learn-python-programming-and-scripting-in-linux/

作者:Gabriel Cánepa 译者:StdioA 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

由于 2016 年 2 月 2 号开始启用了新的 LFCS 考试要求, 我们在 LFCS 系列系列添加了一些必要的内容。为了考试的需要,我们强烈建议你看一下LFCE 系列

LFCS: 了解 Linux 的帮助文档和工具

当你习惯了在命令行下进行工作,你会发现 Linux 已经有了许多使用和配置 Linux 系统所需要的文档。

另一个你必须熟悉命令行帮助工具的理由是,在LFCSLFCE 考试中,它们是你唯一能够使用的信息来源,没有互联网也没有百度。你只能依靠你自己和命令行。

基于上面的理由,在这一章里我们将给你一些建议来可以让你有效的使用这些安装的文档和工具,以帮助你通过Linux 基金会认证考试。

Linux 帮助手册 man

man 手册是 manual 手册的缩写,就是其名字所揭示的那样:一个给定工具的帮助手册。它包含了命令所支持的选项列表(以及解释),有些工具甚至还提供一些使用范例。

我们用 man 命令 跟上你想要了解的工具名称来打开一个帮助手册。例如:

# man diff

这将打开diff的手册页,这个工具将逐行对比文本文件(如你想退出只需要轻轻的点一下 q 键)。

下面我来比较两个文本文件 file1file2。这两个文本文件包含了使用同一个 Linux 发行版相同版本安装的两台机器上的的安装包列表。

输入diff 命令它将告诉我们 file1file2 有什么不同:

# diff file1 file2

在Linux中比较两个文本文件

< 这个符号是说file2缺失的行。如果是 file1缺失,我们将用 > 符号来替代指示。

另外,7d6 意思是说file1的第7行要删除了才能和file2一致(24d2241d38 也是同样的意思) 65,67d61 告诉需要删除从第 65 行到 67 行。我们完成了以上步骤,那么这两个文件将完全一致。

此外,根据 man 手册说明,你还可以通过 -y 选项来以两路的方式显示文件。你可以发现这对于你找到两个文件间的不同根据方便容易。

# diff -y file1 file2

比较并列出两个文件的不同

此外,你也可以用diff来比较两个二进制文件。如果它们完全一样,diff 将什么也不会输出。否则,它将会返回如下信息:“Binary files X and Y differ”。

–help 选项

--help选项,大多数命令都支持它(并不是所有), 它可以理解为一个命令的简短帮助手册。尽管它没有提供工具的详细介绍,但是确实是一个能够快速列出程序的所支持的选项的不错的方法。

例如,

# sed --help

将显示 sed (流编辑器)的每个支持的选项。

sed命令的一个典型用法是替换文件中的字符。用 -i 选项(意思是 “原地编辑编辑文件”),你可以编辑一个文件而且并不需要打开它。 如果你想要同时备份一个原始文件,用 -i 选项加后缀来创建一个原始文件的副本。

例如,替换 lorem.txt 中的LoremTecmint(忽略大小写),并且创建一个原文件的备份副本,命令如下:

# less lorem.txt | grep -i lorem
# sed -i.orig 's/Lorem/Tecmint/gI' lorem.txt
# less lorem.txt | grep -i lorem
# less lorem.txt.orig | grep -i lorem

请注意lorem.txt文件中Lorem 都已经替换为 Tecmint,并且原文件 lorem.txt 被保存为lorem.txt.orig

替换文件中的文本

/usr/share/doc 内的文档

这可能是我最喜欢的方法。如果你进入 /usr/share/doc 目录,并列出该目录,你可以看到许多以安装在你的 Linux 上的工具为名称的文件夹。

根据 文件系统层级标准,这些文件夹包含了许多帮助手册没有的信息,还有一些可以使配置更方便的模板和配置文件。

例如,让我们来看一下 squid-3.3.8 (不同发行版的版本可能会不同),这还是一个非常受欢迎的 HTTP 代理和 squid 缓存服务器

让我们用cd命令进入目录:

# cd /usr/share/doc/squid-3.3.8

列出当前文件夹列表:

# ls

使用 ls 列出目录

你应该特别注意 QUICKSTARTsquid.conf.documented。这些文件分别包含了 Squid 详细文档及其经过详细备注的配置文件。对于别的安装包来说,具体的名字可能不同(有可能是 QuickRef 或者00QUICKSTART),但意思是一样的。

对于另外一些安装包,比如 Apache web 服务器,在/usr/share/doc目录提供了配置模板,当你配置独立服务器或者虚拟主机的时候会非常有用。

GNU 信息文档

你可以把它看做帮助手册的“开挂版”。它不仅仅提供工具的帮助信息,而且还是超级链接的形式(没错,在命令行中的超级链接),你可以通过箭头按钮从一个章节导航到另外章节,并按下回车按钮来确认。

一个典型的例子是:

# info coreutils

因为 coreutils 包含了每个系统中都有的基本文件、shell 和文本处理工具,你自然可以从 coreutils 的 info 文档中得到它们的详细介绍。

Info Coreutils

和帮助手册一样,你可以按 q 键退出。

此外,GNU info 还可以显示标准的帮助手册。 例如:

# info tune2fs

它将显示 tune2fs的帮助手册, 这是一个 ext2/3/4 文件系统管理工具。

我们现在看到了,让我们来试试怎么用tune2fs

显示 /dev/mapper/vg00-vol\_backups 文件系统信息:

# tune2fs -l /dev/mapper/vg00-vol_backups

修改文件系统标签(修改为 Backups):

# tune2fs -L Backups /dev/mapper/vg00-vol_backups

设置文件系统的自检间隔及挂载计数(用-c 选项设置挂载计数间隔, 用 -i 选项设置自检时间间隔,这里 d 表示天,w 表示周,m 表示月)。

# tune2fs -c 150 /dev/mapper/vg00-vol_backups # 每 150 次挂载检查一次
# tune2fs -i 6w /dev/mapper/vg00-vol_backups # 每 6 周检查一次

以上这些内容也可以通过 --help 选项找到,或者查看帮助手册。

摘要

不管你选择哪种方法,知道并且会使用它们在考试中对你是非常有用的。你知道其它的一些方法吗? 欢迎给我们留言。


via: http://www.tecmint.com/explore-linux-installed-help-documentation-and-tools/

作者:Gabriel Cánepa 译者:kokialoves 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

由于 LFCS 考试中的一些改变已在 2016 年 2 月 2 日生效,我们添加了一些必要的专题到 LFCS 系列。我们也非常推荐备考的同学,同时阅读 LFCE 系列

LFCS:管理 LVM 和创建 LVM 分区

在安装 Linux 系统的时候要做的最重要的决定之一便是给系统文件、home 目录等分配空间。在这个地方犯了错,再要扩大空间不足的分区,那样既麻烦又有风险。

逻辑卷管理LVM)相较于传统的分区管理有许多优点,已经成为大多数(如果不能说全部的话) Linux 发行版安装时的默认选择。LVM 最大的优点应该是能方便的按照你的意愿调整(减小或增大)逻辑分区的大小。

LVM 的组成结构:

  • 把一块或多块硬盘或者一个或多个分区配置成物理卷(PV)。
  • 一个用一个或多个物理卷创建出的卷组(VG)。可以把一个卷组想象成一个单独的存储单元。
  • 在一个卷组上可以创建多个逻辑卷。每个逻辑卷相当于一个传统意义上的分区 —— 优点是它的大小可以根据需求重新调整大小,正如之前提到的那样。

本文,我们将使用三块 8 GB 的磁盘(/dev/sdb/dev/sdc/dev/sdd)分别创建三个物理卷。你既可以直接在整个设备上创建 PV,也可以先分区在创建。

在这里我们选择第一种方式,如果你决定使用第二种(可以参考本系列第四讲:创建分区和文件系统)确保每个分区的类型都是 8e

创建物理卷,卷组和逻辑卷

要在 /dev/sdb/dev/sdc/dev/sdd上创建物理卷,运行:

# pvcreate /dev/sdb /dev/sdc /dev/sdd

你可以列出新创建的 PV ,通过:

# pvs

并得到每个 PV 的详细信息,通过:

# pvdisplay /dev/sdX

X 即 b、c 或 d)

如果没有输入 /dev/sdX ,那么你将得到所有 PV 的信息。

使用 /dev/sdb/dev/sdc创建卷组 ,命名为vg00(在需要时是可以通过添加其他设备来扩展空间的,我们等到说明这点的时候再用,所以暂时先保留/dev/sdd`):

# vgcreate vg00 /dev/sdb /dev/sdc

就像物理卷那样,你也可以查看卷组的信息,通过:

# vgdisplay vg00

由于 vg00 是由两个 8 GB 的磁盘组成的,所以它将会显示成一个 16 GB 的硬盘:

LVM 卷组列表

当谈到创建逻辑卷,空间的分配必须考虑到当下和以后的需求。根据每个逻辑卷的用途来命名是一个好的做法。

举个例子,让我们创建两个 LV,命名为 vol_projects10 GB) 和 vol_backups (剩下的空间), 在日后分别用于部署项目文件和系统备份。

参数 -n 用于为 LV 指定名称,而 -L 用于设定固定的大小,还有 -l (小写的 L)在 VG 的预留空间中用于指定百分比大小的空间。

# lvcreate -n vol_projects -L 10G vg00
# lvcreate -n vol_backups -l 100%FREE vg00

和之前一样,你可以查看 LV 的列表和基础信息,通过:

# lvs

或是查看详细信息,通过:

# lvdisplay

若要查看单个 LV 的信息,使用 lvdisplay 加上 VGLV 作为参数,如下:

# lvdisplay vg00/vol_projects

逻辑卷列表

如上图,我们看到 LV 已经被创建成存储设备了(参考 LV Path 那一行)。在使用每个逻辑卷之前,需要先在上面创建文件系统。

这里我们拿 ext4 来做举例,因为对于每个 LV 的大小, ext4 既可以增大又可以减小(相对的 xfs 就只允许增大):

# mkfs.ext4 /dev/vg00/vol_projects
# mkfs.ext4 /dev/vg00/vol_backups

我们将在下一节向大家说明,如何调整逻辑卷的大小并在需要的时候添加额外的外部存储空间。

调整逻辑卷大小和扩充卷组

现在设想以下场景。vol_backups 中的空间即将用完,而 vol_projects 中还有富余的空间。由于 LVM 的特性,我们可以轻易的减小后者的大小(比方说 2.5 GB),并将其分配给前者,与此同时调整每个文件系统的大小。

幸运的是这很简单,只需:

# lvreduce -L -2.5G -r /dev/vg00/vol_projects
# lvextend -l +100%FREE -r /dev/vg00/vol_backups

减小逻辑卷和卷组

在调整逻辑卷的时候,其中包含的减号 (-) 或加号 (+) 是十分重要的。否则 LV 将会被设置成指定的大小,而非调整指定大小。

有些时候,你可能会遭遇那种无法仅靠调整逻辑卷的大小就可以解决的问题,那时你就需要购置额外的存储设备了,你可能需要再加一块硬盘。这里我们将通过添加之前配置时预留的 PV (/dev/sdd),用以模拟这种情况。

想把 /dev/sdd 加到 vg00,执行:

# vgextend vg00 /dev/sdd

如果你在运行上条命令的前后执行 vgdisplay vg00 ,你就会看出 VG 的大小增加了。

# vgdisplay vg00

查看卷组磁盘大小

现在,你可以使用新加的空间,按照你的需求调整现有 LV 的大小,或者创建一个新的 LV。

在启动和需求时挂载逻辑卷

当然,如果我们不打算实际的使用逻辑卷,那么创建它们就变得毫无意义了。为了更好的识别逻辑卷,我们需要找出它的 UUID (用于识别一个格式化存储设备的唯一且不变的属性)。

要做到这点,可使用 blkid 加每个设备的路径来实现:

# blkid /dev/vg00/vol_projects
# blkid /dev/vg00/vol_backups

寻找逻辑卷的 UUID

为每个 LV 创建挂载点:

# mkdir /home/projects
# mkdir /home/backups

并在 /etc/fstab 插入相应的条目(确保使用之前获得的UUID):

UUID=b85df913-580f-461c-844f-546d8cde4646 /home/projects    ext4 defaults 0 0
UUID=e1929239-5087-44b1-9396-53e09db6eb9e /home/backups ext4    defaults 0 0

保存并挂载 LV:

# mount -a
# mount | grep home

挂载逻辑卷

在涉及到 LV 的实际使用时,你还需要按照曾在本系列第八讲:管理用户和用户组中讲解的那样,为其设置合适的 ugo+rwx

总结

本文介绍了 逻辑卷管理,一个用于管理可扩展存储设备的多功能工具。与 RAID(曾在本系列讲解过的 第六讲:组装分区为RAID设备——创建和管理系统备份)结合使用,你将同时体验到(LVM 带来的)可扩展性和(RAID 提供的)冗余。

在这类的部署中,你通常会在 RAID 上发现 LVM,这就是说,要先配置好 RAID 然后它在上面配置 LVM。

如果你对本问有任何的疑问和建议,可以直接在下方的评论区告诉我们。


via: http://www.tecmint.com/manage-and-create-lvm-parition-using-vgcreate-lvcreate-and-lvextend/

作者:Gabriel Cánepa 译者:martin2011qi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux 基金会发起了 LFCS 认证 ( Linux 基金会认证系统管理员 Linux Foundation Certified Sysadmin ),这是一个全新的认证体系,旨在让世界各地的人能够参与到中等水平的 Linux 系统的基本管理操作的认证考试中去,这项认证包括:维护正在运行的系统和服务的能力、全面监控和分析的能力以及何时向上游团队请求支持的决策能力。

Basic Shell Scripting and Filesystem Troubleshooting

LFCS 系列第十讲

请看以下视频,这里边介绍了 Linux 基金会认证程序。

本讲是系列教程中的第十讲,主要集中讲解简单的 Shell 脚本编程和文件系统故障排除。这两块内容都是 LFCS 认证中的必备考点。

理解 终端 Terminals 和 Shell

首先要声明一些概念。

  • Shell 是一个程序,它将命令传递给操作系统来执行。
  • Terminal 也是一个程序,允许最终用户使用它与 Shell 来交互。比如,下边的图片是 GNOME Terminal。

Gnome Terminal

Gnome Terminal

启动 Shell 之后,会呈现一个命令提示符 (也称为命令行) 提示我们 Shell 已经做好了准备,接受标准输入设备输入的命令,这个标准输入设备通常是键盘。

你可以参考该系列文章的 第一讲 如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件 来温习一些常用的命令。

Linux 为提供了许多可以选用的 Shell,下面列出一些常用的:

bash Shell

Bash 代表 Bourne Again Shell,它是 GNU 项目默认的 Shell。它借鉴了 Korn shell (ksh) 和 C shell (csh) 中有用的特性,并同时对性能进行了提升。它同时也是 LFCS 认证中所涵盖的各发行版中默认 Shell,也是本系列教程将使用的 Shell。

sh Shell

Bourne SHell 是一个比较古老的 shell,多年来一直都是很多类 Unix 系统的默认 shell。

ksh Shell

Korn SHell (ksh shell) 也是一个 Unix shell,是 贝尔实验室 Bell Labs 的 David Korn 在 19 世纪 80 年代初的时候开发的。它兼容 Bourne shell ,并同时包含了 C shell 中的多数特性。

一个 shell 脚本仅仅只是一个可执行的文本文件,里边包含一条条可执行命令。

简单的 Shell 脚本编程

如前所述,一个 shell 脚本就是一个纯文本文件,因此,可以使用自己喜欢的文本编辑器来创建和编辑。你可以考虑使用 vi/vim (参考本系列 第二讲 如何安装和使用纯文本编辑器 vi/vim),它的语法高亮让我的编辑工作非常方便。

输入如下命令来创建一个名为 myscript.sh 的脚本文件:

# vim myscript.sh

shell 脚本的第一行 (著名的 释伴行 shebang line ) 必须如下:

#!/bin/bash<ruby> <rp>  ( </rp> <rt> </rt> <rp>  ) </rp></ruby>

这条语句“告诉”操作系统需要用哪个解释器来运行这个脚本文件之后命令。

现在可以添加需要执行的命令了。通过注释,我们可以声明每一条命令或者整个脚本的具体含义。注意,shell 会忽略掉以井号 (#) 开始的注释语句。

#!/bin/bash
echo 这是关于 LFCS 认证系列的第十部分
echo 今天是 $(date +%Y-%m-%d)

编写并保存脚本之后,通过以下命令来使脚本文件成为可执行文件:

# chmod 755 myscript.sh

在执行脚本之前,我们需要说一下环境变量 ($PATH),运行:

echo $PATH

我们就会看到环境变量 ($PATH) 的具体内容:这是当输入命令时系统所搜索可执行程序的目录,每一项之间使用冒号 (:) 隔开。称它为环境变量,是因为它本是就是 shell 环境的一部分 —— 这是当 shell 每次启动时 shell 及其子进程可以获取的一系列信息。

当我们输入一个命令并按下回车时,shell 会搜索 $PATH 变量中列出的目录并执行第一个知道的实例。请看如下例子:

Linux Environment Variables

环境变量

假如存在两个同名的可执行程序,一个在 /usr/local/bin,另一个在 /usr/bin,则会执行环境变量中最先列出的那个,并忽略另外一个。

如果我们自己编写的脚本没有放在 $PATH 变量列出目录中的任何一个,则需要输入 ./filename 来执行它。而如果存储在 $PATH 变量中的任意一个目录,我们就可以像运行其他命令一样来运行之前编写的脚本了。

# pwd
# ./myscript.sh
# cp myscript.sh ../bin
# cd ../bin
# pwd
# myscript.sh

Execute Script in Linux

执行脚本

if 条件语句

无论何时,当你需要在脚本中根据某个命令的运行结果来采取相应动作时,你应该使用 if 结构来定义条件。基本语法如下:

if CONDITION; then
    COMMANDS;
else
    OTHER-COMMANDS
fi

其中,CONDITION 可以是如下情形的任意一项 (仅列出常用的),并且达到以下条件时返回 true:

  • [ -a file ] → 指定文件存在。
  • [ -d file ] → 指定文件存在,并且是一个目录。
  • [ -f file ] → 指定文件存在,并且是一个普通文件。
  • [ -u file ] → 指定文件存在,并设置了 SUID 权限位。
  • [ -g file ] → 指定文件存在,并设置了 SGID 权限位。
  • [ -k file ] → 指定文件存在,并设置了“黏连 (Sticky)”位。
  • [ -r file ] → 指定文件存在,并且文件可读。
  • [ -s file ] → 指定文件存在,并且文件不为空。
  • [ -w file ] → 指定文件存在,并且文件可写入。
  • [ -x file ] → 指定文件存在,并且可执行。
  • [ string1 = string2 ] → 字符串相同。
  • [ string1 != string2 ] → 字符串不相同。

[ int1 op int2 ] 为前述列表中的一部分 (例如: -eq –> int1 与 int2 相同时返回 true) ,其中比较项也可以是一个列表子项, 其中 op 为以下比较操作符。

  • -eq –> int1 等于 int2 时返回 true。
  • -ne –> int1 不等于 int2 时返回 true。
  • -lt –> int1 小于 int2 时返回 true。
  • -le –> int1 小于或等于 int2 时返回 true。
  • -gt –> int1 大于 int2 时返回 true。
  • -ge –> int1 大于或等于 int2 时返回 true。

for 循环语句

循环语句可以在某个条件下重复执行某个命令。基本语法如下:

for item in SEQUENCE; do
        COMMANDS;
done

其中,item 为每次执行 COMMANDS 时,在 SEQUENCE 中匹配到的值。

While 循环语句

该循环结构会一直执行重复的命令,直到控制命令(EVALUATION\_COMMAND)执行的退出状态值等于 0 时 (即执行成功) 停止。基本语法如下:

while EVALUATION_COMMAND; do
        EXECUTE_COMMANDS;
done

其中,EVALUATION\_COMMAND 可以是任何能够返回成功 (0) 或失败 (0 以外的值) 的退出状态值的命令,EXECUTE\_COMMANDS 则可以是任何的程序、脚本或者 shell 结构体,包括其他的嵌套循环。

综合使用

我们会通过以下例子来演示 if 条件语句和 for 循环语句。

在基于 systemd 的发行版中探测某个服务是否在运行

先建立一个文件,列出我们想要想要查看的服务名。

# cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Script to Monitor Linux Services

使用脚本监控 Linux 服务

我们编写的脚本看起来应该是这样的:

#!/bin/bash

# This script iterates over a list of services and
# is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
        systemctl status $service | grep --quiet "running"
        if [ $? -eq 0 ]; then
                echo $service "is [ACTIVE]"
        else
                echo $service "is [INACTIVE or NOT INSTALLED]"
        fi
done

Linux Service Monitoring Script

Linux 服务监控脚本

我们来解释一下这个脚本的工作流程

1). for 循环每次读取 myservices.txt 文件中的一项记录,每一项纪录表示一个服务的通用变量名。各项记录组成如下:

# cat myservices.txt

2). 以上命令由圆括号括着,并在前面添加美元符,表示它需要从 myservices.txt 的记录列表中取值并作为变量传递给 for 循环。

3). 对于记录列表中的每一项纪录 (即每一项纪录的服务变量),都会执行以下动作:

# systemctl status $service | grep --quiet "running"

此时,需要在每个通用变量名 (即每一项纪录的服务变量) 的前面添加美元符,以表明它是作为变量来传递的。其输出则通过管道符传给 grep。

其中,-quiet 选项用于阻止 grep 命令将发现的 “running” 的行回显到屏幕。当 grep 捕获到 “running” 时,则会返回一个退出状态码 “0” (在 if 结构体表示为 $?),由此确认某个服务正在运行中。

如果退出状态码是非零值 (即 systemctl status $service 命令中的回显中没有出现 “running”),则表明某个服务未运行。

Services Monitoring Script

服务监控脚本

我们可以增加一步,在开始循环之前,先确认 myservices.txt 是否存在。

#!/bin/bash

# This script iterates over a list of services and
# is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
        for service in $(cat myservices.txt); do
                systemctl status $service | grep --quiet "running"
                if [ $? -eq 0 ]; then
                        echo $service "is [ACTIVE]"
                else
                        echo $service "is [INACTIVE or NOT INSTALLED]"
                fi
        done
else
        echo "myservices.txt is missing"
fi

Ping 一系列网络或者 Internet 主机名以获取应答数据

你可能想把自己维护的主机写入一个文本文件,并使用脚本探测它们是否能够 ping 得通 (脚本中的 myhosts 可以随意替换为你想要的名称)。

shell 的内置 read 命令将告诉 while 循环一行行的读取 myhosts,并将读取的每行内容传给 host 变量,随后 host 变量传递给 ping 命令。

#!/bin/bash

# This script is used to demonstrate the use of a while loop

while read host; do
        ping -c 2 $host
done < myhosts

Script to Ping Servers

使用脚本 Ping 服务器

扩展阅读:

文件系统排错

尽管 Linux 是一个很稳定的操作系统,但仍然会因为某些原因出现崩溃时 (比如因为断电等),正好你有一个 (或者更多个) 文件系统未能正确卸载,Linux 重启的时候就会自动检测其中可能发生的错误。

此外,每次系统正常启动的时候,都会在文件系统挂载之前校验它们的完整度。而这些全部都依赖于 fsck 工具 ( 文件系统校验 file system check )。

如果对 fsck 进行设定,它除了校验文件系统的完整性之外,还可以尝试修复错误。fsck 能否成功修复错误,取决于文件系统的损伤程度;如果可以修复,被损坏部分的文件会恢复到位于每个文件系统根目录的 lost+found。

最后但同样重要的是,我们必须注意,如果拔掉系统正在写入数据的 USB 设备同样会发生错误,甚至可能发生硬件损坏。

fsck 的基本用如下:

# fsck [options] filesystem

检查文件系统错误并尝试自动修复

想要使用 fsck 检查文件系统,我们需要首先卸载文件系统。

# mount | grep sdg1
# umount /mnt
# fsck -y /dev/sdg1

Scan Linux Filesystem for Errors

检查文件系统错误

除了 -y 选项,我们也可以使用 -a 选项来自动修复文件系统错误,而不必做出交互式应答,并在文件系统看起来 “干净” 卸载的情况下强制校验。

# fsck -af /dev/sdg1

如果只是要找出什么地方发生了错误 (不用在检测到错误的时候修复),我们可以使用 -n 选项,这样只会将文件系统错误输出到标准输出设备上。

# fsck -n /dev/sdg1

根据 fsck 输出的错误信息,我们可以知道是否可以自己修复或者需要将问题提交给工程师团队来做详细的硬件校验。

总结

至此,系列教程的第十讲就全部结束了,全系列教程涵盖了通过 LFCS 测试所需的基础内容。

但显而易见的,本系列的十讲并不足以在单个主题方面做到全面描述,我们希望这一系列教程可以成为你学习的基础素材,并一直保持学习的热情(LCTT 译注:还有后继补充的几篇)。

我们欢迎你提出任何问题或者建议,所以你可以毫不犹豫的通过以下链接联系到我们: 成为一个 Linux 认证系统工程师


via: http://www.tecmint.com/linux-basic-shell-scripting-and-linux-filesystem-troubleshooting/

作者:Gabriel Cánepa 译者:GHLandy 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

去年八月, Linux基金会宣布了一个全新的LFCS( Linux基金会认证系统管理员 Linux Foundation Certified Sysadmin )认证计划,这对广大系统管理员来说是一个很好的机会,管理员们可以通过认证考试来表明自己可以成功支持Linux系统的整体运营。 一个Linux基金会认证的系统管理员能有足够的专业知识来确保系统高效运行,提供第一手的故障诊断和监视,并且在需要的情况下将问题提交给工程师支持团队。

Linux Package Management

Linux基金会认证系统管理员 – 第九讲

请观看下面关于Linux基金会认证计划的演示。

本文是本系列教程中的第九讲,今天在这篇文章中我们会引导你学习Linux软件包管理,这也是LFCS认证考试所需要的。

软件包管理

简单的说,软件包管理是系统中安装和维护软件的一种方法,这里说的维护包含更新和卸载。

在Linux早期,程序只以源代码的方式发行,还带有所需的用户使用手册和必备的配置文件,甚至更多。现如今,大多数发行商一般使用预装程序或者被称为软件包的程序集合。用户可以使用这些预装程序或者软件包安装到该发行版中。然而,Linux最伟大的一点是我们仍然能够获得程序的源代码用来学习、改进和编译。

软件包管理系统是如何工作的

如果某一个软件包需要一定的资源,如共享库,或者需要另一个软件包,这就称之为依赖性。所有现在的包管理系统提供了一些解决依赖性的方法,以确保当安装一个软件包时,相关的依赖包也安装好了。

打包系统

几乎所有安装在现代Linux系统上的软件都会能互联网上找到。它要么由发行商通过中央仓库(中央仓库能包含几千个软件包,每个软件包都已经为发行版构建、测试并且维护好了)提供,要么能够直接得到可以下载和手动安装的源代码。

由于不同的发行版使用不同的打包系统(Debian的*.deb文件/CentOS的*.rpm文件/openSUSE的专门为openSUSE构建的*.rpm文件),因此为一个发行版开发的软件包会与其他发行版不兼容。然而,大多数发行版都属于LFCS认证所涉及的三个发行版家族之一。

高级和低级打包工具

为了有效地进行软件包管理的任务,你需要知道,有两种类型的实用工具:低级工具(能在后端实际安装、升级、卸载软件包文件),以及高级工具(负责确保能很好的执行依赖性解决和元数据检索的任务——元数据也称为数据的数据)。

发行版低级工具高级工具
Debian版及其衍生版dpkgapt-get / aptitude
CentOS版rpmyum
openSUSE版rpmzypper

让我们来看下低级工具和高级工具的描述。

dpkg的是基于Debian的系统的一个低级包管理器。它可以安装,删除,提供有关资料,以及建立*.deb包,但它不能自动下载并安装它们相应的依赖包。

apt-get是Debian及其衍生版的高级包管理器,并提供命令行方式来从多个来源检索和安装软件包,其中包括解决依赖性。和dpkg不同的是,apt-get不是直接基于.deb文件工作,而是基于软件包的正确名称。

Aptitude是基于Debian的系统的另一个高级包管理器,它可用于快速简便的执行管理任务(安装,升级和删除软件包,还可以自动处理解决依赖性)。它在atp-get的基础上提供了更多功能,例如提供对软件包的几个版本的访问。

rpm是Linux标准基础(LSB)兼容发行版所使用的一种软件包管理器,用来对软件包进行低级处理。就像dpkg一样,rpm可以查询、安装、检验、升级和卸载软件包,它多数用于基于Fedora的系统,比如RHEL和CentOS。

相对于基于RPM的系统,yum增加了系统自动更新的功能和带依赖性管理的软件包管理功能。作为一个高级工具,和apt-get或者aptitude相似,yum需要配合仓库工作。

低级工具的常见用法

使用低级工具处理最常见的任务如下。

1. 从已编译(*.deb或*.rpm)的文件安装一个软件包

这种安装方法的缺点是没有提供解决依赖性的方案。当你在发行版本库中无法获得某个软件包并且又不能通过高级工具下载安装时,你很可能会从一个已编译文件安装该软件包。因为低级工具不会解决依赖性问题,所以当安装一个没有解决依赖性的软件包时会出现出错并且退出。

# dpkg -i file.deb      [Debian版和衍生版]
# rpm -i file.rpm       [CentOS版 / openSUSE版]

注意:不要试图在CentOS中安装一个为openSUSE构建的.rpm文件,反之亦然!

2. 从已编译文件中更新一个软件包

同样,当某个安装的软件包不在中央仓库中时,你只能手动升级该软件包。

# dpkg -i file.deb      [Debian版和衍生版]
# rpm -U file.rpm       [CentOS版 / openSUSE版]

3. 列举安装的软件包

当你第一次接触一个已经在工作中的系统时,很可能你会想知道安装了哪些软件包。

# dpkg -l       [Debian版和衍生版]
# rpm -qa       [CentOS版 / openSUSE版]

如果你想知道一个特定的软件包安装在哪儿,你可以使用管道命令从以上命令的输出中去搜索,这在这个系列的第一讲 操作Linux文件 中有介绍。例如我们需要验证mysql-common这个软件包是否安装在Ubuntu系统中:

# dpkg -l | grep mysql-common

Check Installed Packages in Linux

检查安装的软件包

另外一种方式来判断一个软件包是否已安装。

# dpkg --status package_name        [Debian版和衍生版]
# rpm -q package_name           [CentOS版 / openSUSE版]

例如,让我们找出sysdig软件包是否安装在我们的系统。

# rpm -qa | grep sysdig

Check sysdig Package

检查sysdig软件包

4. 查询一个文件是由哪个软件包安装的

# dpkg --search file_name
# rpm -qf file_name

例如,pw\_dict.hwm文件是由那个软件包安装的?

# rpm -qf /usr/share/cracklib/pw_dict.hwm

Query File in Linux

Linux中查询文件

高级工具的常见用法

使用高级工具处理最常见的任务如下。

1. 搜索软件包

aptitude的更新操作将会更新可用的软件包列表,而aptitude的搜索操作会根据软件包名进行实际搜索。

# aptitude update && aptitude search package_name

在search all选项中,yum不仅可以通过软件包名还可以通过软件包的描述搜索。

# yum search package_name
# yum search all package_name
# yum whatprovides “*/package_name”

假定我们需要一个名为sysdig文件,想知道我们需要安装哪个软件包才行,那么运行。

# yum whatprovides “*/sysdig”

Check Package Description in Linux

检查软件包描述

whatprovides告诉yum搜索一个含有能够匹配上述正则表达式的文件的软件包。

# zypper refresh && zypper search package_name      [在openSUSE上]

2. 从仓库安装一个软件包

当安装一个软件包时,在软件包管理器解决了所有依赖性问题后,可能会提醒你确认安装。需要注意的是运行更新( update)或刷新(refresh)(根据所使用的软件包管理器)不是绝对必要,但是考虑到安全性和依赖性的原因,保持安装的软件包是最新的是系统管理员的一个好经验。

# aptitude update && aptitude install package_name      [Debian版和衍生版]
# yum update && yum install package_name            [CentOS版]
# zypper refresh && zypper install package_name         [openSUSE版]

3. 卸载软件包

remove选项将会卸载软件包,但把配置文件保留完好,然而purge选项将从系统中完全删去该程序以及相关内容。

# aptitude remove / purge package_name
# yum erase package_name

###---注意要卸载的openSUSE包前面的减号 ---

# zypper remove -package_name

在默认情况下,大部分(如果不是全部的话)的软件包管理器会提示你,在你实际卸载之前你是否确定要继续卸载。所以,请仔细阅读屏幕上的信息,以避免陷入不必要的麻烦!

4. 显示软件包的信息

下面的命令将会显示birthday这个软件包的信息。

# aptitude show birthday
# yum info birthday
# zypper info birthday

Check Package Information in Linux

检查包信息

总结

作为一个系统管理员,软件包管理器是你不能回避的东西。你应该立即去使用本文中介绍的这些工具。希望你在准备LFCS考试和日常工作中会觉得这些工具好用。欢迎在下面留下您的意见或问题,我们将尽可能快的回复你。


via: http://www.tecmint.com/linux-package-management/

作者:Gabriel Cánepa 译者:Flowsnow 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出