分类 技术 下的文章

建立一个支持学习和实验新软件的环境。

能够构建和拆解公有云环境是非常有用的,但我们大多数人都不能轻松访问公有云。退而求其次的最好办法就是在本地机器上建立一个实验室,但即使在本地机器上运行也会带来性能、灵活性和其他挑战。大多数时候,本地机器上额外的工作负载会干扰我们日常的工作,它们当然也会影响你提供一个现成的环境来玩耍和实验新软件。

几年前,当我和我的团队开始学习 Ansible 时,我们就遇到了这个挑战。我们找不到一个可以单独使用的环境,我们对这种情况的失望导致我们中的一些人停止了实验。我们知道需要找到一个解决方案。

我们花了很多时间研究各种方案,得出了一套工具,使我们的好奇心能够在我们完全控制的环境中学习。我们可以在本地机器上轮换和拆解实验室环境,而不需要访问内部实验室或公共云。

本文将解释如何在 20 分钟内以完全自动化的方式在本地机器上部署自己的实验室环境。

你可以在我的 GitHub 仓库中找到这个练习的所有代码。

工具和软件

本方案使用以下工具和软件:

  • Ansible 是我们选择的自动化工具,因为它易于使用,而且足够灵活,可以满足实验室的要求。
  • Vagrant 易于使用,用于构建和维护虚拟机。
  • VirtualBox 是一个托管管理程序,可以在 Windows 和 Linux 环境中使用。
  • Fedora v30+ 是我本地机器上的操作系统。

你必须进行以下设置才能建立环境:

  • 一个互联网连接
  • 在 BIOS 中启用虚拟化技术支持(以下是在我的联想笔记本上的过程
  • Vagrant v2.2.9
  • 最新版本的 Ansible
  • 最新版本的 VirtualBox
  • Fedora v30+ 宿主机操作系统

这个实验室环境有什么?

这个项目旨在部署一个带有 Ansible 引擎和多个 Linux 节点的 Ansible 主机,以及一些预加载和预配置的应用程序(httpd 和 MySQL)。它还启用了 Cockpit,这样你就可以在测试过程中监控虚拟机(VM)的状态。使用预部署的应用程序的原因是为了提高效率(所以你不必花时间安装这些组件)。这样你就可以专注于创建角色和剧本,并针对上述工具部署的环境进行测试。

我们确定,对于我们的用例来说,最好的方案是多机 Vagrant 环境。Vagrant 文件创建了三个 CentOS 虚拟机,以模拟两个目标主机和一个 Ansible 控制机。

  • Host1: 没有图形用户界面(GUI),安装 httpd 和 MySQL
  • Host2: 没有 GUI,安装了 httpd 和 MySQL
  • Ansible-host:没有 GUI,安装了 Ansible 引擎

启用多个管理程序

如果使用了多个管理程序,一些管理程序可能不允许你拉起虚拟机。要解决这个问题,请遵循以下步骤(基于 Vagrant 的安装说明)。

首先,找出管理程序的名称:

$ lsmod | grep kvm
kvm_intel             204800  6
kvm                   593920  1 kvm_intel
irqbypass              16384  1 kvm

我感兴趣的是 kvm_intel,但你可能需要另一个(比如 kvm_amd)。

以 root 身份运行以下内容,将该管理程序列入黑名单:

$ echo 'blacklist kvm-intel' >> /etc/modprobe.d/blacklist.conf

重新启动你的机器并尝试再次运行 Vagrant。

Vagrant 文件

cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
# Define VMs with static private IP addresses, vcpu, memory and vagrant-box.
  boxes = [
    {
      :name => "web1.demo.com", ⇒ Host1 this is one of the target nodes
      :box => "centos/8",             ⇒ OS version
      :ram => 1024,                   ⇒ Allocated memory
      :vcpu => 1,               ⇒  Allocated CPU
      :ip => "192.168.29.2"     ⇒ Allocated IP address of the node
    },
    {
      :name => "web2.demo.com", ⇒ Host2 this is one of the target nodes
      :box => "centos/8",
      :ram => 1024,
      :vcpu => 1,
      :ip => "192.168.29.3"
    },
    {
      :name => "ansible-host", ⇒ Ansible Host with Ansible Engine
      :box => "centos/8",
      :ram => 8048,
      :vcpu => 1,
      :ip => "192.168.29.4"
    }
  ]

  # Provision each of the VMs.
  boxes.each do |opts|
    config.vm.define opts[:name] do |config|
#   Only Enable this if you are connecting to Proxy server
#      config.proxy.http    = "http://usernam:[email protected]:80"⇒ Needed if you have a proxy
#      config.proxy.https   = "http://usernam:[email protected]:80"
#      config.proxy.no_proxy = "localhost,127.0.0.1"
      config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", disabled: true
      config.ssh.insert_key = false
      config.vm.box = opts[:box]
      config.vm.hostname = opts[:name]
      config.vm.provider :virtualbox do |v| ⇒  Defines the vagrant provider
        v.memory = opts[:ram]
        v.cpus = opts[:vcpu]
      end
      config.vm.network :private_network, ip: opts[:ip]
      config.vm.provision :file do |file|
         file.source     = './keys/vagrant' ⇒ vagrant keys to allow access to the nodes
         file.destination    = '/tmp/vagrant' ⇒ the location to copy the vagrant key
      end
      config.vm.provision :shell, path: "bootstrap-node.sh" ⇒ script that copy hosts entry
      config.vm.provision :ansible do |ansible| ⇒ declaration to run ansible playbook
        ansible.verbose = "v"
        ansible.playbook = "playbook.yml" ⇒ the playbook used to configure the hosts
      end
        end
  end
end

这些是你需要注意的重要文件。

  • inventory-test.yaml:连接到节点的清单文件
  • playbook.yaml:Vagrant 供应者调用的用于配置节点的剧本文件
  • `Vagrantfile':Vagrant 用来部署环境的文件
  • Vagrant 密钥文件:连接实验室环境中各节点的 Vagrant 密钥

你可以根据你的需要调整这些文件。Ansible 的灵活性使你有能力根据你的需要声明性地改变你的环境。

部署你的实验室环境

首先,克隆这个 GitHub 仓库 中的代码:

$ git clone https://github.com/mikecali/ansible-labs-101.git
Cloning into 'ansible-labs-101'...
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 15 (delta 2), reused 10 (delta 0), pack-reused 0
Unpacking objects: 100% (15/15), 6.82 KiB | 634.00 KiB/s, done.

接下来,将你的目录改为 vagrant-session-2,并查看其内容:

$ ls
Bootstrap-node.sh   inventory   keys   playbook.yml   README.md Vagrantfile

现在你已经拥有了实验室环境所需的所有工件和配置文件。要部署环境,请运行:

$ vagrant up

只要有一个像样的网络连接,只需要 20 分钟左右就可以得到一个运行环境:

$ vagrant up
Bringing machine 'web1.demo.com' up with 'virtualbox' provider...
Bringing machine 'web2.demo.com' up with 'virtualbox' provider...
Bringing machine 'ansible-host' up with 'virtualbox' provider...
==> web1.demo.com: Importing base box 'centos/8'...
==> web1.demo.com: Matching MAC address for NAT networking...
==> web1.demo.com: Checking if box 'centos/8' version '1905.1' is up to date...
==> web1.demo.com: Setting the name of the VM: ansible-labs_web1democom_1606434176593_70913
==> web1.demo.com: Clearing any previously set network interfaces...
==> web1.demo.com: Preparing network interfaces based on configuration...
    web1.demo.com: Adapter 1: nat
    web1.demo.com: Adapter 2: hostonly
==> web1.demo.com: Forwarding ports...
    web1.demo.com: 22 (guest) => 2222 (host) (adapter 1)
==> web1.demo.com: Running 'pre-boot' VM customizations...
==> web1.demo.com: Booting VM...
==> web1.demo.com: Waiting for machine to boot. This may take a few minutes...
    web1.demo.com: SSH address: 127.0.0.1:2222
    web1.demo.com: SSH username: vagrant
    web1.demo.com: SSH auth method: private key
[...]

一旦该剧本执行完成,你会看到这样的输出:

PLAY RECAP *********************************
Ansible-host     : ok=20 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=3

Real 18m14.288s
User 2m26.978s
Sys 0m26.849s

确认所有虚拟机都在运行:

$ vagrant status
Current machine states:

Web1.demo.com    running (virtualbox)
Web2.demo.com    running (virtualbox)
ansible-host     running (virtualbox)
[...]

你可以通过登录其中一个虚拟机进一步调查。访问 ansible-host

> vagrant ssh ansible-host
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Thu Nov 26 12:21:23 2020 from 10.0.2.2
[vagrant@ansible-host ~] uptime
16:46:42 up 1:24, 1 user, load average: 0.00, 0.01, 0.04

最后,你可以使用 Ansible 模块来 ping 你创建的其他节点:

[vagrant@ansible-host]$ ansible -i inventory-test.yaml \
webservers -m ping -u vagrant
192.168.29.2 | SUCCESS => {
  "Ansible-facts": {
      "Discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "Changed": false;
    "Ping": "pong"
}
[...]

清理

运行如下命令来清理环境:

$ vagrant destroy [vagrant machine name]

你的输出会像这样:

 title=

有创意的学习

在自己的实验室里利用自己的时间学习 Ansible 这样的软件是一个好习惯,但由于受到无法控制的限制,可能会很困难。

有时候,你需要发挥创意,找到另一种方法。在开源社区中,你可以选择很多方案;我们选择这些工具的主要原因之一是,它们是许多人常用和熟悉的。

另外,请注意,这些剧本并没有按照我的要求进行优化。请随时改进它们,并在评论中分享你的工作。


via: https://opensource.com/article/20/12/ansible-lab

作者:Mike Calizo 选题:lujun9972 译者:wxy 校对:wxy

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

中断是计算机处理数据的关键部分。

中断是现代 CPU 工作方式中重要的部分。例如:当你每次在键盘上按下一个按键后,CPU 会被中断以使得 PC 读取用户键盘的输入。这个过程发生得相当快,以致于在使用体验上你不会感到任何变化或损害。

此外,键盘并不是导致中断的唯一组件。一般来说,有三种类型的事件会导致 CPU 发生中断:硬件中断、软件中断和异常。在具体介绍不同类型的中断前,我需要先定义一些术语。

定义

中断请求 interrupt request (IRQ)是由 可编程的中断控制器 programmable interrupt controlle (PIC)发起的,其目的是为了中断 CPU 和执行 中断服务程序 interrupt service routine (ISR)。中断服务程序(ISR)是一个小的程序,用来处理具体的数据,其具体的处理方式依赖于造成中断请求(IRQ)的原因。之前正在运行的进程在中断服务程序(ISR)运行结束前都会被中断。

在过去,中断请求由单独的芯片处理(中断控制器芯片 PIC),I/O 设备直接与中断控制器(PIC)相连。中断控制器(PIC)管理着多种硬件的中断请求(IRQ),并且可以直接与 CPU 通信。当一个中断请求(IRQ)产生后,中断控制器(PIC)向 CPU 写入数据,并且触发中断请求引脚(INTR)。

现如今,中断请求(IRQ)由 CPU 中的 高级可编程中断控制器 advanced programmable interrupt controller (APIC)部分来处理。每个核中都拥有属于自己的高级可编程中断控制器。

中断的类型

正如我前文中提到的,中断可以根据其来源分为三种类型。

硬件中断

当一个硬件设备想要告诉 CPU 某一需要处理的数据已经准备好后(例如:当键盘被按下或者一个数据包到了网络接口处),它将会发送一个中断请求(IRQ)来告诉 CPU 数据是可用的。接下来会调用在内核启动时设备驱动注册的对应的中断服务程序(ISR)。

软件中断

当你在播放一个视频时,音频和视频是同步播放是相当重要的,这样音乐的速度才不会变化。这是由软件中断实现的,由精确的计时器系统(称为 jiffies)重复发起的。这个计时器会使得你的音乐播放器同步。软件中断也可以被特殊的指令所调用,来读取或写入数据到硬件设备。

当系统需要实时性时(例如在工业应用中),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:面向嵌入式开发者的实时 Linux 介绍

异常

异常 exception 是你可能之前就知道的中断类型。当 CPU 执行一些将会导致除零或缺页错误的指令时,任何其他运行中的程序都会被中断。在这种情况下,你会被一个弹窗提醒,或在控制台输出中看到** 段错误 segmentation fault 核心已转储 core dumped )**。但并不是所有异常都是由指令错误引起的。

异常可以进一步分为 错误 Fault 陷阱 Trap 终止 Abort

  • 错误:错误是系统可以纠正的异常。例如当一个进程尝试访问某个已经被换出到硬盘的页时。当请求的地址在进程的地址空间中,并且满足访问权限时,如果页不在内存(RAM)中,将会产生一个中断请求(IRQ),并开始启用缺页异常处理程序把所需的页加载到内存中。如果操作成功执行,程序将继续运行。
  • 陷阱:陷阱主要用在调试中。如果你在某个程序中设置了一个断点,你就插入了一条可以触发陷阱执行的特殊指令。陷阱可以触发上下文切换来允许你的调试器读取和展示局部变量的值。之后程序可以继续运行。陷阱同样也是运行系统调用的方式(如杀死一个进程)
  • 终止:终止是由系统表中的硬件错误或值不一致而导致的。终止不会报告造成异常的指令的所在位置。这是最严重的中断,终止将会调用系统的终止异常处理程序来结束造成异常的进程。

动手实践

中断请求按照高级可编程中断控制器(APIC)中的优先级高低排序(0是最高优先级)。前 32 个中断(0~31)是由 CPU 指定的固定序列。你可以在 OsDev 异常 页面找到关于它们的概述。随后的中断请求可以以不同的方式进行分配。 中断描述表 interrupt descriptor table (IDT)中记录了中断请求(IRQ)和中断服务程序(ISR)的对应关系。Linux 中定义了从 0 到 256 的 IRQ 向量。

为了打印出在你的系统中已注册的中断,打开一个终端并输入:

cat /proc/interrupts

你应该会看到类似如下图的结果:

 title=

内核版本为5.6.6中注册的中断 (Stephan Avenwedde, CC BY-SA 4.0)

从左到右各列的含义依次为:中断向量号、每个 CPU(0~n)中断发生次数、硬件来源、硬件源通道信息、以及造成中断请求的设备名。

在表的末尾,有一些非数字的中断。它们是特定于体系结构的中断,如 本地计时器中断 local timer interrupt (LOC)的中断请求(IRQ)号为 236。其中一些在 Linux 内核源树中的Linux IRQ 向量布局中指定。

 title=

特定于体系结构的中断 (Stephan Avenwedde, CC BY-SA 4.0)

如果要实时获取该表,请运行如下命令:

watch -n1 "cat /proc/interrupts"

总结

正确的中断请求(IRQ)处理对于硬件、驱动和软件的正常交互是必要的。幸运地是,Linux 内核很好地完成了它,一个 PC 的普通用户几乎不会注意到内核的整个中断处理过程。

中断相当复杂,本文仅仅是一个关于中断的概述。如果想要深入了解该主题可以阅读 Linux Inside 电子书(CC BY-NC-SA 4.0)和 Linux 内核教程 仓库。


via: https://opensource.com/article/20/10/linux-kernel-interrupts

作者:Stephan Avenwedde 选题:lujun9972 译者:萌新阿岩 校对:wxy

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

编程一个简单的游戏是练习一门新语言并与其他你掌握的语言进行比较的好方法。

学习一门新的编程语言是很有趣的。每当我尝试学习一门新的语言时,我都会专注于定义变量、编写语句和评估表达式。一旦我对这些概念有了大致的了解,我通常可以自己弄清楚其余的概念。大多数编程语言都有一些相似之处,所以一旦你了解了一种编程语言,学习下一种编程语言就是要弄清楚其独特的细节,认识到其中的差异。

为了帮助我练习一种新的编程语言,我喜欢写一些测试程序。我经常写的一个示例程序是一个简单的“猜数字”程序,电脑在 1 到 100 之间选一个数字,让我猜这个数字。程序会一直循环,直到我猜对为止。

“猜数字”程序锻炼了编程语言中的几个概念:如何给变量赋值,如何写语句,如何进行条件判断和循环。对于学习一门新的编程语言来说,这是一个很好的实践实验。

用 Bash 猜数字

Bash) 是大多数 Linux 系统的标准 shell。除了提供丰富的命令行用户界面外,Bash 还以脚本的形式支持完整的编程语言。

如果你对 Bash 不熟悉,我推荐你看这些介绍:

你可以通过编写一个 Bash 版本的“猜数字”游戏来探索它。这是我的实现:

#!/bin/bash

number=$(( $RANDOM % 100 + 1 ))

echo "Guess a number between 1 and 100"

guess=0

while [ "0$guess" -ne $number ] ; do
        read guess
        [ "0$guess" -lt $number ] && echo "Too low"
        [ "0$guess" -gt $number ] && echo "Too high"
done

echo "That's right!"
exit 0

拆解这个脚本

脚本中的第一行,#!/bin/bash 告诉 Linux 使用 Bash shell 来运行这个脚本。每个脚本都以 #! 字符对(LCTT 译注:释伴)开始,这表示它是一个 shell 脚本。紧跟在#! 后面的是要运行的 shell。在本例中,/bin/bash 是指 Bash shell。

要给一个变量赋值,在变量名后面列出 = 号。例如,语句 guess=0guess 变量分配一个零值。

你也可以使用 read 语句提示用户输入一个值。如果你写了 read guess 语句,Bash 会等待用户输入一些文本,然后把这个值存储在 guess 变量中。

要引用一个变量的值,在变量名前使用 $。所以, 在 guess 变量中存储了一个值后, 你可以使用 $guess 来检索它。

你可以使用任何你喜欢的变量名称,但是 Bash 为自己保留了一些特殊的变量名称。一个特殊的变量是 RANDOM,每次引用它都会产生一个很大的随机数。

如果你想在存储一个值的同时执行一个操作,你需要用特殊的括号把语句括起来。这将告诉 Bash 先执行该语句,而 = 则将结果值存储在变量中。要评估一个数学表达式,使用 $(()) 围在你的语句上。双括号表示一个算术表达式。在我的例子中,number=$(( $RANDOM % 100 + 1 )) 评估表达式 $RANDOM % 100 + 1,然后将值存储在 number 变量中。

标准的算术运算符,如 +(加)、-(减)、*(乘)、/(除)和 %(模)都适用。

这意味着语句 number=$(( $RANDOM % 100 + 1 )) 产生一个 1 到 100 之间的随机数。模数运算符(%)返回两个数相除后的余数。在这种情况下,Bash 将一个随机数除以 100,剩下的余数范围是 0 到 99,通过在这个值上加 1,你可以得到一个介于 1 和 100 之间的随机数。

Bash 支持像循环这样的条件表达式流程控制。在“猜数字”的游戏中,只要 guess 中的值不等于 number,Bash 就会继续循环。如果猜的数小于随机数,Bash 就会打印“太低”,如果猜的数大于数字,Bash 就会打印“太高”。

它是如何工作的

现在你已经写好了你的 Bash 脚本,你可以运行它来玩“猜数字”游戏。一直猜,直到你找到正确的数字:

Guess a number between 1 and 100
50
Too high
30
Too high
20
Too high
10
Too low
15
Too high
13
Too low
14
That's right!

每次运行这个脚本,Bash 都会随机选择一个不同的数字。

这个“猜数字”游戏是学习新的编程语言时的一个很好的入门程序,因为它以一种很直接的方式锻炼了几个常见的编程概念。通过在不同的编程语言中实现这个简单的游戏,你可以展示一些核心概念,并比较每种语言的细节。

你有喜欢的编程语言吗?你会如何用它来写“猜数字”游戏呢?请关注本系列文章,看看你可能感兴趣的其他编程语言的例子。


via: https://opensource.com/article/20/12/learn-bash

作者:Jim Hall 选题:lujun9972 译者:wxy 校对:wxy

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

在将新配置的服务器投入工作之前,请确保你知道你正在使用什么。

当我在 Linux 上测试软件时(这是我工作中的一个常规部分),我需要使用多台运行 Linux 的不同架构的服务器。我整备机器,安装所需的软件包,运行我的测试,收集结果,并将机器返回到仓库中,以便其他人可以使用它进行测试。

由于我经常这样做(甚至一天多次),我初次登录 Linux 服务器的前 10 分钟内的工作已经成为每天的仪式。当我初次登录 Linux 服务器时,我会使用命令来收集我需要的信息来寻找某些东西。我将在本文中介绍我的过程,但请注意,在大多数情况下,我只给出命令名称,所以你需要确定这些命令的具体选项,以获得你需要的信息。阅读命令的手册页是一个很好的起点。

1、第一次接触

当我登录到一台服务器时,我做的第一件事就是检查它是否拥有我将要运行的测试所需的操作系统、内核和硬件架构。我经常会检查一台服务器已经运行了多久。虽然这对测试系统来说并不重要,因为它会被多次重启,但我还是发现这些信息很有帮助。

使用下面的命令来获取这些信息。我主要使用 Red Hat Linux 进行测试,所以如果你使用其他 Linux 发行版,请在文件名中使用 *-release 而不是 redhat-release

cat /etc/redhat-release
uname -a
hostnamectl
uptime

2、有人登录在上面吗?

一旦我知道这台机器符合我的测试需求,我需要确保没有其他人同时登录该系统运行他们自己的测试。虽然考虑到整备系统会帮我处理好这个问题,这种可能性很小,但偶尔检查一下还是有好处的 —— 尤其是当我第一次登录服务器的时候。我还会检查是否有其他用户(除了 root)可以访问系统。

使用下面的命令来查找这些信息。最后一条命令是查找 /etc/passwd 文件中具有 shell 访问权限的用户;它会跳过文件中没有 shell 访问权限或 shell 设置为 nologin 的其他服务:

who
who -Hu
grep sh$ /etc/passwd

3、物理机还是虚拟机

现在我有了属于自己的机器,我需要确定它是一台物理机还是一台虚拟机(VM)。如果是我自己整备的这台机器,我可以确定这是我要求的东西。但是,如果你使用的是一台不是你自己整备的机器,你应该检查该机器是物理机还是虚拟机。

使用以下命令来识别这些信息。如果是物理系统,你会看到供应商的名称(如 HP、IBM 等)以及服务器的品牌和型号;而在虚拟机中,你应该看到 KVM、VirtualBox 等,这取决于创建虚拟机时使用了什么虚拟化软件:

dmidecode -s system-manufacturer
dmidecode -s system-product-name
lshw -c system | grep product | head -1
cat /sys/class/dmi/id/product_name
cat /sys/class/dmi/id/sys_vendor

4、硬件

因为我经常测试连接到 Linux 机器的硬件,所以我通常使用物理服务器,而不是虚拟机。在物理机器上,我的下一步是确定服务器的硬件能力 —— 例如,运行的是什么类型的 CPU,它有多少个核心,启用了哪些标志,以及有多少内存可用于运行测试。如果我正在运行网络测试,我会检查连接到服务器的以太网或其他网络设备的类型和容量。

使用以下命令来显示连接到 Linux 服务器的硬件。其中一些命令在新的操作系统版本中可能会被废弃,但你仍然可以从 yum 存储库中安装它们或切换到它们的等效新命令:

lscpu or cat /proc/cpuinfo
lsmem or cat /proc/meminfo
ifconfig -a
ethtool <devname>
lshw
lspci
dmidecode

5、已安装的软件

测试软件总是需要安装额外的依赖包、库等。然而,在安装任何东西之前,我都会检查已经安装了什么(包括是什么版本),以及配置了哪些存储库,这样我就知道软件来自哪里,并可以调试任何软件包安装问题。

使用下面的命令来确定安装了什么软件:

rpm -qa
rpm -qa | grep <pkgname>
rpm -qi <pkgname>
yum repolist
yum repoinfo
yum install <pkgname>
ls -l /etc/yum.repos.d/

6、运行的进程和服务

检查了安装的软件之后,自然就会检查系统上有哪些进程在运行。当在系统上运行性能测试时,这一点至关重要 —— 如果一个正在运行的进程、守护进程、测试软件等占用了大部分 CPU/RAM,那么在运行测试之前停止该进程是有意义的。这也可以检查测试所需的进程或守护进程是否已经启动并运行。例如,如果测试需要 httpd 运行,那么即使安装了软件包,启动守护进程的服务也可能没有运行。

使用以下命令来识别系统上正在运行的进程和已启用的服务:

pstree -pa 1
ps -ef
ps auxf
systemctl

7、网络连接

如今的机器网络化程度很高,它们需要与网络上的其他机器或服务进行通信。我会识别服务器上哪些端口是开放的,是否有到测试机器的任何网络连接,是否启用了防火墙,如果启用了,是否屏蔽了任何端口,以及机器与哪些 DNS 服务器对话。

使用以下命令来识别网络服务相关信息。如果一个过时的命令不可用,请从 yum 存储库中安装它或使用等效的新命令:

netstat -tulpn
netstat -anp
lsof -i
ss
iptables -L -n
cat /etc/resolv.conf

8、内核

在进行系统测试时,我发现了解内核相关的信息是很有帮助的,比如内核版本和加载了哪些内核模块。我还会列出任何可调整的内核参数以及它们的设置,并检查启动运行中的内核时使用的选项。

使用以下命令来识别这些信息:

uname -r
cat /proc/cmdline
lsmod
modinfo <module>
sysctl -a
cat /boot/grub2/grub.cfg

9、日志

现在,我已经对服务器有了很好的了解,包括安装了哪些软件,运行了哪些进程。还有一件事我无法逃避,那就是日志文件 —— 我需要知道在哪里可以查看不断更新的信息。

使用以下命令查看系统的日志:

dmesg
tail -f /var/log/messages
journalctl

接下来的步骤

虽然命令和实用程序会发生变化,但它们所显示的基本信息大致不变。在你专注于掌握哪些命令之前,你需要对你要寻找的信息以及它属于什么类别有一个宏观的看法。

由于 Linux 将大部分信息保存在文件中,这些命令基本上是从文件中读取信息,并以一种易于理解的方式呈现出来。下一步的好做法是找出每个命令用来获取信息显示的文件。一个提示:寻找这些信息的方法是 strace 命令。


via: https://opensource.com/article/20/12/linux-server

作者:Gaurav Kamathe 选题:lujun9972 译者:wxy 校对:wxy

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

这篇初学者文章介绍如何在 Fedora 和 Red Hat Linux 上安装 RPM 软件包。它也随后向你展示如何移除这些 RPM 软件包。

当你开始使用 Red Hat 系的 Fedora Linux 时,你早晚会偶然发现 .rpm 文件。就像在 Windows 中的 .exe 文件,以及在 Ubuntu 和 Debian 中的 .deb 文件一样,一个 rpm 文件能够使你在 Fedora 上快速安装一个软件。

你可以从软件中心中找到并安装大量的软件,特别是 如果你在 Fedora 中启用附加的存储库的话。但是有时你会在它们的网站上找到可用的 RPM 格式的软件包。

就像在 Windows 中的 .exe 文件一样,你可以通过 下载 .rpm 文件并双击它来安装。不用担心,我将向你展示详细的步骤。

在 Fedora 和 Red Hat Linux 上安装 RPM 文件

我将向你展示安装 RPM 文件的三个方法:

方法 1: 使用软件中心

在 Fedora 中使用默认的软件中心是最简单的方法。它真地很简单。转到你下载的 .rpm 文件的文件夹位置。它通常在 “Downloads” 文件夹。

只需要 双击 RPM 文件,它将会在软件中心中打开

或者,你可以在 RPM 文件上右键单击并选择通过软件中心来安装它。

或者双击或者右键并选择软件安装

当它在软件中心打开时,你应该会看到“安装”选项。只需要点击“安装”按钮并在提示时输入你的账号密码。

通过 Fedora 软件中心安装 RPM

它很简单,对吗?

方法 2: 使用 DNF 命令来安装 RPM 文件

这是命令行方法。Fedora 使用新的 dnf 软件包管理器 ,你也可以使用它来安装下载的 RPM 文件。

打开一个终端并切换到你下载 RPM 文件的目录下。你也可以通过到 RPM 文件的路径。像这样使用 dnf 命令:

sudo dnf install rpm_file_name

这是一个我 在 Fedora 上使用 dnf 命令安装 Google Chrome 屏幕截图:

使用 DNF 命令安装 RPM 文件

方法 3: 在 Red Hat 中使用 Yum 命令安装 RPM 文件

不像 Fedora ,Red Hat 仍然使用很好的旧式的 Yum 软件包管理器。在这里你还不能找到 dnf 命令。

这个过程与 dnf 命令相同。转到 RPM 文件所在的目录或提供它的路径。

sudo yum install path_to_RPM_file

就是这样。没有一点异常花哨的东西。

如何移除 RPM 软件包

移除一个 RPM 软件包也不是一个什么大的问题。并且,你不需要原始的用来安装程序的 rpm 文件。

你可以在软件中心中找到已安装的软件包,并从其中移除应用程序。

移除 RPM 软件包

或者,你可以使用带有 remove 选项的 dnfyum 命令。

使用 dnf ,使用这个命令:

sudo dnf remove rpm_package_name

使用 yum ,使用这个命令:

sudo yum remove rpm_package_name

你可能不记得准确的软件包名称,没有关系。你可以做的是输入软件包的前几个字母,然后敲击 tab 按键。这是假设你已经启用 tab 按键补全,通常是这样的。

这就是你需要做的全部。相当简单,对吧?作为一个初学者,你可能会为这样一个简单的任务而挣扎,我希望像这样的快速教程会让你对 Fedora 更自信一些。


via: https://itsfoss.com/install-rpm-files-fedora/

作者:Abhishek Prakash 选题:lujun9972 译者:robsean 校对:wxy

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

这篇初学者文章解释了如何在 Ubuntu 中安装 deb 软件包。它稍后也向你展示如何移除这些 deb 软件包。

这是 Ubuntu 初学者系列的另一篇文章。如果你对 Ubuntu 很陌生,你可能会想知道 如何安装应用程序

最简单的方法是使用 Ubuntu 软件中心。在软件中心中搜索应用程序的名称并安装它。如果你能在软件中心中找到所有的应用程序,那么生活就太惬意了。但是,不幸的是,这是不可能的发生的。

一些软件包可以通过 DEB 软件包的形式获得。它们是以 .deb 扩展名为结尾的存档文件。你可以把 .deb 文件看作为 Windows 中的 .exe 文件。在 Windows 中,你双击 .exe 文件,它将开始安装过程。DEB 软件包也是非常类似的。

你可以从软件提供商网站的下载区域找到这些 DEB 软件包。例如,如果你想 在 Ubuntu 上安装 Google Chrome ,你可以从它的网站下载 Chrome 的 DEB 软件包。

现在问题产生了,你将如何安装 deb 文件呢?在 Ubuntu 中有多种安装 DEB 软件包的方法。在这篇教程中,我将向你依次地展示它们。

在 Ubuntu 中安装 deb 文件

在 Ubuntu 和基于 Debian 的 Linux 发行版中安装 .deb 文件

你可以选择一个 GUI 工具或一个命令行工具来安装一个 deb 软件包。你拥有选择权。

让我们继续看看如何安装 deb 文件。

方法 1: 使用默认的软件中心

在 Ubuntu 中,最简单的方法是使用默认的软件中心。在这里你不必要做任何特别的事。只需要转到你所下载的 .deb 文件的文件夹下(它应该是 Downloads 文件夹),并在这个文件上双击。

在 Ubuntu 上的 Google Chrome 的 deb 文件

在已下载的 .deb 文件上双击以开始安装。

它将打开软件中心,并且你将看到安装软件时的选项。你所需要做的全部工作就是:点击安装按钮并输入你的登录密码。

在 Ubuntu 软件中心中安装 Google Chrome

.deb 文件的安装将通过软件中心来执行。

看,它甚至比在 Windows 中安装一个 .exe 文件更简单,不是吗?

方法 2: 使用 Gdebi 应用程序来安装 deb 软件包及其依赖项

再提一次,如果事情总是进展顺利,生活可能会更简单一些。但是生活并不是我们熟知的那样。

现在,你已经知道 .deb 文件可以简单地通过软件中心来安装,接下来,让我告诉你一些软件包可能会遇到的依赖项的错误。

发生错误的原因是,一个程序可能依赖于另外一个软件包(库)。当开发者为你准备 DEB 软件包时,他/她可能会假设你的系统中已经有了所依赖的软件包(库)。

但是如果情况并不是这样的,你的系统没有这些所需要的软件包(库),你将遇到臭名昭著的“依赖项错误”。

软件中心不能处理这样的错误,因此你不得不使用另外一个名称为 gdebi 的工具。

gdebi 是一个轻量级的 GUI 应用程序,它只有安装 deb 软件包的一个用途。

它将识别依赖项,并尝试在安装 .deb 文件的同时安装这些依赖项。

gdebi 在安装 deb 软件包时处理依赖项

就我个人而言,我更喜欢使用 gdebi 而不是使用软件包中心来安装 deb 文件。它是一个轻量级应用程序,因此安装过程看起来更快一点。更多的信息,你可以阅读使用 gDebi ,并使其成为安装 DEB 软件包的默认设置

你可以从软件中心或使用下面的命令来安装 gdebi :

sudo apt install gdebi

方法 3: 在命令行中使用 dpkg 安装 .deb 文件

如果你想在命令行中安装 deb 软件包,你可以使用 apt 命令或者 dpkg 命令。实际上,apt 命令在底层上使用 dpkg 命令,但是 apt 却更流行和易于使用。

如果你想对 deb 文件使用 apt 命令,像这样使用它:

sudo apt install path_to_deb_file

如果你想对将要安装的 deb 软件包使用 dpkg 命令,在这里是如何完成它:

sudo dpkg -i path_to_deb_file

在这两个命令中,你应该使用你已下载的 deb 文件的路径和名称来替换 path_to_deb_file

在 Ubuntu 中使用 dpkg 命令安装 deb 文件

如果你在安装 deb 软件包的过程中得到一个依赖项的错误,你可以使用下面的命令来修复依赖项的问题:

sudo apt install -f

如何移除 deb 软件包

移除一个 deb 软件包也不是一件什么大事。并且,你不需要用于安装程序的原始的 deb 文件。

方法 1: 使用 apt 命令移除 deb 软件包

你所需要的全部东西就是你所已安装程序的名称,接下来你可以使用 aptdpkg 来移除这个程序。

sudo apt remove program_name

现在,问题来了,在移除命令中,你如何找到你所需要使用的准确的程序名称?为此,apt 命令也有一个解决方案。

你可以使用 apt 命令找到所有已安装文件的列表,但是手动完成这一过程将会是一件令人头疼的事。因此,你可以使用 grep 命令来搜索你的软件包。

例如,在先前的部分中,我已安装 AppGrid 应用程序,但是如果我想知道准确的程序名称,我可以像这样使用一些东西:

sudo apt list --installed | grep grid

这将给予我全部的名称中含有 “grid” 的软件包,从这里,我可以得到准确的程序名称。

apt list --installed | grep grid
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
appgrid/now 0.298 all [installed,local]

正如你所看到的,一个名称为 “appgrid” 的软件包已经安装。现在,你可以在 apt remove 命令中使用这个程序名称。

方法2: 使用 dpkg 命令移除 deb 软件包

你可以使用 dpkg 来找到已安装程序的名称:

dpkg -l | grep grid

该输出将给予所有的名称中有 “grid” 的软件包。

dpkg -l | grep grid

ii appgrid 0.298 all Discover and install apps for Ubuntu

在上面的命令输出中的 ii 意味着软件包已经被正确地安装。

现在,你有了程序名称,你可以使用 dpkg 命令来移除它:

dpkg -r program_name

提示:更新 deb 软件包

一些 deb 软件包 (像 Chrome)通过系统更新来提供其更新,但是对于大多数的其它的程序,你将不得不先移除已存在的程序,并在接下来安装更新的版本。

我希望这篇初学者指南能够帮助你在 Ubuntu 上安装 deb 软件包。我添加了移除部分,以便你可以更好地控制你所安装的程序。


via: https://itsfoss.com/install-deb-files-ubuntu

作者:Abhishek Prakash 选题:lujun9972 译者:robsean 校对:wxy

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