Skip to content Skip to main navigation Skip to footer

Linux

Linux 有问必答:如何删除 Ubuntu 上不再使用的旧内核

提问:过去我已经在我的Ubuntu上升级了几次内核。现在我想要删除这些旧的内核镜像来节省我的磁盘空间。如何用最简单的方法删除Ubuntu上先前版本的内核?

在Ubuntu上,有几个方法来升级内核。在Ubuntu桌面中,软件更新允许你每天检查并更新到最新的内核上。在Ubuntu服务器上,最为重要的安全更新项目之一就是 unattended-upgrades 软件包会自动更新内核。然而,你也可以手动用apt-get或者aptitude命令来更新。

随着时间的流逝,持续的内核更新会在系统中积聚大量的不再使用的内核,浪费你的磁盘空间。每个内核镜像和其相关联的模块/头文件会占用200-400MB的磁盘空间,因此由不再使用的内核而浪费的磁盘空间会快速地增加。

GRUB管理器为每个旧内核都维护了一个GRUB入口,以备你想要使用它们。

作为磁盘清理的一部分,如果你不再使用这些,你可以考虑清理掉这些镜像。

如何清理旧内核镜像

在删除旧内核之前,记住最好留有2个最近的内核(最新的和上一个版本),以防主要的版本出错。现在就让我们看看如何在Ubuntu上清理旧内核。

在Ubuntu内核镜像包含了以下的包。

  • linux-image-: 内核镜像
  • linux-image-extra-: 额外的内核模块
  • linux-headers-: 内核头文件

首先检查系统中安装的内核镜像。

$ dpkg --list | grep linux-image
$ dpkg --list | grep linux-headers

在列出的内核镜像中,你可以移除一个特定的版本(比如3.19.0-15)。

$ sudo apt-get purge linux-image-3.19.0-15
$ sudo apt-get purge linux-headers-3.19.0-15

上面的命令会删除内核镜像和它相关联的内核模块和头文件。

注意如果你还没有升级内核那么删除旧内核会自动触发安装新内核。这样在删除旧内核之后,GRUB配置会自动升级来移除GRUB菜单中相关GRUB入口。

如果你有很多没用的内核,你可以用shell表达式来一次性地删除多个内核。注意这个括号表达式只在bash或者兼容的shell中才有效。

$ sudo apt-get purge linux-image-3.19.0-{18,20,21,25}
$ sudo apt-get purge linux-headers-3.19.0-{18,20,21,25}

上面的命令会删除4个内核镜像:3.19.0-18、3.19.0-20、3.19.0-21 和 3.19.0-25。

如果GRUB配置由于任何原因在删除旧内核后没有正确升级,你可以尝试手动用update-grub2命令来更新配置。

$ sudo update-grub2

现在就重启来验证GRUB菜单是否已经正确清理了。


via: http://ask.xmodulo.com/remove-kernel-images-ubuntu.html

作者:Dan Nanni 译者:geekpi 校对:wxy

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

RHCSA 系列(五): RHEL7 中的进程管理:开机,关机

我们将概括和简要地复习从你按开机按钮来打开你的 RHEL 7 服务器到呈现出命令行界面的登录屏幕之间所发生的所有事情,以此来作为这篇文章的开始。

RHCSA 系列(五): RHEL7 中的进程管理:开机,关机
RHCSA 系列(五): RHEL7 中的进程管理:开机,关机

Linux 开机过程

请注意:

  1. 相同的基本原则也可以应用到其他的 Linux 发行版本中,但可能需要较小的更改,并且
  2. 下面的描述并不是旨在给出开机过程的一个详尽的解释,而只是介绍一些基础的东西

Linux 开机过程

  1. 初始化 POST(加电自检)并执行硬件检查;

  2. 当 POST 完成后,系统的控制权将移交给启动管理器的第一阶段first stage,它存储在一个硬盘的引导扇区(对于使用 BIOS 和 MBR 的旧式的系统而言)或存储在一个专门的 (U)EFI 分区上。

  3. 启动管理器的第一阶段完成后,接着进入启动管理器的第二阶段second stage,通常大多数使用的是 GRUB(GRand Unified Boot Loader 的简称),它驻留在 /boot 中,然后开始加载内核和驻留在 RAM 中的初始化文件系统(被称为 initramfs,它包含执行必要操作所需要的程序和二进制文件,以此来最终挂载真实的根文件系统)。

  4. 接着展示了闪屏splash过后,呈现在我们眼前的是类似下图的画面,它允许我们选择一个操作系统和内核来启动:

    RHCSA 系列(五): RHEL7 中的进程管理:开机,关机
    RHCSA 系列(五): RHEL7 中的进程管理:开机,关机

    启动菜单屏幕

  5. 内核会对接入到系统的硬件进行设置,当根文件系统被挂载后,接着便启动 PID 为 1 的进程,这个进程将开始初始化其他的进程并最终呈现给我们一个登录提示符界面。

    注意:假如我们想在启动后查看这些信息,我们可以使用 dmesg 命令,并使用这个系列里的上一篇文章中介绍过的工具(注:即 grep)来过滤它的输出。

    RHCSA 系列(五): RHEL7 中的进程管理:开机,关机
    RHCSA 系列(五): RHEL7 中的进程管理:开机,关机

    登录屏幕和进程的 PID

在上面的例子中,我们使用了大家熟知的 ps 命令来显示在系统启动过程中的一系列当前进程的信息,它们的父进程(或者换句话说,就是那个开启这些进程的进程)为 systemd(大多数现代的 Linux 发行版本已经切换到的系统和服务管理器):

# ps -o ppid,pid,uname,comm --ppid=1

记住 -o(为 -format 的简写)选项允许你以一个自定义的格式来显示 ps 的输出,以此来满足你的需求;这个自定义格式使用 man ps 里 STANDARD FORMAT SPECIFIERS 一节中的特定关键词。

另一个你想自定义 ps 的输出而不是使用其默认输出的情形是:当你需要找到引起 CPU 或内存消耗过多的那些进程,并按照下列方式来对它们进行排序时:

# ps aux --sort=+pcpu              # 以 %CPU 来排序(增序)
# ps aux --sort=-pcpu              # 以 %CPU 来排序(降序)
# ps aux --sort=+pmem              # 以 %MEM 来排序(增序)
# ps aux --sort=-pmem              # 以 %MEM 来排序(降序)
# ps aux --sort=+pcpu,-pmem        # 结合 %CPU (增序) 和 %MEM (降序)来排列
RHCSA 系列(五): RHEL7 中的进程管理:开机,关机
RHCSA 系列(五): RHEL7 中的进程管理:开机,关机

自定义 ps 命令的输出

systemd 的一个介绍

在 Linux 世界中,很少有能比在主流的 Linux 发行版本中采用 systemd 引起更多的争论的决定。systemd 的倡导者根据以下事实来表明其主要的优势:

  1. 在系统启动期间,systemd 允许并发地启动更多的进程(相比于先前的 SysVinit,SysVinit 似乎总是表现得更慢,因为它一个接一个地启动进程,检查一个进程是否依赖于另一个进程,然后等待守护进程启动才可以启动的更多的服务),并且
  2. 在一个运行着的系统中,它用作一个动态的资源管理器。这样在启动期间,当一个服务被需要时,才启动它(以此来避免消耗系统资源)而不是在没有一个合理的原因的情况下启动额外的服务。
  3. 向后兼容 sysvinit 的脚本。

    另外请阅读: ‘init’ 和 ‘systemd’ 背后的故事

systemd 由 systemctl 工具控制,假如你了解 SysVinit,你将会对以下的内容感到熟悉:

  • service 工具,在旧一点的系统中,它被用来管理 SysVinit 脚本,以及
  • chkconfig 工具,为系统服务升级和查询运行级别信息
  • shutdown 你一定使用过几次来重启或关闭一个运行的系统。

下面的表格展示了使用传统的工具和 systemctl 之间的相似之处:

旧式工具 Systemctl 等价命令 描述
service name start systemctl start name 启动 name (这里 name 是一个服务)
service name stop systemctl stop name 停止 name
service name condrestart systemctl try-restart name 重启 name (如果它已经运行了)
service name restart systemctl restart name 重启 name
service name reload systemctl reload name 重载 name 的配置
service name status systemctl status name 显示 name 的当前状态
service – status-all systemctl 显示当前所有服务的状态
chkconfig name on systemctl enable name 通过一个特定的单元文件,让 name 可以在系统启动时运行(这个文件是一个符号链接)。启用或禁用一个启动时的进程,实际上是增加或移除一个到 /etc/systemd/system 目录中的符号链接。
chkconfig name off systemctl disable name 通过一个特定的单元文件,让 name 可以在系统启动时禁止运行(这个文件是一个符号链接)。
chkconfig -list name systemctl is-enabled name 确定 name (一个特定的服务)当前是否启用。
chkconfig – list systemctl – type=service 显示所有的服务及其是否启用或禁用。
shutdown -h now systemctl poweroff 关机
shutdown -r now systemctl reboot 重启系统

systemd 也引进了单元(unit)(它可能是一个服务,一个挂载点,一个设备或者一个网络套接字)和目标(target)(它们定义了 systemd 如何去管理和同时开启几个相关的进程,可以认为它们与在基于 SysVinit 的系统中的运行级别等价,尽管事实上它们并不等价)的概念。

总结归纳

其他与进程管理相关,但并不仅限于下面所列的功能的任务有:

1. 在考虑到系统资源的使用上,调整一个进程的执行优先级:

这是通过 renice 工具来完成的,它可以改变一个或多个正在运行着的进程的调度优先级。简单来说,调度优先级是一个允许内核(当前只支持 >= 2.6 的版本)根据某个给定进程被分配的执行优先级(即友善度(niceness),从 -20 到 19)来为其分配系统资源的功能。

renice 的基本语法如下:

# renice [-n] priority [-gpu] identifier

在上面的通用命令中,第一个参数是将要使用的优先级数值,而另一个参数可以是进程 ID(这是默认的设定),进程组 ID,用户 ID 或者用户名。一个常规的用户(即除 root 以外的用户)只可以更改他或她所拥有的进程的调度优先级,并且只能增加友善度的层次(这意味着占用更少的系统资源)。

在 Linux 中调整进程的优先级

进程调度优先级

2. 按照需要杀死一个进程(或终止其正常执行):

更精确地说,杀死一个进程指的是通过 kill 或 pkill 命令给该进程发送一个信号,让它优雅地(SIGTERM=15)或立即(SIGKILL=9)结束它的执行。

这两个工具的不同之处在于前一个被用来终止一个特定的进程或一个进程组,而后一个则允许你通过进程的名称和其他属性,执行相同的动作。

另外, pkill 与 pgrep 相捆绑,pgrep 提供将受符合的进程的 PID 给 pkill 来使用。例如,在运行下面的命令之前:

# pkill -u gacanepa

查看一眼由 gacanepa 所拥有的 PID 或许会带来点帮助:

# pgrep -l -u gacanepa

找到用户拥有的 PID

找到用户拥有的 PID

默认情况下,kill 和 pkiill 都发送 SIGTERM 信号给进程,如我们上面提到的那样,这个信号可以被忽略(即该进程可能会终止其自身的执行,也可能不终止),所以当你因一个合理的理由要真正地停止一个运行着的进程,则你将需要在命令行中带上特定的 SIGKILL 信号:

# kill -9 identifier               # 杀死一个进程或一个进程组
# kill -s SIGNAL identifier        # 同上
# pkill -s SIGNAL identifier       # 通过名称或其他属性来杀死一个进程

结论

在这篇文章中,我们解释了在 RHEL 7 系统中,有关开机启动过程的基本知识,并分析了一些可用的工具来帮助你通过使用一般的程序和 systemd 特有的命令来管理进程。

请注意,这个列表并不旨在涵盖有关这个话题的所有花哨的工具,请随意使用下面的评论栏来添加你自已钟爱的工具和命令。同时欢迎你的提问和其他的评论。


via: http://www.tecmint.com/rhcsa-exam-boot-process-and-process-management/

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

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

也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?

也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?
也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?

你们到目前或许知道,我最近一直在尝试体验 Antergos Linux。在安装完Antergos后我所首先注意到的一些事情是在默认的 Chromium 浏览器中没法正确显示印度语脚本

这是一件奇怪的事情,在我之前桌面Linux的体验中是从未遇到过的。起初,我认为是浏览器的问题,所以我安装了Firefox,然而问题依旧,Firefox也不能正确显示印度语。和Chromium不显示任何东西不同的是,Firefox确实显示了一些东西,但是毫无可读性。

也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?
也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?

Chromium中的印度语显示

也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?
也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?

Firefox中的印度语显示

奇怪吧?那么,默认情况下基于Arch的Antergos Linux中没有印度语的支持吗?我没有去验证,但是我假设其它基于梵语脚本的印地语之类会产生同样的问题。

在这个快速指南中,我打算为大家演示如何来添加梵语支持,以便让印度语和其它印地语都能正确显示。

在Antergos和Arch Linux中添加印地语支持

打开终端,使用以下命令:

sudo yaourt -S ttf-indic-otf

键入密码,它会提供给你对于印地语的译文支持。

重启Firefox,会马上正确显示印度语了,但是它需要一次重启来显示印度语。因此,我建议你在安装了印地语字体后重启你的系统

也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?
也许你需要在 Antergos 与 Arch Linux 中查看印度语和梵文?

我希望这篇快速指南能够帮助你,让你可以在Antergos和其它基于Arch的Linux发行版中,如Manjaro Linux,阅读印度语、梵文、泰米尔语、泰卢固语、马拉雅拉姆语、孟加拉语,以及其它印地语。


via: http://itsfoss.com/display-hindi-arch-antergos/

作者:Abhishek 译者:GOLinux 校对:wxy

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

RHCSA 系列(六): 使用 Parted 和 SSM 来配置和加密系统存储

在本篇文章中,我们将讨论在 RHEL 7 中如何使用传统的工具来设置和配置本地系统存储,并介绍系统存储管理器(也称为 SSM),它将极大地简化上面的任务。

配置和加密系统存储

RHCSA: 配置和加密系统存储 – Part 6

请注意,我们将在这篇文章中展开这个话题,但由于该话题的宽泛性,我们将在下一期中继续介绍有关它的描述和使用。

在 RHEL 7 中创建和修改分区

在 RHEL 7 中, parted 是默认的用来处理分区的程序,且它允许你:

  • 展示当前的分区表
  • 操纵(扩大或缩小分区的大小)现有的分区
  • 利用空余的磁盘空间或额外的物理存储设备来创建分区

强烈建议你在试图增加一个新的分区或对一个现有分区进行更改前,你应当确保该设备上没有任何一个分区正在使用(umount /dev/分区),且假如你正使用设备的一部分来作为 swap 分区,在进行上面的操作期间,你需要将它禁用(swapoff -v /dev/分区) 。

实施上面的操作的最简单的方法是使用一个安装介质例如一个 RHEL 7 的 DVD 或 USB 安装盘以急救模式启动 RHEL(TroubleshootingRescue a Red Hat Enterprise Linux system),然后当让你选择一个选项来挂载现有的 Linux 安装时,选择“跳过”这个选项,接着你将看到一个命令行提示符,在其中你可以像下图显示的那样开始键入与在一个未被使用的物理设备上创建一个正常的分区时所用的相同的命令。

RHEL 7 急救模式

RHEL 7 急救模式

要启动 parted,只需键入:

# parted /dev/sdb

其中 /dev/sdb 是你将要创建新分区所在的设备;然后键入 print 来显示当前设备的分区表:

创建新的分区

创建新的分区

正如你所看到的那样,在这个例子中,我们正在使用一个 5 GB 的虚拟驱动器。现在我们将要创建一个 4 GB 的主分区,然后将它格式化为 xfs 文件系统,它是 RHEL 7 中默认的文件系统。

你可以从一系列的文件系统中进行选择。你将需要使用 mkpart 来手动地创建分区,接着和平常一样,用 mkfs.类型 来对分区进行格式化,因为 mkpart 并不支持许多现代的文件系统的到即开即用。

在下面的例子中,我们将为设备设定一个标记,然后在 /dev/sdb 上创建一个主分区 (p),它从设备的 0% 开始,并在 4000MB(4 GB) 处结束。

在 Linux 中设定分区名称

标记分区的名称

接下来,我们将把分区格式化为 xfs 文件系统,然后再次打印出分区表,以此来确保更改已被应用。

# mkfs.xfs /dev/sdb1
# parted /dev/sdb print

在 Linux 中格式化分区

格式化分区为 XFS 文件系统

对于旧一点的文件系统,在 parted 中你可以使用 resize 命令来改变分区的大小。不幸的是,这只适用于 ext2, fat16, fat32, hfs, linux-swap, 和 reiserfs (若 libreiserfs 已被安装)。

因此,改变分区大小的唯一方式是删除它然后再创建它(所以,确保你对你的数据做了完整的备份!)。毫无疑问,在 RHEL 7 中默认的分区方案是基于 LVM 的。

使用 parted 来移除一个分区,可以用:

# parted /dev/sdb print
# parted /dev/sdb rm 1

在 Linux 中移除分区

移除或删除分区

逻辑卷管理(LVM)

一旦一个磁盘被分好了分区,再去更改分区的大小就是一件困难或冒险的事了。基于这个原因,假如我们计划在我们的系统上对分区的大小进行更改,我们应当考虑使用 LVM 的可能性,而不是使用传统的分区系统。这样多个物理设备可以组成一个逻辑组,以此来存放任意数目的逻辑卷,而逻辑卷的增大或减少不会带来任何麻烦。

简单来说,你会发现下面的示意图对记住 LVM 的基础架构或许有用。

LVM 的基本架构

LVM 的基本架构

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

遵循下面的步骤是为了使用传统的卷管理工具来设置 LVM。由于你可以通过阅读这个网站上的 LVM 系列来扩展这个话题,我将只是概要的介绍设置 LVM 的基本步骤,然后与使用 SSM 来实现相同功能做个比较。

: 我们将使用整个磁盘 /dev/sdb/dev/sdc 来作为物理卷(PV),但是否执行相同的操作完全取决于你。

1. 使用 /dev/sdb 和 /dev/sdc 中 100% 的可用磁盘空间来创建分区 /dev/sdb1/dev/sdc1

# parted /dev/sdb print
# parted /dev/sdc print

创建新分区

创建新分区

2. 分别在 /dev/sdb1 和 /dev/sdc1 上共创建 2 个物理卷。

# pvcreate /dev/sdb1
# pvcreate /dev/sdc1

创建两个物理卷

创建两个物理卷

记住,你可以使用 pvdisplay /dev/sd{b,c}1 来显示有关新建的物理卷的信息。

3. 在上一步中创建的物理卷之上创建一个卷组(VG):

# vgcreate tecmint_vg /dev/sd{b,c}1

在 Linux 中创建卷组

创建卷组

记住,你可使用 vgdisplay tecmint_vg 来显示有关新建的卷组的信息。

4. 像下面那样,在卷组 tecmint_vg 之上创建 3 个逻辑卷(LV):

# lvcreate -L 3G -n vol01_docs tecmint_vg       [vol01_docs → 3 GB]
# lvcreate -L 1G -n vol02_logs tecmint_vg       [vol02_logs → 1 GB]
# lvcreate -l 100%FREE -n vol03_homes tecmint_vg    [vol03_homes → 6 GB]

在 LVM 中创建逻辑卷

创建逻辑卷

记住,你可以使用 lvdisplay tecmintvg 来显示有关在 tecmintvg 之上新建的逻辑卷的信息。

5. 格式化每个逻辑卷为 xfs 文件系统格式(假如你计划在以后将要缩小卷的大小,请别使用 xfs 文件系统格式!):

# mkfs.xfs /dev/tecmint_vg/vol01_docs
# mkfs.xfs /dev/tecmint_vg/vol02_logs
# mkfs.xfs /dev/tecmint_vg/vol03_homes

6. 最后,挂载它们:

# mount /dev/tecmint_vg/vol01_docs /mnt/docs
# mount /dev/tecmint_vg/vol02_logs /mnt/logs
# mount /dev/tecmint_vg/vol03_homes /mnt/homes

移除逻辑卷,卷组和物理卷

7.现在我们将进行与刚才相反的操作并移除逻辑卷、卷组和物理卷:

# lvremove /dev/tecmint_vg/vol01_docs
# lvremove /dev/tecmint_vg/vol02_logs
# lvremove /dev/tecmint_vg/vol03_homes
# vgremove /dev/tecmint_vg
# pvremove /dev/sd{b,c}1

8. 现在,让我们来安装 SSM,我们将看到如何只用一步就完成上面所有的操作!

# yum update && yum install system-storage-manager

我们将和上面一样,使用相同的名称和大小:

# ssm create -s 3G -n vol01_docs -p tecmint_vg --fstype ext4 /mnt/docs /dev/sd{b,c}1
# ssm create -s 1G -n vol02_logs -p tecmint_vg --fstype ext4 /mnt/logs /dev/sd{b,c}1
# ssm create -n vol03_homes -p tecmint_vg --fstype ext4 /mnt/homes /dev/sd{b,c}1

是的! SSM 可以让你:

  • 初始化块设备来作为物理卷
  • 创建一个卷组
  • 创建逻辑卷
  • 格式化逻辑卷,以及
  • 只使用一个命令来挂载它们

9. 现在,我们可以使用下面的命令来展示有关物理卷、卷组或逻辑卷的信息:

# ssm list dev
# ssm list pool
# ssm list vol

检查有关物理卷、卷组或逻辑卷的信息

检查有关物理卷、卷组或逻辑卷的信息

10. 正如我们知道的那样, LVM 的一个显著的特点是可以在不停机的情况下更改(增大或缩小)逻辑卷的大小:

假定在 vol02logs 上我们用尽了空间,而 vol03homes 还留有足够的空间。我们将把 vol03homes 的大小调整为 4 GB,并使用剩余的空间来扩展 vol02logs:

# ssm resize -s 4G /dev/tecmint_vg/vol03_homes

再次运行 ssm list pool,并记录 tecmint_vg 中的剩余空间的大小:

查看卷的大小

查看卷的大小

然后执行:

# ssm resize -s+1.99 /dev/tecmint_vg/vol02_logs

: 在 -s 后的加号暗示特定值应该被加到当前值上。

11. 使用 ssm 来移除逻辑卷和卷组也更加简单,只需使用:

# ssm remove tecmint_vg

这个命令将返回一个提示,询问你是否确认删除卷组和它所包含的逻辑卷:

移除逻辑卷和卷组

移除逻辑卷和卷组

管理加密的卷

SSM 也给系统管理员提供了为新的或现存的卷加密的能力。首先,你将需要安装 cryptsetup 软件包:

# yum update && yum install cryptsetup

然后写出下面的命令来创建一个加密卷,你将被要求输入一个密码来增强安全性:

# ssm create -s 3G -n vol01_docs -p tecmint_vg --fstype ext4 --encrypt luks /mnt/docs /dev/sd{b,c}1
# ssm create -s 1G -n vol02_logs -p tecmint_vg --fstype ext4 --encrypt luks /mnt/logs /dev/sd{b,c}1
# ssm create -n vol03_homes -p tecmint_vg --fstype ext4 --encrypt luks /mnt/homes /dev/sd{b,c}1

我们的下一个任务是往 /etc/fstab 中添加条目来让这些逻辑卷在启动时可用,而不是使用设备识别编号(/dev/something)。

我们将使用每个逻辑卷的 UUID (使得当我们添加其他的逻辑卷或设备后,我们的设备仍然可以被唯一的标记),而我们可以使用 blkid 应用来找到它们的 UUID:

# blkid -o value UUID /dev/tecmint_vg/vol01_docs
# blkid -o value UUID /dev/tecmint_vg/vol02_logs
# blkid -o value UUID /dev/tecmint_vg/vol03_homes

在我们的例子中:

找到逻辑卷的 UUID

找到逻辑卷的 UUID

接着,使用下面的内容来创建 /etc/crypttab 文件(请更改 UUID 来适用于你的设置):

docs UUID=ba77d113-f849-4ddf-8048-13860399fca8 none
logs UUID=58f89c5a-f694-4443-83d6-2e83878e30e4 none
homes UUID=92245af6-3f38-4e07-8dd8-787f4690d7ac none

然后在 /etc/fstab 中添加如下的条目。请注意到 devicename (/dev/mapper/devicename) 是出现在 /etc/crypttab 中第一列的映射标识:

# Logical volume vol01_docs:
/dev/mapper/docs        /mnt/docs       ext4    defaults        0       2
# Logical volume vol02_logs
/dev/mapper/logs        /mnt/logs       ext4    defaults        0       2
# Logical volume vol03_homes
/dev/mapper/homes       /mnt/homes      ext4    defaults        0       2

现在重启(systemctl reboot),则你将被要求为每个逻辑卷输入密码。随后,你可以通过检查相应的挂载点来确保挂载操作是否成功:

确保逻辑卷挂载点

确保逻辑卷挂载点

总结

在这篇教程中,我们开始探索如何使用传统的卷管理工具和 SSM 来设置和配置系统存储,SSM 也在一个软件包中集成了文件系统和加密功能。这使得对于任何系统管理员来说,SSM 是一个非常有价值的工具。

假如你有任何的问题或评论,请让我们知晓 – 请随意使用下面的评论框来与我们保存联系!


via: http://www.tecmint.com/rhcsa-exam-create-format-resize-delete-and-encrypt-partitions-in-linux/

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

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

如何在 Docker 容器中运行支持 OData 的 JBoss 数据虚拟化 GA

大家好,我们今天来学习如何在一个 Docker 容器中运行支持 OData(译者注:Open Data Protocol,开放数据协议) 的 JBoss 数据虚拟化 6.0.0 GA(译者注:GA,General Availability,具体定义可以查看WIKI)。JBoss 数据虚拟化是数据提供和集成解决方案平台,将多种分散的数据源转换为一种数据源统一对待,在正确的时间将所需数据传递给任意的应用或者用户。JBoss 数据虚拟化可以帮助我们将数据快速组合和转换为可重用的商业友好的数据模型,通过开放标准接口简单可用。它提供全面的数据抽取、联合、集成、转换,以及传输功能,将来自一个或多个源的数据组合为可重复使用和共享的灵活数据。要了解更多关于 JBoss 数据虚拟化的信息,可以查看它的官方文档。Docker 是一个提供开放平台用于打包,装载和以轻量级容器运行任何应用的开源平台。使用 Docker 容器我们可以轻松处理和启用支持 OData 的 JBoss 数据虚拟化。

下面是该指南中在 Docker 容器中运行支持 OData 的 JBoss 数据虚拟化的简单步骤。

1. 克隆仓库

首先,我们要用 git 命令从 https://github.com/jbossdemocentral/dv-odata-docker-integration-demo 克隆带数据虚拟化的 OData 仓库。假设我们的机器上运行着 Ubuntu 15.04 linux 发行版。我们要使用 apt-get 命令安装 git。

# apt-get install git

安装完 git 之后,我们运行下面的命令克隆仓库。

# git clone https://github.com/jbossdemocentral/dv-odata-docker-integration-demo
Cloning into 'dv-odata-docker-integration-demo'...
remote: Counting objects: 96, done.
remote: Total 96 (delta 0), reused 0 (delta 0), pack-reused 96
Unpacking objects: 100% (96/96), done.
Checking connectivity... done.

2. 下载 JBoss 数据虚拟化安装器

现在,我们需要从下载页 http://www.jboss.org/products/datavirt/download/ 下载 JBoss 数据虚拟化安装器。下载了 jboss-dv-installer-6.0.0.GA-redhat-4.jar 后,我们把它保存在名为 software 的目录下。

3. 创建 Docker 镜像

下一步,下载了 JBoss 数据虚拟化安装器之后,我们打算使用 Dockerfile 和刚从仓库中克隆的资源创建 docker 镜像。

# cd dv-odata-docker-integration-demo/
# docker build -t jbossdv600 .
...
Step 22 : USER jboss
---> Running in 129f701febd0
---> 342941381e37
Removing intermediate container 129f701febd0
Step 23 : EXPOSE 8080 9990 31000
---> Running in 61e6d2c26081
---> 351159bb6280
Removing intermediate container 61e6d2c26081
Step 24 : CMD $JBOSS_HOME/bin/standalone.sh -c standalone.xml -b 0.0.0.0 -bmanagement 0.0.0.0
---> Running in a9fed69b3000
---> 407053dc470e
Removing intermediate container a9fed69b3000
Successfully built 407053dc470e

注意:在这里我们假设你已经安装了 docker 并正在运行。

4. 启动 Docker 容器

创建了支持 oData 的 JBoss 数据虚拟化 Docker 镜像之后,我们打算运行 docker 容器并用 -P 标签指定端口。我们运行下面的命令来实现。

# docker run -p 8080:8080 -d -t jbossdv600
7765dee9cd59c49ca26850e88f97c21f46859d2dc1d74166353d898773214c9c

5. 获取容器 IP

启动了 Docker 容器之后,我们想要获取正在运行的 docker 容器的 IP 地址。要做到这点,我们运行后面添加了正在运行容器 id 号的 docker inspect 命令。

# docker inspect <$containerID>
...
"NetworkSettings": {
"Bridge": "",
"EndpointID": "3e94c5900ac5954354a89591a8740ce2c653efde9232876bc94878e891564b39",
"Gateway": "172.17.42.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"HairpinMode": false,
"IPAddress": "172.17.0.8",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,

6. Web 界面

现在,如果一切如期望的那样进行,当我们用浏览器打开 http://container-ip:8080/ 和 http://container-ip:9990 时会看到支持 oData 的 JBoss 数据虚拟化登录界面和 JBoss 管理界面。管理验证的用户名和密码分别是 admin 和 redhat1!数据虚拟化验证的用户名和密码都是 user。之后,我们可以通过 web 界面在内容间导航。

注意: 强烈建议在第一次登录后尽快修改密码。

总结

终于我们成功地运行了跑着支持 OData 多源虚拟数据库的 JBoss 数据虚拟化 的 Docker 容器。JBoss 数据虚拟化真的是一个很棒的平台,它为多种不同来源的数据进行虚拟化,并将它们转换为商业友好的数据模型,产生通过开放标准接口简单可用的数据。使用 Docker 技术可以简单、安全、快速地部署支持 OData 多源虚拟数据库的 JBoss 数据虚拟化。如果你有任何疑问、建议或者反馈,请在下面的评论框中写下来,以便我们可以改进和更新内容。非常感谢!Enjoy:-)


via: http://linoxide.com/linux-how-to/run-jboss-data-virtualization-ga-odata-docker-container/

作者:Arun Pyasi 译者:ictlyh 校对:wxy

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

mosh:一个基于 SSH 用于连接远程 Unix/Linux 系统的工具

Mosh 表示移动 ShellMobile Shell,是一个用于从客户端跨互联网连接远程服务器的命令行工具。它能用于 SSH 连接,但是比 Secure Shell 功能更多。它是一个类似于 SSH 而带有更多功能的应用。程序最初由 Keith Winstein 编写,用于类 Unix 的操作系统中,发布于GNU GPL v3协议下。

mosh:一个基于 SSH 用于连接远程 Unix/Linux 系统的工具
mosh:一个基于 SSH 用于连接远程 Unix/Linux 系统的工具

Mosh Shell SSH 客户端

Mosh的功能

  • 它是一个支持漫游的远程终端程序。
  • 在所有主流的类 Unix 版本中可用,如 Linux、FreeBSD、Solaris、Mac OS X 和 Android。
  • 支持不稳定连接
  • 支持智能的本地回显
  • 支持用户输入的行编辑
  • 响应式设计及在 wifi、3G、长距离连接下的鲁棒性
  • 在 IP 改变后保持连接。它使用 UDP 代替 TCP(在 SSH 中使用),当连接被重置或者获得新的 IP 后 TCP 会超时,但是 UDP 仍然保持连接。
  • 在很长的时候之后恢复会话时仍然保持连接。
  • 没有网络延迟。立即显示用户输入和删除而没有延迟
  • 像 SSH 那样支持一些旧的方式登录。
  • 包丢失处理机制

Linux 中 mosh 的安装

在 Debian、Ubuntu 和 Mint 类似的系统中,你可以很容易地用 apt-get 包管理器安装。

# apt-get update
# apt-get install mosh

在基于 RHEL/CentOS/Fedora 的系统中,要使用 yum 包管理器安装 mosh,你需要打开第三方的 EPEL

# yum update
# yum install mosh

在 Fedora 22+的版本中,你需要使用 dnf 包管理器来安装 mosh。

# dnf install mosh

我该如何使用 mosh?

1、 让我们尝试使用 mosh 登录远程 Linux 服务器。

$ mosh root@192.168.0.150
mosh:一个基于 SSH 用于连接远程 Unix/Linux 系统的工具
mosh:一个基于 SSH 用于连接远程 Unix/Linux 系统的工具

mosh远程连接

注意:你有没有看到一个连接错误,因为我在 CentOS 7中还有打开这个端口。一个快速但是我并不建议的解决方法是:

# systemctl stop firewalld    [在远程服务器上]

更好的方法是打开一个端口并更新防火墙规则。接着用 mosh 连接到预定义的端口中。至于更深入的细节,也许你会对下面的文章感兴趣。

2、 让我们假设把默认的 22 端口改到 70,这时使用 -p 选项来使用自定义端口。

$ mosh -p 70 root@192.168.0.150

3、 检查 mosh 的版本

$ mosh --version

Check Mosh Version

检查mosh版本

4、 你可以输入exit来退出 mosh 会话。

$ exit

5、 mosh 支持很多选项,你可以用下面的方法看到:

$ mosh --help
mosh:一个基于 SSH 用于连接远程 Unix/Linux 系统的工具
mosh:一个基于 SSH 用于连接远程 Unix/Linux 系统的工具

Mosh 选项

mosh 的优缺点

  • mosh 有额外的需求,比如需要允许 UDP 直接连接,这在 SSH 不需要。
  • 动态分配的端口范围是 60000-61000。第一个打开的端口是分配好的。每个连接都需要一个端口。
  • 默认的端口分配是一个严重的安全问题,尤其是在生产环境中。
  • 支持 IPv6 连接,但是不支持 IPv6 漫游。
  • 不支持回滚
  • 不支持 X11 转发
  • 不支持 ssh-agent 转发

总结

mosh是一款在大多数linux发行版的仓库中可以下载的一款小工具。虽然它有一些差异尤其是安全问题和额外的需求,它的功能,比如漫游后保持连接是一个加分点。我的建议是任何一个使用ssh的linux用户都应该试试这个程序,mosh值得一试。


via: http://www.tecmint.com/install-mosh-shell-ssh-client-in-linux/

作者:Avishek Kumar 译者:geekpi 校对:wxy

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

RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享

在上一篇文章(RHCSA 系列(六))中,我们解释了如何使用 parted 和 ssm 来设置和配置本地系统存储。

RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享
RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享

RHCSA 系列: 配置 ACL 及挂载 NFS/Samba 共享 – Part 7

我们也讨论了如何创建和在系统启动时使用一个密码来挂载加密的卷。另外,我们告诫过你要避免在挂载的文件系统上执行危险的存储管理操作。记住了这点后,现在,我们将回顾在 RHEL 7 中最常使用的文件系统格式,然后将涵盖有关手动或自动挂载、使用和卸载网络文件系统(CIFS 和 NFS)的话题以及在你的操作系统上实现访问控制列表Access Control List的使用。

前提条件

在进一步深入之前,请确保你可使用 Samba 服务和 NFS 服务(注意在 RHEL 7 中 NFSv2 已不再被支持)。

在本次指导中,我们将使用一个IP 地址为 192.168.0.10 且同时运行着 Samba 服务和 NFS 服务的机器来作为服务器,使用一个 IP 地址为 192.168.0.18 的 RHEL 7 机器来作为客户端。在这篇文章的后面部分,我们将告诉你在客户端上你需要安装哪些软件包。

RHEL 7 中的文件系统格式

从 RHEL 7 开始,由于 XFS 的高性能和可扩展性,它已经被作为所有的架构中的默认文件系统。根据 Red Hat 及其合作伙伴在主流硬件上执行的最新测试,当前 XFS 已支持最大为 500 TB 大小的文件系统。

另外,XFS 启用了 user_xattr(扩展用户属性) 和 acl(POSIX 访问控制列表)来作为默认的挂载选项,而不像 ext3 或 ext4(对于 RHEL 7 来说,ext2 已过时),这意味着当挂载一个 XFS 文件系统时,你不必显式地在命令行或 /etc/fstab 中指定这些选项(假如你想在后一种情况下禁用这些选项,你必须显式地使用 no_aclno_user_xattr)。

请记住扩展用户属性可以给文件和目录指定,用来存储任意的额外信息如 mime 类型,字符集或文件的编码,而用户属性中的访问权限由一般的文件权限位来定义。

访问控制列表

作为一名系统管理员,无论你是新手还是专家,你一定非常熟悉与文件和目录有关的常规访问权限,这些权限为所有者,所有组和“世界”(所有的其他人)指定了特定的权限(可读,可写及可执行)。但如若你需要稍微更新下你的记忆,请参考 RHCSA 系列(三).

但是,由于标准的 ugo/rwx 集合并不允许为不同的用户配置不同的权限,所以 ACL 便被引入了进来,为的是为文件和目录定义更加详细的访问权限,而不仅仅是这些特别指定的特定权限。

事实上, ACL 定义的权限是由文件权限位所特别指定的权限的一个超集。下面就让我们看看这个转换是如何在真实世界中被应用的吧。

  1. 存在两种类型的 ACL:访问 ACL,可被应用到一个特定的文件或目录上;以及默认 ACL,只可被应用到一个目录上。假如目录中的文件没有 ACL,则它们将继承它们的父目录的默认 ACL 。

  2. 从一开始, ACL 就可以为每个用户,每个组或不在文件所属组中的用户配置相应的权限。

  3. ACL 可使用 setfacl 来设置(和移除),可相应地使用 -m 或 -x 选项。

例如,让我们创建一个名为 tecmint 的组,并将用户 johndoe 和 davenull 加入该组:

# groupadd tecmint
# useradd johndoe
# useradd davenull
# usermod -a -G tecmint johndoe
# usermod -a -G tecmint davenull

并且让我们检验这两个用户都已属于追加的组 tecmint:

# id johndoe
# id davenull

检验用户

检验用户

现在,我们在 /mnt 下创建一个名为 playground 的目录,并在该目录下创建一个名为 testfile.txt 的文件。我们将设定该文件的属组为 tecmint,并更改它的默认 ugo/rwx 权限为 770(即赋予该文件的属主和属组可读、可写和可执行权限):

# mkdir /mnt/playground
# touch /mnt/playground/testfile.txt
# chown :tecmint /mnt/playground/testfile.txt
# chmod 770 /mnt/playground/testfile.txt

接着,依次切换为 johndoe 和 davenull 用户,并在文件中写入一些信息:

# su johndoe
$ echo "My name is John Doe" > /mnt/playground/testfile.txt
$ su davenull
$ echo "My name is Dave Null" >> /mnt/playground/testfile.txt

到目前为止,一切正常。现在我们让用户 gacanepa 来向该文件执行写操作 – 则写操作将会失败,这是可以预料的。

$ su gacanepa
$ echo "My name is Gabriel Canepa" >> /mnt/playground/testfile.txt
RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享
RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享

管理用户的权限

但实际上我们需要用户 gacanepa(他不是组 tecmint 的成员)在文件 /mnt/playground/testfile.txt 上有写权限,那又该怎么办呢?首先映入你脑海里的可能是将该用户添加到组 tecmint 中。但那将使得他在所有该组具有写权限位的文件上均拥有写权限,但我们并不想这样,我们只想他能够在文件 /mnt/playground/testfile.txt 上有写权限。

现在,让我们给用户 gacanepa 在 /mnt/playground/testfile.txt 文件上有读和写权限。

以 root 的身份运行如下命令:

# setfacl -R -m u:gacanepa:rwx /mnt/playground

则你将成功地添加一条 ACL,允许 gacanepa 对那个测试文件可写。然后切换为 gacanepa 用户,并再次尝试向该文件写入一些信息:

$ echo "My name is Gabriel Canepa" >> /mnt/playground/testfile.txt

要观察一个特定的文件或目录的 ACL,可以使用 getfacl 命令:

# getfacl /mnt/playground/testfile.txt
RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享
RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享

检查文件的 ACL

要为目录设定默认 ACL(它的内容将被该目录下的文件继承,除非另外被覆写),在规则前添加 d:并特别指定一个目录名,而不是文件名:

# setfacl -m d:o:r /mnt/playground

上面的 ACL 将允许不在属组中的用户对目录 /mnt/playground 中的内容有读权限。请注意观察这次更改前后 getfacl /mnt/playground 的输出结果的不同:

RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享
RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享

在 Linux 中设定默认 ACL

在官方的 RHEL 7 存储管理指导手册的第 20 章 中提供了更多有关 ACL 的例子,我极力推荐你看一看它并将它放在身边作为参考。

挂载 NFS 网络共享

要显示你服务器上可用的 NFS 共享的列表,你可以使用带有 -e 选项的 showmount 命令,再跟上机器的名称或它的 IP 地址。这个工具包含在 nfs-utils 软件包中:

# yum update && yum install nfs-utils

接着运行:

# showmount -e 192.168.0.10

则你将得到一个在 192.168.0.10 上可用的 NFS 共享的列表:

检查可用的 NFS 共享

检查可用的 NFS 共享

要按照需求在本地客户端上使用命令行来挂载 NFS 网络共享,可使用下面的语法:

# mount -t nfs -o [options] remote_host:/remote/directory /local/directory

其中,在我们的例子中,对应为:

# mount -t nfs 192.168.0.10:/NFS-SHARE /mnt/nfs

若你得到如下的错误信息:Job for rpc-statd.service failed. See “systemctl status rpc-statd.service” and “journalctl -xn” for details.,请确保 rpcbind 服务被启用且已在你的系统中启动了。

# systemctl enable rpcbind.socket
# systemctl restart rpcbind.service

接着重启。这就应该达到了上面的目的,且你将能够像先前解释的那样挂载你的 NFS 共享了。若你需要在系统启动时自动挂载 NFS 共享,可以向 /etc/fstab 文件添加一个有效的条目:

remote_host:/remote/directory /local/directory nfs options 0 0

上面的变量 remote_host, /remote/directory, /local/directory 和 options(可选) 和在命令行中手动挂载一个 NFS 共享时使用的一样。按照我们前面的例子,对应为:

192.168.0.10:/NFS-SHARE /mnt/nfs nfs defaults 0 0

挂载 CIFS (Samba) 网络共享

Samba 代表一个特别的工具,使得在由 *nix 和 Windows 机器组成的网络中进行网络共享成为可能。要显示可用的 Samba 共享,可使用带有 -L 选项的 smbclient 命令,再跟上机器的名称或它的 IP 地址。这个工具包含在 samba_client 软件包中:

你将被提示在远程主机上输入 root 用户的密码:

# smbclient -L 192.168.0.10
RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享
RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享

检查 Samba 共享

要在本地客户端上挂载 Samba 网络共享,你需要已安装好 cifs-utils 软件包:

# yum update && yum install cifs-utils

然后在命令行中使用下面的语法:

# mount -t cifs -o credentials=/path/to/credentials/file //remote_host/samba_share /local/directory

其中,在我们的例子中,对应为:

# mount -t cifs -o credentials=~/.smbcredentials //192.168.0.10/gacanepa /mnt/samba

其中 .smbcredentials 的内容是:

username=gacanepa
password=XXXXXX

它是一个位于 root 用户的家目录(/root/) 中的隐藏文件,其权限被设置为 600,所以除了该文件的属主外,其他人对该文件既不可读也不可写。

请注意 samba_share 是 Samba 共享的名称,由上面展示的 smbclient -L remote_host 所返回。

现在,若你需要在系统启动时自动地使得 Samba 分享可用,可以向 /etc/fstab 文件添加一个像下面这样的有效条目:

//remote_host:/samba_share /local/directory cifs options 0 0

上面的变量 remote_host, /remote/directory, /local/directory 和 options(可选) 和在命令行中手动挂载一个 Samba 共享时使用的一样。按照我们前面的例子中所给的定义,对应为:

//192.168.0.10/gacanepa /mnt/samba  cifs credentials=/root/smbcredentials,defaults 0 0

结论

在这篇文章中,我们已经解释了如何在 Linux 中设置 ACL,并讨论了如何在一个 RHEL 7 客户端上挂载 CIFS 和 NFS 网络共享。

我建议你去练习这些概念,甚至混合使用它们(试着在一个挂载的网络共享上设置 ACL),直至你感觉掌握了。假如你有问题或评论,请随时随意地使用下面的评论框来联系我们。另外,请随意通过你的社交网络分享这篇文章。


via: http://www.tecmint.com/rhcsa-exam-configure-acls-and-mount-nfs-samba-shares/

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

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

10 条真心有趣的 Linux 命令

在终端工作是一件很有趣的事情。今天,我们将会列举一些有趣得为你带来欢笑的Linux命令。

1. rev

创建一个文件,在文件里面输入几个单词,rev命令会将你写的东西反转输出到控制台。

# rev  

Selection_002

Selection_001

2. fortune

这个命令没有被默认安装,用apt-get命令安装它,fortune命令会随机显示一些句子

crank@crank-System:~$ sudo apt-get install fortune

Selection_003

利用fortune命令的 -s 选项,他会限制一个句子的输出长度。

# fortune -s

Selection_004

3. yes

# yes 

这个命令会不停打印字符串,直到用户把这进程给结束掉。

# yes unixmen

Selection_005

4. figlet

这个命令可以用apt-get安装,安装之后,在/usr/share/figlet可以看到一些ascii字体文件。

cd /usr/share/figlet

#figlet -f   
#figlet -f big.flf unixmen

Selection_006

#figlet -f block.flf  unixmen

Selection_007

当然,你也可以尝试使用其他的选项。

5. asciiquarium

这个命令会将你的终端变成一个海洋馆。

下载term animator:

# wget http://search.cpan.org/CPAN/authors/id/K/KB/KBAUCOM/Term-Animation-2.4.tar.gz

安装并且配置这个包:

# tar -zxvf Term-Animation-2.4.tar.gz
# cd Term-Animation-2.4/
# perl Makefile.PL && make && make test
# sudo make install

接着安装下面这个包:

# apt-get install libcurses-perl

下载并且安装asciiquarium:

# wget http://www.robobunny.com/projects/asciiquarium/asciiquarium.tar.gz
# tar -zxvf asciiquarium.tar.gz
# cd asciiquarium_1.0/
# cp asciiquarium /usr/local/bin/

执行如下命令:

# /usr/local/bin/asciiquarium

asciiquarium_1.1 : perl_008

6. bb

# apt-get install bb
# bb

看看会输出什么?

Selection_009

7. sl

有的时候你可能把 ls 误打成了 sl,其实 sl 也是一个命令,如果你打 sl的话,你会看到一个移动的火车头

# apt-get install sl

# sl

Selection_012

8. cowsay

一个很常见的命令,它会用ascii显示你想说的话。

apt-get install cowsay

# cowsay 

Selection_013

或者,你可以用其他的角色来取代默认角色来说这句话,这些角色都存储在/usr/share/cowsay/cows目录下

# cd /usr/share/cowsay/cows

cowsay -f ghostbusters.cow  unixmen

Selection_014

或者

# cowsay -f bud-frogs.cow Rajneesh

Selection_015

9. toilet

你没看错,这是个命令来的,他会将字符串以彩色的ascii字符串形式输出到终端

# apt-get install toilet

# toilet --gay unixmen

Selection_016

toilet -F border -F gay unixmen

Selection_020

toilet  -f mono12 -F metal  unixmen

Selection_018

10. aafire

aafire能让你的终端燃起来。

# apt-get install libaa-bin

# aafire

Selection_019

就这么多,祝你们在Linux终端玩得开心哈!!!


via: http://www.unixmen.com/list-10-funny-linux-commands/

作者:Rajneesh Upadhyay 译者:tnuoccalanosrep 校对:wxy

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

如何选择 Linux 上的跟踪器

跟踪器tracer是一个高级的性能分析和诊断工具,但是不要让这名词唬住你,如果你使用过 strace 和 tcpdump,其实你就已经使用过跟踪器了。系统跟踪器可以获取更多的系统调用和数据包。它们通常能跟踪任意的内核和应用程序。

有太多的 Linux 跟踪器可以选择。每一种都有其官方的(或非官方的)的卡通的独角兽吉祥物,足够撑起一台”儿童剧”了。

那么我们应该使用哪个跟踪器呢?

我会为两类读者回答这个问题,多数人和性能/内核工程师。过一段时间这些可能会发生变化,我会持续跟进并补充,大概会一年更新一次。

对于多数人

多数人 (开发者,系统管理员,开发管理者,运维人员,评测人员,等等) 不关心系统追踪器的细节。下面是对于追踪器你应该知道和做的:

1. 使用 perf_events 分析 CPU 性能

使用 perf_events 做 CPU 性能分析。性能指标可以使用 flame graph 等工具做可视化。

git clone --depth 1 https://github.com/brendangregg/FlameGraph
perf record -F 99 -a -g -- sleep 30
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > perf.svg

Linux perf_events (又称 “perf”,同命令名) 是 Linux 用户的官方跟踪器和性能分析器。内置于内核代码,有很好维护(近来获得快速增强),通常通过 linux-tools-common 软件包安装。

perf 有很多功能,如果只能推荐一个,我选择 CPU 性能分析。尽管这只是采样,而不是从技术上追踪事件。最难的部分是获取完整的栈和信息,我为 java 和 node.js 做的一个演讲 Linux Profiling at Netflix 中已经说过这个问题。

2. 了解其他的跟踪器

正如我一个朋友说的:“你不需要知道如何操作 X 射线机器,但是一旦你吞了一枚硬币,你得知道这得去做 X 射线”,你应该了解各种跟踪器都能做什么,这样就能在你工作中真正需要跟踪器的时候,你既可以选择稍后学习使用,也可以雇相应的人来完成。

简短来说:几乎所有的东西都可以使用跟踪器来进行分析和跟踪。如,文件系统内部、TCP/IP 过程、设备驱动、应用程序内部。可以看一下我的个人网站上关于 ftrace的文章,还有我写的关于 perf_events 文档介绍,可以做为一个追踪(或者性能分析)的例子。

3. 寻求前端支持工具

如果你正想买一个能支持跟踪 Linux 的性能分析工具(有许多卖这类工具的公司)。想像一下,只需要直接点击一下界面就能“洞察”整个系统内核,包括隐藏的不同堆栈位置的热图,我在 Monitorama talk 中介绍了一个这样带图形界面的工具。

我开源了一些我自己开发的前端工具,尽管只是命令行界面而不是图形界面。这些工具也会让人们更加快速容易的使用跟踪器。比如下面的例子,用我的 perf_tool,跟踪一个新进程:

# ./execsnoop
Tracing exec()s. Ctrl-C to end.
   PID   PPID ARGS
 22898  22004 man ls
 22905  22898 preconv -e UTF-8
 22908  22898 pager -s
 22907  22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8
[...]

在 Netflix 上,我们创建了一个 Vector,一个分析工具的实例,同时也是 Linux 上的跟踪器的最终前端。

对于性能/内核工程师

我们的工作变的越来越困难,很多的人会问我们怎么样去追踪,哪种跟踪器可以用!为了正确理解一个跟踪器,你经常需要花上至少100个小时才能做到。理解所有的 linux 跟踪器去做出理性的选择是一个浩大的工程。(我可能是唯一一个快做到这件事情的人)

这里是我的建议,可以二选其一:

A) 选中一个全能的跟踪器,并且使它标准化,这将涉及花费大量的时间去弄清楚它在测试环境中的细微差别和安全性。我现在推荐 SystemTap 的最新版本(可以从源代码构建)。我知道有些公司已经选用 LTTng,而且他们用的很好,尽管它不是非常的强大(虽然它更安全)。如果 Sysdig 可以增加追踪点tracepoint或者 kprobes,可以做为另一个候选。 

B) 遵循我上面提供的流程图,它将意味着尽可能更多的使用 ftrace 或者 perf_event, 并整合 eBPF,之后其他的跟踪器像 SystemTap/LTTng 会去填补剩下的空白。 这就是我目前在 Netflix 做的工作。

对跟踪器的评价

1. ftrace

我喜欢用 ftrace,它是内核 hacker 的首选,内置于系统内核,可以使用跟踪点(静态检查点),能调用内核 kprobes 和 uprobes 调试工具。并且提供几个这样的功能:带可选过滤器和参数的事件追踪功能;在内核中进行统计的事件计数和定时功能;还有函数流程遍历的功能。可以看一下内核代码中 ftrace.txt 例子了解一下。ftrace 由 /sys 控制,仅支持单一的 root 用户使用(但是你可以通过缓冲区实例改成支持多用户)。某些时候 ftrace 的操作界面非常繁琐,但是的确非常“hack”,而且它有前端界面。ftace 的主要作者 Steven Rostedt 创建了 trace-cmd 命令工具,而我创建了 perf 的工具集。我对这个工具最大的不满就是它不可编程。举例来说,你不能保存和获取时间戳,不能计算延迟,不能把这些计算结果保存成直方图的形式。你需要转储事件至用户层,并且花一些时间去处理结果。ftrace 可以通过 eBPF 变成可编程的。

2. perf_events

perf_events 是 Linux 用户的主要跟踪工具,它内置在内核源码中,通常通过 linux-tools-commom 安装。也称为“perf”,即其前端工具名称,它通常用来跟踪和转储信息到一个叫做 perf.data 的文件中,perf.data 文件相当于一个动态的缓冲区,用来保存之后需要处理的结果。ftrace 能做到的,perf_events 大都也可以做到,perf-events 不能做函数流程遍历,少了一点儿“hack”劲儿(但是对于安全/错误检查有更好的支持)。它可以进行 CPU 分析和性能统计,用户级堆栈解析,也可以使用对于跟踪每行局部变量产生的调试信息。它也支持多用户并发操作。和 ftrace 一样也不支持可编程。如果要我只推荐一款跟踪器,那一定是 perf 了。它能解决众多问题,并且它相对较安全。

3. eBPF

extended Berkeley Packet Filter(eBPF)是一个可以在事件上运行程序的高效内核虚拟机(JIT)。它可能最终会提供 ftrace 和 perf_events 的内核编程,并强化其他的跟踪器。这是 Alexei Starovoitov 目前正在开发的,还没有完全集成,但是从4.1开始已经对一些优秀的工具有足够的内核支持了,如块设备 I/O 的延迟热图。可参考其主要作者 Alexei Starovoitov 的 BPF slides和 eBPF samples

4. SystemTap

SystemTap 是最强大的跟踪器。它能做所有事情,如概要分析,跟踪点,探针,uprobes(来自SystemTap),USDT 和内核编程等。它将程序编译为内核模块,然后加载,这是一种获取安全的巧妙做法。它也是从 tree 发展而来,过去有很多问题(崩溃或冻结)。很多不是 SystemTap 本身的错——它常常是第一个使用某个内核追踪功能,也是第一个碰到 bug 的。SystemTap 的最新版本好多了(必须由源代码编译),但是很多人仍然会被早期版本吓到。如果你想用它,可先在测试环境中使用,并与 irc.freenode.net 上 的 #systemtap 开发人员交流。(Netflix 有容错机制,我们已经使用了 SystemTap,但是可能我们考虑的安全方面的问题比你们少。)我最大的不满是,它似乎认为你应该有内核 debug 信息,但是经常没有。实际上没有它也能做很多事情,但是缺少文档和例子(我必须自己全靠自己开始学习)。

5. LTTng

LTTng 优化了事件采集,这比其他跟踪器做得好,它也支持几种事件类型,包括 USTD。它从 tree 发展而来,它的核心很简单:通过一组小规模的固定指令集将事件写入追踪缓冲区,这种方式使它安全、快速,缺点是它没有内核编码的简单途径。我一直听说这不是一个大问题,因为尽管需要后期处理,它也已经优化到可以充分的度量。此外,它还首创了一个不同的分析技术,对所有关注事件的更多黑盒记录将能够稍后以 GUI 的方式进行研究。我关心的是前期没有考虑到要录制的事件缺失问题如何解决,但我真正要做的是花更多时间来看它在实践中用的怎么样。这是我花的时间最少的一个跟踪器(没有什么特殊原因)。

6. Ktap

ktap 是一款前景很好的跟踪器,它使用内核中的 lua 虚拟机处理,在没有调试信息的情况下在嵌入式设备上运行的很好。这让它得到了关注,并在有一段时间似乎超过了 Linux 上所有的追踪器。然后 eBPF 开始集成到内核了,而 ktap 的集成会在可以使用 eBPF 替代它自己的虚拟机后才开始。因为 eBPF 仍将持续集成几个月,ktap 开发者要继续等上一段时间。我希望今年晚些时候它能重新开发。

7. dtrace4linux

dtrace4linux 主要是 Paul Fox 一个人在业余时间完成的,它是 Sun DTrace 的 Linux 版本。它引人瞩目,已经有一些供应器provider可以工作,但是从某种程度上来说还不完整,更多的是一种实验性的工具(不安全)。我认为,顾忌到许可证问题,人们会小心翼翼的为 dtrace4linux 贡献代码:由于当年 Sun 开源DTrace 使用的是 CDDL 协议,而 dtrace4linux 也不大可能最终进入 Linux kernel。Paul 的方法很可能会使其成为一个 add-on。我很乐意看到 Linux 平台上的 DTrace 和这个项目的完成,我认为当我加入 Netflix 后将会花些时间来协助完成这个项目。然而,我还是要继续使用内置的跟踪器,如 ftrace 和 perf_events。

8.OL DTrace

Oracle Linux DTrace 为了将 DTrace 引入 Linux,特别是为 Oracle Linux,做出了很大的努力。这些年来发布的多个版本表明了它的稳定进展。开发者们以一种对这个项目的前景看好的态度谈论着改进 DTrace 测试套件。很多有用的 供应器provider 已经完成了,如:syscall, profile, sdt, proc, sched 以及 USDT。我很期待 fbt(function boundary tracing,用于内核动态跟踪)的完成,它是 Linux 内核上非常棒的 供应器provider。OL DTrace 最终的成功将取决于人们对运行 Oracle Linux(为技术支持付费)有多大兴趣,另一方面取决于它是否完全开源:它的内核元件是开源的,而我没有看到它的用户级别代码。

9. sysdig

sysdig 是一个使用类 tcpdump 语法在系统事件上操作的新跟踪器,它使用 lua 进行后期处理。它很优秀,它见证了系统跟踪领域的变革。它的局限性在于它只在当前进行系统调用,将所有事件转储为用户级别用于后期处理。你可以使用系统调用做很多事情,然而我还是很希望它能支持跟踪点、kprobe 和 uprobe。我还期待它能支持 eBPF 做内核摘要。目前,sysdig 开发者正在增加容器支持。留意这些内容。

延伸阅读

我关于跟踪器的工作包括:

ftrace:我的 perf-tools 工具集(参考实例目录);我在 lwn.net 上的 关于 ftrace 的文章; LISA14 的发言;还有帖子:函数计数, iosnoopopensnoopexecsnoopTCP 转发, uprobes 以及 USDT

perf_evenets:我的网页 perf_events 实例;SCALE上的发言 Netflix 的 Linux 性能分析;还有帖子 CPU 采样静态追踪点热点图计数内核行追踪off-CPU 时间图

eBPF:帖子 eBPF:迈出一小步,和一些 BPF 工具(我需要发布更多)。

SystemTap:我很久以前写了一篇有点过期的帖子使用 SystemTap。最近,我发布了一些工具 systemtap-lwtools 来演示如何在没有内核诊断信息的情况下使用 SystemTap。

LTTng:我只花了一点时间,还不足以发表任何内容。

ktap:我的网页 ktap 实例包含一些早期版本的单行小程序和脚本。

dtrace4linux:我在系统性能一书中给出了一些实例,并曾经开发了一些小的修复程序,如 timestamps

OL DTrace:由于它直接由 DTrace 转变而来,很多我早期关于 DTrace 的工作都有相关性(如果在这里给出链接的话就太多了,可以在我的主页上搜索)。当它更完善时,我会开发一些特殊工具。

sysdig:我向 fileslower 和 subsecond offset spectrogram 贡献了代码。

其他:我写了关于 strace 的注意事项。

没有更多的跟踪器了!如果你想知道为什么 Linux 不仅仅只有一个跟踪器,或者只用本身的 DTrace,你可以在我的演讲稿从 DTrace 到 Linux 中找到答案,从28张幻灯片开始。

感谢 Deirdré Straughan 的编辑,以及与 General Zoi 的小马宝莉创作者一起创作的跟踪小马。

RHCSA 系列(八): 加固 SSH,设定主机名及启用网络服务

作为一名系统管理员,你将经常使用一个终端模拟器来登录到一个远程的系统中,执行一系列的管理任务。你将很少有机会坐在一个真实的(物理)终端前,所以你需要设定好一种方法来使得你可以登录到你需要去管理的那台远程主机上。

事实上,当你必须坐在一台物理终端前的时候,就可能是你登录到该主机的最后一种方法了。基于安全原因,使用 Telnet 来达到以上目的并不是一个好主意,因为穿行在线缆上的流量并没有被加密,它们以明文方式在传送。

另外,在这篇文章中,我们也将复习如何配置网络服务来使得它在开机时被自动开启,并学习如何设置网络和静态或动态地解析主机名。

RHCSA 系列(八): 加固 SSH,设定主机名及启用网络服务
RHCSA 系列(八): 加固 SSH,设定主机名及启用网络服务

RHCSA: 安全 SSH 和开启网络服务 – Part 8

安装并确保 SSH 通信安全

对于你来说,要能够使用 SSH 远程登录到一个 RHEL 7 机子,你必须安装 opensshopenssh-clientsopenssh-servers 软件包。下面的命令不仅将安装远程登录程序,也会安装安全的文件传输工具以及远程文件复制程序:

# yum update && yum install openssh openssh-clients openssh-servers

注意,也安装上服务器所需的相应软件包是一个不错的主意,因为或许在某个时刻,你想使用同一个机子来作为客户端和服务器。

在安装完成后,如若你想安全地访问你的 SSH 服务器,你还需要考虑一些基本的事情。下面的设定应该出现在文件 /etc/ssh/sshd_config 中。

1、 更改 sshd 守护进程的监听端口,从 22(默认的端口值)改为一个更高的端口值(2000 或更大),但首先要确保所选的端口没有被占用。

例如,让我们假设你选择了端口 2500 。使用 netstat 来检查所选的端口是否被占用:

# netstat -npltu | grep 2500

假如 netstat 没有返回任何信息,则你可以安全地为 sshd 使用端口 2500,并且你应该在上面的配置文件中更改端口的设定,具体如下:

Port 2500

2、 只允许协议 2(LCTT 译注:SSHv1 已经被证明不安全,默认情况下 SSHv1 和 SSHv2 都支持,所以应该显示去掉如下配置行的注释,并只支持 SSHv2。):

Protocol 2

3、 配置验证超时的时间为 2 分钟,不允许以 root 身份登录,并将允许通过 ssh 登录的人数限制到最小:

LoginGraceTime 2m
PermitRootLogin no
AllowUsers gacanepa

4、 假如可能,使用基于公钥的验证方式而不是使用密码:

PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes

这假设了你已经在你的客户端机子上创建了带有你的用户名的一个密钥对,并将公钥复制到了你的服务器上。

配置网络和名称的解析

1、 每个系统管理员都应该对下面这个系统配置文件非常熟悉:

  • /etc/hosts 被用来在小型网络中解析“名称” <---> “IP 地址”。

文件 /etc/hosts 中的每一行拥有如下的结构:

IP address - Hostname - FQDN

例如,

192.168.0.10    laptop  laptop.gabrielcanepa.com.ar

2、 /etc/resolv.conf 特别指定 DNS 服务器的 IP 地址和搜索域,它被用来在没有提供域名后缀时,将一个给定的查询名称对应为一个全称域名。

在正常情况下,你不必编辑这个文件,因为它是由系统管理的。然而,若你非要改变 DNS 服务器的 IP 地址,建议你在该文件的每一行中,都应该遵循下面的结构:

nameserver - IP address

例如,

nameserver 8.8.8.8

3、 /etc/host.conf 特别指定在一个网络中主机名被解析的方法和顺序。换句话说,告诉名称解析器使用哪个服务,并以什么顺序来使用。

尽管这个文件由几个选项,但最为常见和基本的设置包含如下的一行:

order bind,hosts

它意味着解析器应该首先查看 resolv.conf 中特别指定的域名服务器,然后到 /etc/hosts 文件中查找解析的名称。

4、 /etc/sysconfig/network 包含了所有网络接口的路由和全局主机信息。下面的值可能会被使用:

NETWORKING=yes|no
HOSTNAME=value

其中的 value 应该是全称域名FQDN

GATEWAY=XXX.XXX.XXX.XXX

其中的 XXX.XXX.XXX.XXX 是网关的 IP 地址。

GATEWAYDEV=value

在一个带有多个网卡的机器中, value 为网关设备名,例如 enp0s3。

5、 位于 /etc/sysconfig/network-scripts 中的文件(网络适配器配置文件)。

在上面提到的目录中,你将找到几个被命名为如下格式的文本文件。

ifcfg-name

其中 name 为网卡的名称,由 ip link show 返回:

检查网络连接状态

检查网络连接状态

例如:

网络文件

网络文件

除了环回接口(loopback),你还可以为你的网卡指定相似的配置。注意,假如设定了某些变量,它们将为这个指定的接口覆盖掉 /etc/sysconfig/network 中定义的默认值。在这篇文章中,为了能够解释清楚,每行都被加上了注释,但在实际的文件中,你应该避免加上注释:

HWADDR=08:00:27:4E:59:37 ### 网卡的 MAC 地址
TYPE=Ethernet ### 连接类型
BOOTPROTO=static ### 这代表着该网卡指定了一个静态地址。
                      ### 如果这个值指定为 dhcp,这个网卡会从 DHCP 服务器获取 IP 地址,并且就不应该出现以下两行。
IPADDR=192.168.0.18
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
NM_CONTROLLED=no ### 应该给以太网卡设置,以便可以让 NetworkManager 可以修改这个文件。
NAME=enp0s3
UUID=14033805-98ef-4049-bc7b-d4bea76ed2eb
ONBOOT=yes ### 操作系统会在启动时打开这个网卡。

设定主机名

在 RHEL 7 中, hostnamectl 命令被同时用来查询和设定系统的主机名。

要展示当前的主机名,输入:

# hostnamectl status
RHCSA 系列(八): 加固 SSH,设定主机名及启用网络服务
RHCSA 系列(八): 加固 SSH,设定主机名及启用网络服务

检查系统的主机名

要更改主机名,使用

# hostnamectl set-hostname [new hostname]

例如,

# hostnamectl set-hostname cinderella

要想使得更改生效,你需要重启 hostnamed 守护进程(这样你就不必因为要应用更改而登出并再登录系统):

# systemctl restart systemd-hostnamed
RHCSA 系列(八): 加固 SSH,设定主机名及启用网络服务
RHCSA 系列(八): 加固 SSH,设定主机名及启用网络服务

设定系统主机名

另外, RHEL 7 还包含 nmcli 工具,它可被用来达到相同的目的。要展示主机名,运行:

# nmcli general hostname

且要改变主机名,则运行:

# nmcli general hostname [new hostname]

例如,

# nmcli general hostname rhel7

使用 nmcli 命令来设定主机名

使用 nmcli 命令来设定主机名

在开机时开启网络服务

作为本文的最后部分,就让我们看看如何确保网络服务在开机时被自动开启。简单来说,这个可通过创建符号链接到某些由服务的配置文件中的 [Install] 小节中指定的文件来实现。

以 firewalld(/usr/lib/systemd/system/firewalld.service) 为例:

[Install]
WantedBy=basic.target
Alias=dbus-org.fedoraproject.FirewallD1.service

要开启该服务,运行:

# systemctl enable firewalld

另一方面,要禁用 firewalld,则需要移除符号链接:

# systemctl disable firewalld

在开机时开启服务

在开机时开启服务

总结

在这篇文章中,我们总结了如何安装 SSH 及使用它安全地连接到一个 RHEL 服务器;如何改变主机名,并在最后如何确保在系统启动时开启服务。假如你注意到某个服务启动失败,你可以使用 systemctl status -l [service]journalctl -xn 来进行排错。

请随意使用下面的评论框来让我们知晓你对本文的看法。提问也同样欢迎。我们期待着你的反馈!


via: http://www.tecmint.com/rhcsa-series-secure-ssh-set-hostname-enable-network-services-in-rhel-7/

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

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

MySQL DBA 面试全揭秘

本文起源于有同学留言回复说想了解下MySQL DBA面试时可能涉及到的知识要点,那我们今天就来大概谈谈吧。

MySQL DBA职位最近几年特别热门,不少朋友让我帮忙推荐什么的,也有很多公司找不到合适的DBA。原因很简单,优秀的人才要么被大公司圈起来了,要么被创业公司高薪挖走,如果你既不是大公司,又不能出得起高价钱的土豪公司,想要找到优秀人才的几率堪比买彩票中奖的概率,哈哈。

本文可以作为MySQL DBA面试官,以及候选人的双向参考 :)

MySQL DBA 面试全揭秘
MySQL DBA 面试全揭秘

面试流程

接下来先说下我以往在做MySQL DBA面试时的过程(套路):

  1. 先自我介绍后,再让候选人花2-5分钟做下自我简介

    • 有不少人可能对自我简介这个环节嗤之以鼻,觉得多此一举,尤其是技术能力相对较好的更是如此。其实不然,通过短短2-5分钟的自我简介,很快就能考察出候选人是否有用心准备本次面试,其归纳总结能力,以及个人自信心等多方面信息。
    • 因此,如果候选人看中这次面试机会的话,还请好好做下功课,做足准备。比如了解下目标公司的大致情况,主营业务,产品特色。可能的话,找同行打听可能的面试官背景信息,没准是校友、以前在同一家公司呆过、或者有其他共同点,这可能会使得面试过程更为顺利。
    • 有心的候选人在面试官自我介绍时,就可以趁机也考察对方的情况。通常第一轮面试官很可能是你未来的直接主管,从面试过程中你和对方的沟通交流是否顺利也可预见到未来工作上配合的顺利程度。
  2. 暖身完,就开始进入主题,从候选人的简历入手,挑选其中感兴趣的关键点逐条交流,有几个要点:

    • 和应聘职位关联性较高的技术要素,需要逐个过一遍,大致了解候选人对于这些技术要素的掌握程度;
    • 挑选2-3个技术关键点,对候选人穷追猛打深入探讨,了解其真正的掌握程度,是泛泛的了解,还是知其所以然的那种,由此也可以考察候选人的学习方法、心态,是随波逐流抑或专精专注。
    • 候选人每次跳槽经历也需要关注,究竟何种原因导致跳槽,每次跳槽是否其职业层次也跟着提高。由此考擦候选人的职业规划是否清晰,是否过于随性(任性)。否则的话,可能在下一家公司也待不了多久就会因为各种原因(最常见的就是薪资、或者对主管不服气)而跳槽。
    • 候选人简历中特意提及的重点项目、事件、荣誉,也可以做深入的交流。
  3. 重点技术要素考察完毕,可以聊聊职业发展等其他方面的话题,比如

    • 为什么选择我司;
    • 如果还有其他公司的机会,如何权衡选择哪个offer,最主要的判断标准是什么;
    • 期望什么样的工作环境,团队环境,以及哪种风格的主管;
    • 对什么事情最在乎,或最不在乎;
    • 除了薪资福利,对公司、工作的期望是怎样的。

专业技术考察

具体到技术实力考查上,通常可以关注几个要点:

基础知识考察

基础知识,尤其是一些理论知识,例如:

  • MySQL有哪些索引类型,这是个半开放式命题;
    • 数据结构角度可分为B+树索引哈希索引、以及不常用的FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)和R-Tree索引(用于对GIS数据类型创建SPATIAL索引);
    • 从物理存储角度可分为聚集索引clustered index非聚集索引non-clustered index
    • 从逻辑角度可分为主键索引普通索引,或者单列索引多列索引唯一索引非唯一索引等等。需要掌握这些不同概念之间的区别,例如主键索引和唯一索引的区别是什么
  • 为什么InnoDB表最好要有自增列做主键;
  • 为什么需要设置双1才能保证主从数据的一致性;
  • 有几种binlog格式,及其区别是什么;
  • 如何确认MySQL replication真正的复制延迟是多少;
  • 有过哪些印象深刻的实践经验。

通过考察候选人的基础知识掌握程度,可侧面反映候选人对学习的态度,是否仅浅层面的了解。

核心技术能力考察

核心关键技术能力,例如:

  • 怎么做的MySQL备份恢复方案及策略,为什么那么做,用什么工具;
  • MySQL主从复制的具体原理是什么,实际使用过程中,遇到过哪些坑,怎么解决的;
  • 对一个大表做在线DDL,怎么进行实施的才能尽可能降低影响;
  • MyISAM和InnoDB都有哪些不同之处;
  • InnoDB的体系结构是否能讲的清楚,至少说出个大概;
  • 假设现在服务器负载很高,都有哪些性能问题排查思路,以及优化的方案;
  • 什么是死锁,什么是锁等待,如何优化;
  • 关于MySQL及InnoDB优化,讲讲自己的见解或者实践经验
  • 如何确定及实施MySQL高可用方案,不同方案的优缺点对比;
  • 一定规模的MySQL自动化运维经验如何;
  • SCHEMA设计方面的经验如何;
  • 基于MySQL所做过的一些数据库架构方案设计、实施经验。

通过考察候选人对这些核心关键技术的掌握程度,可知晓候选人对深层次知识的掌握情况,除了实践,理论方面掌握了多少。

潜力考察

发展潜力以及学习能力,例如:

  • Linux的掌握程度,以及Shell、Python、Perl等常用运维开发语言的掌握程度;
  • 对服务器硬件设备,存储设备的了解程度;
  • 信息安全,网络知识的了解程度;
  • 其他语言,例如C、C++、JAVA、PHP、GO是否有所了解。

这些知识对一般的DBA可能不太重要,但想要成为资深DBA或数据库架构师的话,这些知识是必不可少的。

 

先啰嗦说这么多吧,希望对有志成为DBA的同学有些帮助,加油加油。 

关于MySQL的方方面面大家想了解什么,可以直接留言回复,我会从中选择一些热门话题进行分享。 同时希望大家多多转发,多一些阅读量是老叶继续努力分享的绝佳助力,谢谢大家 🙂

优秀API设计的十大原则

每个软件开发人员都使用API。“优秀”的API设计就像魔法。不过,我不知道有多少人可以解释为什么有的API很复杂、很难学,而有的则干净、简单、使用起来堪称是一种快乐。关于这个问题,我将在文中回答,并提供优秀API设计的十条法则。

1.只做你今天需要的

这是最顶级的规则。只解决今天必须解决的问题,最小化需要完成的答案。解决明天的问题的诱惑力是巨大的。但是一定要顶住诱惑!不要提前发布代码,重点是注重缩小发布周期。如果需要花几个小时的时间来回答新问题,那么就不用再猜测明天会出现什么问题了。

2.API模块化

将大型问题转化为规模较小的、可单独解决的问题。模块化API更容易学习,并且可以随时间而改变。你可以用新模块替代旧模块。可以一个一个地教导模块。也可以将API的实验部分从稳定或传统的部分中单独分出来。

3.使用结构化语法

使用结构化的API语法:用thing.action或thing.property代替do_action_with_thing。语法将自然而然地适应模块化的方法,其中每个模块是一个类。

4.使用自然语义

不要发明新概念。只使用开发人员众所周知的概念,作为类系统的基础。如果你发现自己需要解释概念,那说明你出错了:要么你在解决以后的问题,要么你正在错误地构建API。

5.API的自我约定

每个类都要严格使用相同的样式和约定。一致性是指当一个人学会这一个类时,他就能够融会贯通地掌握全部的类。文档化约定,让它们成为贡献者必须的标准。

6.API的可扩展性

易扩展性有许多好处,并不仅仅在于受到贡献者的欢迎。它还可以让你延缓实现功能,因为“如果需要的话,后面再添加也很方便”。不需要的功能就不添加,这也是一种双赢。

7.完全测试

每个类和方法必须经过恶意代码的完全测试。要像写代码一样写测试,然后像API提供给外界约定文档一样使用测试。每当代码改变的时候就运行这些测试。不要担心代码覆盖率。重要的是外部约定。也可以考虑使用约定生命周期。

8.分层式成长

保持API突出重点,然后在顶部将新的API分层,以便于它们能随着时间的推移成长。可扩展性并不意味着无限期的成长。明确API的范围,并在范围内执行。

9.保持简单易用

最终的测试要看API的简单易用程度。你写的例子,能不能让你的代码看起来更简单?你是不是强迫用户说明他们不在乎的选项?有没有毫无价值的额外步骤?要注重约减少API的可视面积。

10.保持可移植性

不要让系统概念泄漏到API。整洁有目的地抽象:这个API可以运行在任何操作系统上。API必须能够隐藏实现,但要注意第4条规则,以及要使用自然抽象。

欢迎大家说说自己的看法。

如何在 linux 中搭建 FTP 服务

如何在 linux 中搭建 FTP 服务
如何在 linux 中搭建 FTP 服务

在本教程中,我将会介绍如何搭建你自己的FTP服务。但是,首先我们应该来的学习一下FTP是什么。

FTP是什么?

FTP文件传输协议File Transfer Protocol的缩写。顾名思义,FTP用于计算机之间通过网络进行文件传输。你可以通过FTP在计算机账户间进行文件传输,也可以在账户和桌面计算机之间传输文件,或者访问在线软件归档。但是,需要注意的是多数的FTP站点的使用率非常高,可能需要多次重连才能连接上。

FTP地址和HTTP地址(即网页地址)非常相似,只是FTP地址使用ftp://前缀而不是http://

FTP服务器是什么?

通常,拥有FTP地址的计算机是专用于接收FTP连接请求的。一台专用于接收FTP连接请求的计算机即为FTP服务器或者FTP站点。

现在,我们来开始一个特别的冒险,我们将会搭建一个FTP服务用于和家人、朋友进行文件共享。在本教程,我们将以vsftpd作为ftp服务。

VSFTPD是一个自称为最安全的FTP服务端软件。事实上VSFTPD的前两个字母表示“非常安全的very secure”。该软件的构建绕开了FTP协议的漏洞。

尽管如此,你应该知道还有更安全的方法进行文件管理和传输,如:SFTP(使用OpenSSH)。FTP协议对于共享非敏感数据是非常有用和可靠的。

使用 rpm 安装VSFTPD:

你可以使用如下命令在命令行界面中快捷的安装VSFTPD:

dnf -y install vsftpd

使用 deb 安装VSFTPD:

你可以使用如下命令在命令行界面中快捷的安装VSFTPD:

sudo apt-get install vsftpd

在Arch 中安装VSFTPD:

你可以使用如下命令在命令行界面中快捷的安装VSFTPD:

sudo pacman -S vsftpd

配置FTP服务

多数的VSFTPD配置项都在/etc/vsftpd.conf配置文件中。这个文件本身已经有非常良好的文档说明了,因此,在本节中,我只强调一些你可能进行修改的重要选项。使用man页面查看所有可用的选项和基本的 文档说明:

man vsftpd.conf

根据文件系统层级标准,FTP共享文件默认位于/srv/ftp目录中。

允许上传:

为了允许ftp用户可以修改文件系统的内容,如上传文件等,“write_enable”标志必须设置为 YES。

write_enable=YES

允许本地(系统)用户登录:

为了允许文件/etc/passwd中记录的用户可以登录ftp服务,“local_enable”标记必须设置为YES。

local_enable=YES

匿名用户登录

下面配置内容控制匿名用户是否允许登录:

# 允许匿名用户登录
anonymous_enable=YES
# 匿名登录不需要密码(可选)
no_anon_password=YES
# 匿名登录的最大传输速率,Bytes/second(可选)
anon_max_rate=30000
# 匿名登录的目录(可选)
anon_root=/example/directory/

根目录限制(Chroot Jail)

( LCTT 译注:chroot jail是类unix系统中的一种安全机制,用于修改进程运行的根目录环境,限制该线程不能感知到其根目录树以外的其他目录结构和文件的存在。详情参看chroot jail

有时我们需要设置根目录(chroot)环境来禁止用户离开他们的家(home)目录。在配置文件中增加/修改下面配置开启根目录限制(Chroot Jail):

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

“chroot_list_file”变量指定根目录限制所包含的文件/目录( LCTT 译注:即用户只能访问这些文件/目录)

最后你必须重启ftp服务,在命令行中输入以下命令:

sudo systemctl restart vsftpd

到此为止,你的ftp服务已经搭建完成并且启动了。


via: http://itsfoss.com/set-ftp-server-linux/

作者:alimiracle 译者:cvsher 校对:wxy

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

开启 Ubuntu 系统自动升级

在学习如何开启Ubuntu系统自动升级之前,先解释下为什么需要自动升级。

默认情况下,ubuntu每天一次检查更新。但是一周只会弹出一次软件升级提醒,除非当有安全性升级时,才会立即弹出。所以,如果你已经使用Ubuntu一段时间,你肯定很熟悉这个画面:

Ubuntu软件升级提醒

但是做为一个正常桌面用户,根本不会去关心有什么更新细节。而且这个提醒完全就是浪费时间,你肯定信任Ubuntu提供的升级补丁,对不对?所以,大部分情况你肯定会选择“现在安装”,对不对?

所以,你需要做的就只是点一下升级按钮。现在,明白为什么需要自动系统升级了吧?开启自动系统升级意味着所有最新的更新都会自动下载并安装,并且没有请求确认。是不是很方便?

开启Ubuntu自动升级

演示使用Ubuntu15.04,Ubuntu 14.04步骤类似。

打开Unity Dash ,找到软件&更新:

Ubuntu 软件升级设置

打开软件资源设置,切换到升级标签:

Ubuntu 软件升级设置

可以发现,默认设置就是每日检查并立即提醒安全升级。

改变软件更新频率

改变 ‘当有安全升级’和‘当有其他升级’的选项为:下载并自动安装。

Automatic updates in Ubuntu

关闭对话框完成设定。这样每次Ubuntu检查更新后就会自动升级。事实上,这篇文章十分类似改变Ubuntu升级提醒频率

你喜欢自动升级还是手动安装升级呢?欢迎评论。


via: http://itsfoss.com/automatic-system-updates-ubuntu/

作者:Abhishek 译者:Vic020/VicYu 校对:wxy

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

RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器

Web 服务器(也被称为 HTTP 服务器)是在网络中将内容(最为常见的是网页,但也支持其他类型的文件)进行处理并传递给客户端的服务。

FTP 服务器是最为古老且最常使用的资源之一(即便到今天也是这样),在身份认证不是必须的情况下,它可通过客户端在一个网络访问文件,因为 FTP 使用没有加密的用户名和密码,所以有些情况下不需要验证也行。

在 RHEL 7 中可用的 web 服务器是版本号为 2.4 的 Apache HTTP 服务器。至于 FTP 服务器,我们将使用 Very Secure Ftp Daemon (又名 vsftpd) 来建立用 TLS 加固的连接。

RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器
RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器

RHCSA: 安装,配置及加固 Apache 和 FTP 服务器 – Part 9

在这篇文章中,我们将解释如何在 RHEL 7 中安装、配置和加固 web 和 FTP 服务器。

安装 Apache 和 FTP 服务器

在本指导中,我们将使用一个静态 IP 地址为 192.168.0.18/24 的 RHEL 7 服务器。为了安装 Apache 和 VSFTPD,运行下面的命令:

# yum update && yum install httpd vsftpd

当安装完成后,这两个服务在开始时是默认被禁用的,所以我们需要暂时手动开启它们并让它们在下一次启动时自动地开启它们:

# systemctl start httpd
# systemctl enable httpd
# systemctl start vsftpd
# systemctl enable vsftpd

另外,我们必须打开 80 和 21 端口,它们分别是 web 和 ftp 守护进程监听的端口,为的是允许从外面访问这些服务:

# firewall-cmd --zone=public --add-port=80/tcp --permanent
# firewall-cmd --zone=public --add-service=ftp --permanent
# firewall-cmd --reload

为了确认 web 服务工作正常,打开你的浏览器并输入服务器的 IP,则你应该可以看到如下的测试页面:

RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器
RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器

确认 Apache Web 服务器

对于 ftp 服务器,在确保它如期望中的那样工作之前,我们必须进一步地配置它,我们将在几分钟后来做这件事。

配置并加固 Apache Web 服务器

Apache 的主要配置文件位于 /etc/httpd/conf/httpd.conf 中,但它可能依赖 /etc/httpd/conf.d 中的其他文件。

尽管默认的配置对于大多数的情形都够用了,但熟悉在 官方文档 中介绍的所有可用选项是一个不错的主意。

同往常一样,在编辑主配置文件前先做一个备份:

# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date +%Y%m%d)

然后用你钟爱的文本编辑器打开它,并查找下面这些变量:

  • ServerRoot: 服务器的配置,错误和日志文件保存的目录。
  • Listen: 通知 Apache 去监听特定的 IP 地址或端口。
  • Include: 允许包含其他配置文件,要包含的文件必须存在,否则,服务器将会失败。它恰好与 IncludeOptional 相反,假如特定的配置文件不存在,它将静默地忽略掉它们。
  • UserGroup: 运行 httpd 服务的用户/组的名称。
  • DocumentRoot: Apache 为你的文档所服务的目录。默认情况下,所有的请求将在这个目录中被获取,但符号链接和别名可能会被用于指向其他位置。
  • ServerName: 这个指令将设定用于识别它自身的主机名(或 IP 地址)和端口。

安全措施的第一步将包含创建一个特定的用户和组(如 tecmint/tecmint)来运行 web 服务器,以及更改默认的端口为一个更高的端口(在这个例子中为 9000) (LCTT 译注:如果你的 Web 服务器对外公开提供服务,则不建议修改为非默认端口。):

ServerRoot "/etc/httpd"
Listen 192.168.0.18:9000
User tecmint
Group tecmint
DocumentRoot "/var/www/html"
ServerName 192.168.0.18:9000

你可以使用下面的命令来测试配置文件:

# apachectl configtest

假如一切 OK,接着重启 web 服务器。

# systemctl restart httpd

并别忘了在防火墙中开启新的端口(并禁用旧的端口):

# firewall-cmd --zone=public --remove-port=80/tcp --permanent
# firewall-cmd --zone=public --add-port=9000/tcp --permanent
# firewall-cmd --reload

请注意,由于 SELinux 策略,你只能给给 web 服务器使用如下命令所返回的端口。

# semanage port -l | grep -w '^http_port_t'

假如你想让 httpd 服务使用另一个端口(如 TCP 端口 8100),你必须将它加到 SELinux 的端口上下文:

# semanage port -a -t http_port_t -p tcp 8100

添加 Apache 端口到 SELinux 策略

添加 Apache 端口到 SELinux 策略

为了进一步加固你安装的 Apache,请遵循以下步骤:

  1. 运行 Apache 的用户不应该拥有访问 shell 的能力:

    # usermod -s /sbin/nologin tecmint
    
  2. 禁用目录列表功能,这是为了阻止浏览器展示一个未包含 index.html 文件的目录里的内容。

    编辑 /etc/httpd/conf/httpd.conf (以及虚拟主机的配置文件,假如有的话),并确保出现在顶层的和Directory 块中的 Options 指令都被设置为 None:

    Options None
    
  3. 在 HTTP 响应中隐藏有关 web 服务器和操作系统的信息。像下面这样编辑文件 /etc/httpd/conf/httpd.conf

    ServerTokens Prod
    ServerSignature Off
    

现在,你已经做好了从 /var/www/html 目录开始服务内容的准备了。

配置并加固 FTP 服务器

和 Apache 的情形类似, Vsftpd 的主配置文件 /etc/vsftpd/vsftpd.conf 带有详细的注释,且虽然对于大多数的应用实例,默认的配置应该足够了,但为了更有效率地操作 ftp 服务器,你应该开始熟悉相关的文档和 man 页 man vsftpd.conf(对于这点,再多的强调也不为过!)。

在我们的示例中,使用了这些指令:

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
allow_writeable_chroot=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

通过使用 chroot_local_user=YES,(默认情况下)本地用户在登录之后,将被限制在以用户的家目录为 chroot 监狱的环境中。这意味着本地用户将不能访问除其家目录之外的任何文件。

最后,为了让 ftp 能够在用户的家目录中读取文件,设置如下的 SELinux 布尔值:

# setsebool -P ftp_home_dir on

现在,你可以使用一个客户端例如 Filezilla 来连接一个 ftp 服务器:

RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器
RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器

查看 FTP 连接

注意, /var/log/xferlog 日志将会记录下载和上传的情况,这与上图的目录列表一致:

监视 FTP 的下载和上传情况

监视 FTP 的下载和上传情况

另外请参考: 在 Linux 系统中使用 Trickle 来限制应用使用的 FTP 网络带宽

总结

在本教程中,我们解释了如何设置 web 和 ftp 服务器。由于这个主题的广泛性,涵盖这些话题的所有方面是不可能的(如虚拟主机)。因此,我推荐你也阅读这个网站中有关 Apache 的其他卓越的文章。


via: http://www.tecmint.com/rhcsa-series-install-and-secure-apache-web-server-and-ftp-in-rhel/

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

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

你知道URL、URI和URN三者之间的区别吗?

这是一个经典的技术争论,许多人都会自问:URL、URI,很可能还有URN,它们之间的区别是什么。虽然,现在我们简单地把 URN 和 URL 都看做 URI,但严格来说URI可以进一步划分为URL、URN或者这两者的组合,所以了解这三者之间的区别将会非常有趣并让人受益匪浅。如果你恰好在某个地方碰到了这些东西,那么至少应该知道它们的含义。

我认为,尽管对一般人来说,不了解这三个缩略词之间的技术差异以及它们各自的含义并不是什么问题。但是,如果你作为一个计算机科学家、一个Web开发者、一个系统管理员,或者更笼统地说,你工作在IT领域,那么了解这些知识就非常有必要了。

这篇文章旨在于清楚地讲解URL、URI和URN之间的区别,帮助你快速理解这些必备知识。你是不是对这个话题也感到困惑?那么我们开始吧!

你知道URL、URI和URN三者之间的区别吗?
你知道URL、URI和URN三者之间的区别吗?

起源

这三个缩略词是Tim Berners-Lee在一篇名为RFC 3986: Uniform Resource Identifier (URI): Generic Syntax的文档中定义的互联网标准追踪协议。

引文:

统一资源标识符(URI)提供了一个简单、可扩展的资源标识方式。URI规范中的语义和语法来源于万维网全球信息主动引入的概念,万维网从1990年起使用这种标识符数据,并被描述为“万维网中的统一资源描述符”。

区别

首先我们要弄清楚一件事:URL和URN都是URI的子集

换言之,URL和URN都是URI,但是URI不一定是URL或者URN。为了更好的理解这个概念,看下面这张图片。

你知道URL、URI和URN三者之间的区别吗?
你知道URL、URI和URN三者之间的区别吗?

通过下面的例子(源自 Wikipedia),我们可以很好地理解URN 和 URL之间的区别。如果是一个人,我们会想到他的姓名和住址。

URL类似于住址,它告诉你一种寻找目标的方式(在这个例子中,是通过街道地址找到一个人)。要知道,上述定义同时也是一个URI。

相对地,我们可以把一个人的名字看作是URN;因此可以用URN来唯一标识一个实体。由于可能存在同名(姓氏也相同)的情况,所以更准确地说,人名这个例子并不是十分恰当。更为恰当的是书籍的ISBN码和产品在系统内的序列号,尽管没有告诉你用什么方式或者到什么地方去找到目标,但是你有足够的信息来检索到它。引自这篇文章:

所有的URN都遵循如下语法(引号内的短语是必须的):

::="urn:"":"

其中NID是命名空间标识符,NSS是标识命名空间的特定字符串。

一个用于理解这三者的例子

我们来看一下上述概念如何应用于与我们息息相关的互联网。

再次引用Wikipedia ,这些引文给出的解释,比上面人员地址的例子更为专业:

关于URL:

URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。

关于URN:

URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。

现在,如果到Web上去看一下,你会找出很多例子,这比其他东西更容易让人困惑。我只展示一个例子,非常简单清楚地告诉你在互联网中URI 、URL和URN之间的不同。

我们一起来看下面这个虚构的例子。这是一个URI

http://bitpoetry.io/posts/hello.html#intro

我们开始分析 http://是定义如何访问资源的方式。另外 bitpoetry.io/posts/hello.html是资源存放的位置,那么,在这个例子中, #intro是资源。 

URL是URI的一个子集,告诉我们访问网络位置的方式。在我们的例子中,URL应该如下所示:

http://bitpoetry.io/posts/hello.html

URN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式,如下所示: 

bitpoetry.io/posts/hello.html#intro

就是这样。现在你应该能够辨别出URL和URN之间的不同。

如果你忘记了这篇文章的内容,至少要记住一件事:URI可以被分为URL、URN或两者的组合。如果你一直使用URI这个术语,就不会有错。

为了纠正一些错误,已经更新了这篇文章。如果你发现新的错误,无论是技术上的还是语法上的,请不要犹豫,告诉我们吧!

Mhddfs:将多个小分区合并成一个大的虚拟存储

让我们假定你有30GB的电影,并且你有3个驱动器,每个的大小为20GB。那么,你会怎么来存放东西呢?

很明显,你可以将你的视频分割成2个或者3个不同的卷,并将它们手工存储到驱动器上。这当然不是一个好主意,它成了一项费力的工作,它需要你手工干预,而且花费你大量时间。

另外一个解决方案是创建一个 RAID磁盘阵列。然而,RAID在存储可靠性,磁盘空间可用性差等方面声名狼藉。另外一个解决方案,就是mhddfs。

Combine Multiple Partitions in Linux

Mhddfs——在Linux中合并多个分区

mhddfs是一个用于Linux的设备驱动,它可以将多个挂载点合并到一个虚拟磁盘中。它是一个基于FUSE的驱动,提供了一个用于大数据存储的简单解决方案。它可以将所有小文件系统合并,创建一个单一的大虚拟文件系统,该文件系统包含其成员文件系统的所有内容,包括文件和空闲空间。

你为什么需要Mhddfs?

你的所有存储设备会创建为一个单一的虚拟池,它可以在启动时被挂载。这个小工具可以智能地照看并处理哪个存储满了,哪个存储空着,以及将数据写到哪个存储中。当你成功创建虚拟驱动器后,你可以使用SAMBA来共享你的虚拟文件系统。你的客户端将在任何时候都看到一个巨大的驱动器和大量的空闲空间。

Mhddfs特性

  • 获取文件系统属性和系统信息。
  • 设置文件系统属性。
  • 创建、读取、移除和写入目录和文件。
  • 在单一设备上支持文件锁和硬链接。
mhddfs的优点 mhddfs的缺点
适合家庭用户 mhddfs驱动没有内建在Linux内核中
运行简单 运行时需要大量处理能力
没有明显的数据丢失 没有冗余解决方案
不需要分割文件 不支持移动硬链接
可以添加新文件到组成的虚拟文件系统  
可以管理文件保存的位置  
支持扩展文件属性  

Linux中安装Mhddfs

在Debian及其类似的移植系统中,你可以使用下面的命令来安装mhddfs包。

# apt-get update && apt-get install mhddfs

Install Mhddfs on Debian based Systems

安装Mhddfs到基于Debian的系统中

在RHEL/CentOS Linux系统中,你需要开启epel仓库,然后执行下面的命令来安装mhddfs包。

# yum install mhddfs

在Fedora 22及以上系统中,你可以通过dnf包管理来获得它,就像下面这样。

# dnf install mhddfs

Install Mhddfs on Fedora

安装Mhddfs到Fedora

如果万一mhddfs包不能从epel仓库获取到,那么你需要解决下面的依赖,然后像下面这样来编译源码并安装。

  • FUSE头文件
  • GCC
  • libc6头文件
  • uthash头文件
  • libattr1头文件(可选)

接下来,只需从下面建议的地址下载最新的源码包,然后编译。

# wget http://mhddfs.uvw.ru/downloads/mhddfs_0.1.39.tar.gz
# tar -zxvf mhddfs*.tar.gz
# cd mhddfs-0.1.39/
# make

你应该可以在当前目录中看到mhddfs的二进制文件,以root身份将它移动到/usr/bin/和/usr/local/bin/中。

# cp mhddfs /usr/bin/
# cp mhddfs /usr/local/bin/

一切搞定,mhddfs已经可以用了。

我怎么使用Mhddfs?

1、 让我们看看当前所有挂载到我们系统中的硬盘。

$ df -h

Check Mounted Devices

样例输出

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       511M  132K  511M   1% /boot/efi
/dev/sda2       451G   92G  336G  22% /
/dev/sdb1       1.9T  161G  1.7T   9% /media/avi/BD9B-5FCE
/dev/sdc1       555M  555M     0 100% /media/avi/Debian 8.1.0 M-A 1

注意这里的‘挂载点’名称,我们后面会使用到它们。

2、 创建目录‘/mnt/virtual_hdd’,所有这些文件系统将会在这里组织到一起。

# mkdir /mnt/virtual_hdd

3、 然后,挂载所有文件系统。你可以通过root或者FUSE组中的某个用户来完成。

# mhddfs /boot/efi, /, /media/avi/BD9B-5FCE/, /media/avi/Debian\ 8.1.0\ M-A\ 1/ /mnt/virtual_hdd  -o allow_other

Mount All File System in Linux

在Linux中挂载所有文件系统

注意:这里我们使用了所有硬盘的挂载点名称,很明显,你的挂载点名称会有所不同。也请注意“-o allow_other”选项可以让这个虚拟文件系统让其它所有人可见,而不仅仅是创建它的人。

4、 现在,运行“df -h”来看看所有文件系统。它应该包含了你刚才创建的那个。

    $ df -h

Verify Virtual File System Mount

验证虚拟文件系统挂载

你可以像对已挂在的驱动器那样给虚拟文件系统应用所有的选项。

5、 要在每次系统启动创建这个虚拟文件系统,你应该以root身份添加下面的这行代码(在你那里会有点不同,取决于你的挂载点)到/etc/fstab文件的末尾。

mhddfs# /boot/efi, /, /media/avi/BD9B-5FCE/, /media/avi/Debian\ 8.1.0\ M-A\ 1/ /mnt/virtual_hdd fuse defaults,allow_other 0 0

6、 如果在任何时候你想要添加/移除一个新的驱动器到/从虚拟硬盘,你可以挂载一个新的驱动器,拷贝/mnt/vritualhdd的内容,卸载卷,弹出你要移除的的驱动器并/或挂载你要包含的新驱动器。使用mhddfs命令挂载全部文件系统到Virtualhdd下,这样就全部搞定了。

我怎么卸载Virtual_hdd?

卸载virtual_hdd相当简单,就像下面这样

# umount /mnt/virtual_hdd

Unmount Virtual Filesystem

卸载虚拟文件系统

注意,是umount,而不是unmount,很多用户都输错了。

到现在为止全部结束了。我正在写另外一篇文章,你们一定喜欢读的。到那时,请保持连线。请在下面的评论中给我们提供有用的反馈吧。请为我们点赞并分享,帮助我们扩散。


via: http://www.tecmint.com/combine-partitions-into-one-in-linux-using-mhddfs/

作者:Avishek Kumar 译者:GOLinux 校对:wxy

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

如何在 Linux 中整理磁盘碎片

有一个神话是 linux 的磁盘从来不需要整理碎片。在大多数情况下这是真的,大多数因为是使用的是优秀的日志文件系统(ext3、4等等)来处理文件系统。然而,在一些特殊情况下,碎片仍旧会产生。如果正巧发生在你身上,解决方法很简单。

什么是磁盘碎片

文件系统会按块更新文件,如果这些块没有连成一整块而是分布在磁盘的各个角落中时,就会形成磁盘碎片。这对于 FAT 和 FAT32 文件系统而言是这样的。在 NTFS 中这种情况有所减轻,但在 Linux(extX)中却几乎不会发生。下面是原因:

在像 FAT 和 FAT32 这类文件系统中,文件紧挨着写入到磁盘中。文件之间没有空间来用于增长或者更新:

NTFS 中在文件之间保留了一些空间,因此有空间进行增长。但因块之间的空间是有限的,碎片也会随着时间出现。

Linux 的日志型文件系统采用了一个不同的方案。与文件相互挨着不同,每个文件分布在磁盘的各处,每个文件之间留下了大量的剩余空间。这就给文件更新和增长留下了很大的空间,碎片很少会发生。

此外,碎片一旦出现了,大多数 Linux 文件系统会尝试将文件和块重新连续起来。

Linux 中的磁盘整理

除非你用的是一个很小的硬盘或者空间不够了,不然 Linux 很少会需要磁盘整理。一些可能需要磁盘整理的情况包括:

  • 如果你编辑的是大型视频文件或者 RAW 照片,但磁盘空间有限
  • 如果你使用一个老式硬件,如旧笔记本,你的硬盘会很小
  • 如果你的磁盘开始满了(大约使用了85%)
  • 如果你的家目录中有许多小分区

最好的解决方案是购买一个大硬盘。如果不可能,磁盘碎片整理就很有用了。

如何检查碎片

fsck 命令会为你做这个,换句话说,如果你可以在 LiveCD 中运行它,那么就可以用于所有卸载的分区

这一点很重要:在已经挂载的分区中运行 fsck 将会严重危害到你的数据和磁盘

你已经被警告过了。开始之前,先做一个完整的备份。

免责声明: 本文的作者与本站将不会对您的文件、数据、系统或者其他损害负责。你需要自己承担风险。如果你继续,你需要接受并了解这点。

你应该启动到一个 live 会话中(如使用安装磁盘,系统救援CD等)并在你卸载的分区上运行 fsck 。要检查是否有任何问题,请在使用 root 权限运行下面的命令:

fsck -fn [/path/to/your/partition]

您可以运行以下命令找到分区的路径

sudo fdisk -l

有一个在已挂载的分区中运行 fsck(相对)安全的方法是使用-n开关。这会对分区进行只读文件系统检查,而不会写入任何东西。当然,这并不能保证十分安全,你应该在创建备份之后进行。在 ext3 中,运行

sudo fsck.ext3 -fn /path/to/your/partition

这会产生大量的输出,大多数错误信息的原因是分区已经挂载了。最后会给出一个碎片相关的信息。

如果碎片率大于 20% 了,那么你应该开始整理你的磁盘碎片了。

如何简单地在 Linux 中整理碎片

你要做的是备份你所有的文件和数据到另外一块硬盘中(手动复制他们),格式化分区,然后重新复制回去(不要使用备份软件)。日志型文件系统会把它们作为新的文件,并将它们整齐地放置到磁盘中而不产生碎片。

要备份你的文件,运行

cp -afv [/path/to/source/partition]/* [/path/to/destination/folder]

记住星号(*)是很重要的。

注意:通常认为复制大文件或者大量文件,使用 dd 或许是最好的。这是一个非常底层的操作,它会复制一切,包含空闲的空间甚至是留下的垃圾。这不是我们想要的,因此这里最好使用 cp

现在你只需要删除源文件。

sudo rm -rf [/path/to/source/partition]/*

可选:你可以使用如下命令将空闲空间用零填充。也可以用格式化来达到这点,但是如果你并没有复制整个分区而仅仅是复制大文件(它通常会形成碎片)的话,就不应该使用格式化的方法了。

sudo dd if=/dev/zero of=[/path/to/source/partition]/temp-zero.txt

等待它结束。你可以用 pv 来监测进度。

sudo apt-get install pv
sudo pv -tpreb | of=[/path/to/source/partition]/temp-zero.txt

这就完成了,只要删除这个用于填充的临时文件就行。

sudo rm [/path/to/source/partition]/temp-zero.txt

待你清零了空闲空间(或者跳过了这步)。重新复制回文件,将第一个cp命令翻转一下:

cp -afv [/path/to/original/destination/folder]/* [/path/to/original/source/partition]

使用 e4defrag

如果你想要简单的方法,安装 e2fsprogs

sudo apt-get install e2fsprogs

用 root 权限在分区中运行 e4defrag。如果你不想或不能卸载该分区,你可以使用它的挂载点而不是路径。要整理整个系统的碎片,运行:

sudo e4defrag  /

在挂载的情况下不保证成功(你也应该在它运行时不要使用你的系统),但是它比复制全部文件再重新复制回来简单多了。

总结

linux 系统中由于它的日志型文件系统有效的数据处理很少会出现碎片。如果你因任何原因产生了碎片,简单的方法是重新分配你的磁盘,如复制出去所有文件并复制回来,或者使用e4defrag。然而重要的是保证你数据的安全,因此在进行任何可能影响你全部或者大多数文件的操作之前,确保你的文件已经被备份到了另外一个安全的地方去了。


via: https://www.maketecheasier.com/defragment-linux/

作者:Attila Orosz 译者:geekpi 校对:wxy

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

RHCSA 系列(十): Yum 包管理、Cron 自动任务计划和监控系统日志

在这篇文章中,我们将回顾如何在 RHEL7 中安装,更新和删除软件包。我们还将介绍如何使用 cron 进行任务自动化,并完成如何查找和监控系统日志文件,以及为什么这些技能是系统管理员必备技能。

Yum Package Management Cron Jobs Log Monitoring Linux

RHCSA: Yum包管理、任务计划和系统监控 – Part 10

使用yum 管理包

要安装一个包以及所有尚未安装的依赖包,您可以使用:

# yum -y install package_name(s)

package_name(s) 需要是至少一个真实的软件包名

例如,安装 httpd 和 mlocate(按顺序),输入。

# yum -y install httpd mlocate

注意: 字符 y 表示绕过执行下载和安装前的确认提示。如果需要提示,你可以不用它。

默认情况下,yum 将安装与操作系统体系结构相匹配的包,除非通过在包名加入架构名。

例如,在 64 位系统上,yum install package将安装包的 x86_64 版本,而 yum install package.x86(如果有的话)将安装 32 位的。

有时,你想安装一个包,但不知道它的确切名称。search all 选项可以在当前启用的软件库中的包名称和包描述中搜索它,或者search选项可以在包名称中搜索。

比如,

# yum search log

将搜索安装的软件库中名字和摘要与该词(log)类似的软件,而

# yum search all log

也将在包描述和网址中寻找寻找相同的关键字。

一旦搜索返回包列表,您可能希望在安装前显示一些信息。这时 info 选项派上了用场:

# yum info logwatch

Search Package Information

搜索包信息

您可以定期用以下命令检查更新:

# yum check-update

上述命令将返回可以更新的所有已安装的软件包。在下图所示的例子中,只有 rhel-7-server-rpms 有可用更新:

Check For Package Updates

检查包更新

然后,您可以更新该包,

# yum update rhel-7-server-rpms

如果有几个包可以一同更新,可以使用 yum update 一次性更新所有的包。

当你知道一个可执行文件的名称,如 ps2pdf,但不知道那个包提供了它?你可以通过 yum whatprovides “*/[executable]”找到:

# yum whatprovides “*/ps2pdf”

Find Package Belongs to Which Package

查找文件属于哪个包

当删除包时,你可以使用 yum remove Package ,很简单吧?Yum 是一个完整而强大的包管理器。

# yum remove httpd

文本式 RPM 工具

RPM(又名 RPM 包管理器,原意是 RedHat 软件包管理器)也可用于安装或更新独立的rpm格式的软件包。

往往使用 -Uvh 表明如果这个包没有安装就安装它,如果已存在就尝试更新。这里-U表示更新、-v表示显示详细输出,用-h显示进度条。例如

# rpm -Uvh package.rpm

rpm 的另一个典型的使用方法是列出所有安装的软件包,

# rpm -qa

Query All RPM Packages

查询所有包

使用 Cron 调度任务

Linux 和 UNIX 类操作系统包括一个称为 Cron 的工具,允许你周期性调度任务(即命令或 shell 脚本)。cron 会每分钟定时检查 /var/spool/cron 目录中有在 /etc/passwd 帐户文件中指定用户名的文件。

执行命令时,命令输出是发送到该 crontab 的所有者(或者可以在 /etc/crontab,通过 MAILTO 环境变量中指定用户)。

crontab 文件(可以通过键入 crontab -e并按 Enter 键创建)的格式如下:

Crontab Entries

crontab条目

因此,如果我们想在每个月第二天上午2:15更新本地文件数据库(用于按名字或通配模式定位文件),我们需要添加以下 crontab 条目:

15 02 2 * * /bin/updatedb

以上的条目的意思是:”每年每月第二天的凌晨 2:15 运行 /bin/updatedb,无论是周几”,我想你也猜到了。星号作为通配符。

正如我们前面所提到的,添加一个 cron 任务后,你可以看到一个名为 root 的文件被添加在 /var/spool/cron。该文件列出了所有的 crond 守护进程应该运行的任务:

# ls -l /var/spool/cron

Check All Cron Jobs

检查所有cron任务

在上图中,显示当前用户的 crontab 可以使用 cat /var/spool/cron

# crontab -l

如果你需要在一个更精细的时间上运行的任务(例如,一天两次或每月三次),cron 也可以做到。

例如,每个月1号和15号运行 /my/script 并将输出导出到 /dev/null (丢弃输出),您可以添加如下两个crontab 条目:

01 00 1 * * /myscript > /dev/null 2>&1
01 00 15 * * /my/script > /dev/null 2>&1

不过为了简单,你可以将他们合并:

01 00 1,15 * *  /my/script > /dev/null 2>&1

跟着前面的例子,我们可以在每三个月的第一天的凌晨1:30运行 /my/other/script。

30 01 1 1,4,7,10 * /my/other/script > /dev/null 2>&1

但是当你必须每隔某分钟、小时、天或月来重复某个任务时,你可以通过所需的频率来划分正确的时间。以下与前一个 crontab 条目具有相同的意义:

30 01 1 */3 * /my/other/script > /dev/null 2>&1

或者也许你需要在一个固定的频率或系统启动后运行某个固定的工作,你可以使用下列五个字符串中的一个字符串来指示你想让你的任务计划工作的确切时间:

@reboot     仅系统启动时运行
@yearly     一年一次, 类似与 00 00 1 1 *
@monthly    一月一次, 类似与 00 00 1 * *
@weekly     一周一次, 类似与 00 00 * * 0
@daily      一天一次, 类似与 00 00 * * *
@hourly     一小时一次, 类似与 00 * * * *

定位和查看日志

系统日志存放(并轮转)在 /var/log 目录。根据 Linux 的文件系统层次标准(Linux Filesystem Hierarchy Standard),这个目录包括各种日志文件,并包含一些必要的子目录(如 audit、 httpd 或 samba ,如下图),并由相应的系统守护进程操作:

# ls /var/log

Linux Log Files Location

Linux 日志的位置

其他感兴趣的日志比如 dmesg(包括了所有内核层缓冲区的消息),secure(记录要求用户认证的连接请求),messages(系统级信息),和 wtmp(记录了所有用户的登录、登出)。

日志是非常重要的,它们让你可以看到任何时刻发生在你的系统的事情,以及已经过去的事情。他们是无价的工具,可以排错和监测一个 Linux 服务器,通常使用 tail -f 命令来实时显示正在发生和写入日志的事件。

举个例子,如果你想看你的内核相关的日志,你需要输入如下命令:

# tail -f /var/log/dmesg

同样的,如果你想查看你的 Web 服务器日志,你需要输入如下命令:

# tail -f /var/log/httpd/access.log

总结

如果你知道如何有效的管理包、调度任务、以及知道在哪寻找系统当前和过去操作的信息,你可以放松工作而不会总被吓到。我希望这篇文章能够帮你学习或回顾这些基础知识。

如果你有任何问题或意见,请使用下面的表单反馈给我们。


via: http://www.tecmint.com/yum-package-management-cron-job-scheduling-monitoring-linux-logs/

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

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

Linux 中 10 个有用的命令行补全例子

在 Linux 系统中,当你输入一个命令,再按两次 TAB 键,就会列出所有以你输入字符开头的可用命令。这并不新鲜,可能你已经知道了。这个功能被称作命令行补全bash completion。默认情况下,bash 命令行可以自动补全文件或目录名称。不过,我们可以增强 bash 命令补全功能,通过 complete 命令让它达到新的高度。

这个教程说明了我们是怎样使用可编程的命令行补全功能programmable completion把自动补全功能应用于选项或者命令行参数。

例如:在输入 write 命令之后,如果你按两次 TAB 按键,自动补全功能会提供可供执行 write 操作的用户列表。

$ write [TAB][TAB]
bala      raj
jason     randy
john      ritu
mayla     thomas
nisha     www-data

在下面的例子中,可以为 telnet 命令显示可用的主机名:

$ telnet [TAB][TAB]
localhost  dev-db  fileserver

要让可编程命令补全功能在你的终端起作用 ,你只需要如下执行/etc/bash_completion即可:

# . /etc/bash_completion

你也可以取消/etc/bash.bashrc(来自 Ubuntu Linux 13.04 系统)中如下的注释,这样,你就可以不需要执行上面的命令了:

### enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

如果你没有发现这些代码,也没有找到/etc/bash_completion文件,那么你只需要通过使用apt-get命令来安装bash_completion 包即可。

1. 查看已有的命令行补全

在启用可编程的命令行补全功能后,就已经有了一些定义好的命令补全功能。complete 命令用于定义命令行补全。

要查看已有的命令行补全,如下使用 complete 命令:

complete -p | less

上面例子中的 -p 选项是可选的。

2. 列出 bash 中标准补全功能

默认情况下,Bash 为 Linux 用户提供了下列标准补全功能。

  1. 变量补全
  2. 用户名补全
  3. 主机名补全
  4. 路径补全
  5. 文件名补全

我们在之前的  bash 标准补全中讨论过这些。

3. 定义一个命令名补全

通过 -c 选项可以将所有的可用命令作为一个命令的补全参数。在下面的例子里面,为 which 命令定义了一个补全(LCTT译注:在按两下 TAB 时,可以列出所有命令名作为可补全的参数)。

$ complete -c which
$ which [TAB][TAB]
Display all 2116 possibilities? (y or n)

如上,如果按下 ‘y’,就会列出所有的命令名。

4. 定义一个目录补全

通过选项 -d,可以定义一个仅包含目录名的补全参数。在下面的例子中,为 ls 命令定义了补全。

$ ls
countfiles.sh  dir1/          dir2/          dir3/
$ complete -d ls
$ ls [TAB][TAB]
dir1/          dir2/          dir3/

如上,连按下 TAB 仅会显示目录名。

5. 定义一个后台任务名补全

补全功能也能够以任务名作为补全参数。选项 -j 可以定义任务名作为传递给命令的参数,如下:

$ jobs
[1]-  Stopped                 cat
[2]+  Stopped                 sed 'p'
$ complete -j ./list_job_attrib.sh
$ ./list_job_attrib.sh [TAB][TAB]
cat   sed

关于后台任务,你可以参考 Linux 后台任务中的例子了解如何管理后台任务。

6. 带有前缀和后缀的补全

补全功能可以为实际的补全内容定义前缀和后缀。在下面的例子中,为 list_job_attrib.sh 定义了补全内容的前缀和后缀。

$ jobs
[1]+  Stopped                 cat
$ complete -P '">' -S '<"' ./list_job_attrib.sh
$ ./list_job_attrib.sh [TAB][TAB]
$ ./list_job_attrib.sh ">cat<"

7. 带有排除的文件名和目录名补全

假如脚本运行完成后,输出目录如下:

$ cd output/
$ ls
all_calls.txt   incoming_calls.txt   outgoing_calls.txt   missed_calls.txt
parser_mod.tmp  extract.o

如上,如果你想要 ls 命令的补全忽略 .tmp 和 .o 文件:

$ export FIGNORE='.tmp:.o'
$ complete -f -d ls
$ cd output
$ ls [TAB][TAB]
all_calls.txt   incoming_calls.txt   outgoing_calls.txt   missed_calls.txt

FIGNORE 是一个环境变量,它包含了自动补全所需要排除的文件名后缀。

8. 通过 IFS 变量分割字符串得到补全值

可以通过 -W 选项定义补全值列表,然后通过 IFS 环境变量进行切分。切分结果会展开变量并作为补全显示。

$ export IFS=" "
$ complete -W "bubble quick" ./sort_numbers.sh
$ ./sort_numbers.sh [TAB][TAB]
bubble   quick

如上所述,字符串通过 IFS 分隔符进行切分后,内嵌的变量会被展开为变量值,所以可以如下使用变量:

$ echo $SORT_TYPE1
bubble
$ echo $SORT_TYPE2
quick
$ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh
$ ./sort_numbers.sh [TAB][TAB]
bubble   quick

9. 写个函数来生成补全

你可以引入一个函数来定义补全。使用 -F 选项将函数名传给 complete 命令,执行函数生成补全内容。例如,函数如下:

_parser_options()
{
  local curr_arg;
  curr_arg=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) );
}

在上述函数中:

  1. COMPREPLY : 该数组控制连按下 TAB 后显示的结果
  2. COMP_WORDS : 该数组包含命令行输入的单词
  3. COMP_CWORD : COMP_WORDS 数组的索引,使用它来区分命令行可以访问的单词位置
  4. compgen : -W 基于 $current_arg 提供可能的补全及其参数

该函数放在 parser_option 文件中,并通过 source 命令引入:

$ source parser_option

将该函数和你的 parser.pl 脚本关联起来:

$ complete -F _parser_options ./parser.pl
$ ./parser.pl [TAB][TAB]
-i       --incoming       -o       --outgoing       -m       --missed

如上,parser.pl 的选项是由函数 _parser_options() 生成的。

提示: 查看/etc/bash_completion 来了解更多的可编程补全函数。

10. 当第一个规则没有生成结果时,就使用第二个

如果定义的补全规则没有生成匹配时,可以使用 -o 选项生成补全。

$ complete -F _count_files -o dirnames ./countfiles.sh

如上,为 ./countfiles.sh 定义了 _count_files 补全函数。 如果 the _count_files() 函数没有生成任何匹配的话,就会触发目录补全。

$ ls
countfiles.sh    dir1/      dir2/      dir3/
$./countfiles.sh [TAB][TAB]
dir1    dir2    dir3

如何在 Arch Linux 中安装 DNSCrypt 和 Unbound

DNSCrypt 是一个用于对 DNS 客户端和 DNS 解析器之间通信进行加密和验证的协议。它可以阻止 DNS 欺骗或中间人攻击。 DNSCrypt 可用于大多数的操作系统,包括 Linux,Windows,MacOSX ,Android 和 iOS。而在本教程中我使用的是内核为4.1的 archlinux。

Unbound 是用来解析收到的任意 DNS 查询的 DNS 缓存服务器。如果用户请求一个新的查询,unbound 会将其存储到缓存中,并且当用户再次请求相同的请求时,unbound 将采用已经保存的缓存。这将比第一次请求查询更快。

现在我将尝试安装“DNSCrypt”,以确保 DNS 的通信的安全,并用“Unbound”加速。

第一步 – 安装 yaourt

Yaourt 是AUR(ARCH 用户仓库)的辅助工具之一,它可以使用户能够很容易地从 AUR 安装程序。 Yaourt 和 pacman 使用相同的语法,你可以使用 yaourt 安装该程序。下面是安装 yaourt 的简单方法:

1、 用 nano 或者 vi 编辑 arch 仓库配置文件,存放在“/etc/pacman.conf”中。

$ nano /etc/pacman.conf

2、 在 yaourt 仓库底部添加,粘贴下面的脚本:

[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch

3、 用“Ctrl + x”,接着用“Y”保存。

4、 接着升级仓库数据库并用pacman安装yaourt:

$ sudo pacman -Sy yaourt

第二步 – 安装 DNSCrypt 和 Unbound

DNSCrypt 和 unbound 就在 archlinux 仓库中,你可以用下面的 pacman 命令安装:

$ sudo pacman -S dnscrypt-proxy unbound

接着在安装的过程中按下“Y”。

第三步 – 安装 dnscrypt-autoinstall

Dnscrypt-autoinstall 是一个在基于 Linux 的系统上自动安装和配置 DNSCrypt 的脚本。DNSCrypt 在 AUR 中,因此你必须使用“yaourt”命令来安装它。

$ yaourt -S dnscrypt-autoinstall

注意 :

-S = 这和 pacman -S 安装程序一样。

第四步 – 运行 dnscrypt-autoinstall

用 root 权限运行“dnscrypt-autoinstall”来自动配置 DNSCrypt。

$ sudo dnscrypt-autoinstall

下一步中按下“回车”,接着输入”Y”来选择你想使用的 DNS 提供者,我这里使用不带日志和 DNSSEC 的 DNSCrypt.eu。

DNSCrypt autoinstall

第五步 – 配置 DNSCrypt 和 Unbound

1、 打开 dnscrypt 的“/etc/conf.d/dnscrypt-config” ,确认配置文件中“DNSCRYPTLOCALIP”指向本地ip,“DNSCRYPTLOCALPORT”根据你本人的意愿配置,我是用的是40端口。

$ nano /etc/conf.d/dnscrypt-config
DNSCRYPT_LOCALIP=127.0.0.1
DNSCRYPT_LOCALIP2=127.0.0.2
DNSCRYPT_LOCALPORT=40

DNSCrypt Configuration

保存并退出。

2、 现在你用 nano 编辑器编辑“/etc/unbound/”下 unbound 的配置文件:

$ nano /etc/unbound/unbound.conf

3、 在脚本最后添加下面的行:

do-not-query-localhost: no
forward-zone:
name: "."
forward-addr: 127.0.0.1@40

确保forward-addr和DNSCrypt中的“DNSCRYPT_LOCALPORT”一致。如你所见,用的是40端口。

Unbound Configuration

接着保存并退出。

第六步 – 运行 DNSCrypt 和 Unbound,接着添加到开机启动中

请用 root 权限运行 DNSCrypt 和 unbound,你可以用 systemctl 命令来运行:

$ sudo systemctl start dnscrypt-proxy unbound

将服务添加到启动中。你可以运行“systemctl enable”:

$ sudo systemctl enable dnscrypt-proxy unbound

命令将会创建软链接到“/usr/lib/systemd/system/”目录的服务。

第七步 – 配置 resolv.conf 并重启所有服务

resolv.conf 是一个在 linux 中用于配置 DNS 解析器的文件。它是一个由管理员创建的纯文本,因此你必须用 root 权限编辑并让它不能被其他人修改。

用 nano 编辑器编辑:

$ nano /etc/resolv.conf

并添加本地IP “127.0.0.1”。现在用“chattr”命令使他只读:

$ chattr +i /etc/resolv.conf

注意:

如果你想要重新编辑,用“chattr -i /etc/resolv.conf”加入写权限。

现在你需要重启 DNSCrypt 和 unbound 和网络;

$ sudo systemctl restart dnscrypt-proxy unbound netctl

如果你看到错误,检查配置文件。

测试

1、 测试 DNSCrypt

你可以通过 https://dnsleaktest.com/ 来确认 DNSCrypt,点击“标准测试”或者“扩展测试”,然后等待程序运行结束。

现在你可以看到 DNSCrypt.eu 就已经与作为 DNS 提供商的 DNSCrypt 协同工作了。

Testing DNSCrypt

2、 测试 Unbound

现在你应该确保 unbound 可以正确地与“dig”和“drill”命令一起工作。

这是 dig 命令的结果:

$ dig linoxide.com

我们现在看下结果,“Query time”是“533 msec”:

;; Query time: 533 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Aug 30 14:48:19 WIB 2015
;; MSG SIZE rcvd: 188

再次输入命令,我们看到“Query time”是“0 msec”。

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Aug 30 14:51:05 WIB 2015
;; MSG SIZE rcvd: 188

Unbound Test

DNSCrypt 对 DNS 客户端和解析端之间的通讯加密做的很好,并且 Unbound 通过缓存让相同的请求在另一次请求同速度更快。

总结

DNSCrypt 是一个可以加密 DNS 客户端和 DNS 解析器之间的数据流的协议。 DNSCrypt 可以在不同的操作系统上运行,无论是移动端或桌面端。选择 DNS 提供商还包括一些重要的事情,应选择那些提供 DNSSEC 同时没有日志的。Unbound 可被用作 DNS 缓存,从而加快解析过程,因为 Unbound 将请求缓存,那么接下来客户端请求相同的查询时,unbound 将从缓存中取出保存的值。 DNSCrypt 和 Unbound 是针对安全性和速度的一个强大的组合。


via: http://linoxide.com/tools/install-dnscrypt-unbound-archlinux/

作者:Arul 译者:geekpi 校对:wxy

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

Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?

问题:我有个 Linux 进程运行在多核处理器系统上。怎样才能找出哪个 CPU 内核正在运行该进程?

Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?
Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?

当你在 多核 NUMA 处理器上运行需要较高性能的 HPC(高性能计算)程序或非常消耗网络资源的程序时,CPU/memory 的亲和力是限度其发挥最大性能的重要因素之一。在同一 NUMA 节点上调度最相关的进程可以减少缓慢的远程内存访问。像英特尔 Sandy Bridge 处理器,该处理器有一个集成的 PCIe 控制器,你可以在同一 NUMA 节点上调度网络 I/O 负载(如网卡)来突破 PCI 到 CPU 亲和力限制。

作为性能优化和故障排除的一部分,你可能想知道特定的进程被调度到哪个 CPU 内核(或 NUMA 节点)上运行。

这里有几种方法可以 找出哪个 CPU 内核被调度来运行给定的 Linux 进程或线程

方法一

如果一个进程使用 taskset 命令明确的被固定(pinned)到 CPU 的特定内核上,你可以使用 taskset 命令找出被固定的 CPU 内核:

$ taskset -c -p 

例如, 如果你对 PID 5357 这个进程有兴趣:

$ taskset -c -p 5357pid 5357's current affinity list: 5

输出显示这个过程被固定在 CPU 内核 5上。

但是,如果你没有明确固定进程到任何 CPU 内核,你会得到类似下面的亲和力列表。

pid 5357's current affinity list: 0-11

输出表明该进程可能会被安排在从0到11中的任何一个 CPU 内核。在这种情况下,taskset 不能识别该进程当前被分配给哪个 CPU 内核,你应该使用如下所述的方法。

方法二

ps 命令可以告诉你每个进程/线程目前分配到的 (在“PSR”列)CPU ID。

$ ps -o pid,psr,comm -p   PID PSR COMMAND 5357  10 prog

输出表示进程的 PID 为 5357(名为”prog”)目前在CPU 内核 10 上运行着。如果该过程没有被固定,PSR 列会根据内核可能调度该进程到不同内核而改变显示。

方法三

top 命令也可以显示 CPU 被分配给哪个进程。首先,在top 命令中使用“P”选项。然后按“f”键,显示中会出现 “Last used CPU” 列。目前使用的 CPU 内核将出现在 “P”(或“PSR”)列下。

$ top -p 5357
Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?
Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?

相比于 ps 命令,使用 top 命令的好处是,你可以连续监视随着时间的改变, CPU 是如何分配的。

方法四

另一种来检查一个进程/线程当前使用的是哪个 CPU 内核的方法是使用 htop 命令

从命令行启动 htop。按 键,进入”Columns”,在”Available Columns”下会添加 PROCESSOR。

每个进程当前使用的 CPU ID 将出现在“CPU”列中。

Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?
Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?

请注意,所有以前使用的命令 taskset,ps 和 top 分配CPU 内核的 IDs 为 0,1,2,…,N-1。然而,htop 分配 CPU 内核 IDs 从 1开始(直到 N)。


via: http://ask.xmodulo.com/cpu-core-process-is-running.html

作者:Dan Nanni 译者:strugglingyouth 校对:wxy

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

使用 tuptime 工具查看 Linux 服务器系统的开机时间的历史和统计

你可以使用下面的工具来查看 Linux 或类 Unix 系统运行了多长时间:

  • uptime : 告诉你服务器运行了多长的时间。
  • lastt : 显示重启和关机时间。
  • tuptime : 报告系统的运行时间历史和运行时间统计,这是指重启之间的运行时间。和 uptime 命令类似,不过输出结果更有意思。

找出系统上次重启时间和日期

可以使用下面的命令来获取Linux操作系统的上次重启和关机时间及日期(在OSX/类Unix系统上也可以用):

### 显示系统重启和关机时间
who -b
last reboot
last shutdown
### 开机信息
uptime
cat /proc/uptime
awk '{ print "up " $1 /60 " minutes"}' /proc/uptime
w

样例输出:

Fig.01: Various Linux commands in action to find out the server uptime

图01:用于找出服务器开机时间的多个Linux命令

跟 tuptime 问打个招呼吧

tuptime 命令行工具可以报告基于 Linux 的系统上的下列信息:

  1. 系统启动次数统计
  2. 注册首次启动时间(也就是安装时间)
  3. 正常关机和意外关机统计
  4. 平均开机时间和故障停机时间
  5. 当前开机时间
  6. 首次启动以来的开机和故障停机率
  7. 累积系统开机时间、故障停机时间和合计
  8. 报告每次启动、开机时间、关机和故障停机时间

安装

输入下面的命令来克隆 git 仓库到 Linux 系统中

$ cd /tmp
$ git clone https://github.com/rfrail3/tuptime.git
$ ls
$ cd tuptime
$ ls

样例输出:

Fig.02: Cloning a git repo

图02:克隆git仓库

确保你安装了带有 sys,optparse,os,re,string,sqlite3,datetime,disutils 和 locale 模块的 Python v2.7。

你可以像下面这样来安装:

$ sudo tuptime-install.sh

或者,可以手工安装(基于 systemd 或非 systemd ):

$ sudo cp /tmp/tuptime/latest/cron.d/tuptime /etc/cron.d/tuptime

如果系统是systemd的,拷贝服务文件并启用:

$ sudo cp /tmp/tuptime/latest/systemd/tuptime.service /lib/systemd/system/
$ sudo systemctl enable tuptime.service

如果系统不是systemd的,拷贝初始化文件:

$ sudo cp /tmp/tuptime/latest/init.d/tuptime.init.d-debian7 /etc/init.d/tuptime
$ sudo update-rc.d tuptime defaults

运行

只需输入以下命令:

$ sudo tuptime

样例输出:

Fig.03: tuptime in action

图03:tuptime工作中

在一次更新内核后,我重启了系统,然后再次输入了同样的命令:

$ sudo tuptime
System startups:    2   since   03:52:16 PM 08/21/2015
System shutdowns:   1 ok   -   0 bad
Average uptime:     7 days, 16 hours, 48 minutes and 3 seconds
Average downtime:   2 hours, 30 minutes and 5 seconds
Current uptime:     5 minutes and 28 seconds   since   06:23:06 AM 09/06/2015
Uptime rate:        98.66 %
Downtime rate:      1.34 %
System uptime:      15 days, 9 hours, 36 minutes and 7 seconds
System downtime:    5 hours, 0 minutes and 11 seconds
System life:        15 days, 14 hours, 36 minutes and 18 seconds

你可以像下面这样修改日期和时间格式:

$ sudo tuptime -d '%H:%M:%S %m-%d-%Y'

样例输出:

System startups:    1   since   15:52:16 08-21-2015
System shutdowns:   0 ok   -   0 bad
Average uptime:     15 days, 9 hours, 21 minutes and 19 seconds
Average downtime:   0 seconds
Current uptime:     15 days, 9 hours, 21 minutes and 19 seconds   since   15:52:16 08-21-2015
Uptime rate:        100.0 %
Downtime rate:      0.0 %
System uptime:      15 days, 9 hours, 21 minutes and 19 seconds
System downtime:    0 seconds
System life:        15 days, 9 hours, 21 minutes and 19 seconds

计算每次启动、开机时间、关机和故障停机时间:

$ sudo tuptime -e

样例输出:

Startup:  1  at  03:52:16 PM 08/21/2015
Uptime:   15 days, 9 hours, 22 minutes and 33 seconds
System startups:    1   since   03:52:16 PM 08/21/2015
System shutdowns:   0 ok   -   0 bad
Average uptime:     15 days, 9 hours, 22 minutes and 33 seconds
Average downtime:   0 seconds
Current uptime:     15 days, 9 hours, 22 minutes and 33 seconds   since   03:52:16 PM 08/21/2015
Uptime rate:        100.0 %
Downtime rate:      0.0 %
System uptime:      15 days, 9 hours, 22 minutes and 33 seconds
System downtime:    0 seconds
System life:        15 days, 9 hours, 22 minutes and 33 seconds

via: http://www.cyberciti.biz/hardware/howto-see-historical-statistical-uptime-on-linux-server/

作者:Vivek Gite 译者:GOLinux 校对:wxy

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

阅读 Docker 源代码的神兵利器

Golang开发环境的安装

阅读Go源码之前,安装Go语言的开发环境是必不可少的。下面我们介绍下载和安装的步骤。

1. 下载官方的Go语言安装包

请根据操作系统的版本(FreeBSD、Linux、Mac OS X或者Windows)以及处理器的架构(386、amd64或者arm)进行选择。下载地址为:https://golang.org/dl/ ,是Google提供的服务,可能需要使用VPN才能访问。

2. 安装Go语言安装包

选择合适的版本下载完成后,就可以开始进行Go语言安装包的安装了,过程如下。

FreeBSD、Linux以及Mac OS X之tar安装

对于FreeBSD、Linux以及Mac OS X用户来说,下载好的tar压缩文件需要再执行以下步骤才算是安装完成。

把压缩包解压至/usr/local目录下,命令如下:

tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz

选择适合的压缩包进行安装,例如,如果在64位Linux系统上安装Go 1.2.1版本,那么对应的压缩包就是go1.2.1.linux-amd64.tar.gz。

把/usr/local/go/bin添加到系统的环境变量中,可以通过把下面这行命令加入到/etc/profile(系统所有用户都受影响)或者$HOME/.profile(当前用户受影响)文件中来完成。

export PATH=$PATH:/usr/local/go/bin

提示:Go的安装环境默认安装在/usr/local(Windows系统是C:\)路径下。如果指定某个本地目录为安装路径,就必须设置$GOROOT环境变量。如果要把安装包解压至$HOME目录下,就需要把下面两行代码加入到$HOME/.profile文件中。

export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin
Mac OS X之pkg快速安装

下载后缀为.pkg的相关安装包,打开后按照图形界面的指引操作即可顺利安装。使用这种方法时,安装包默认会安装到/usr/local目录下,/usr/local/go/bin也会被加入到环境变量。安装完成后,在终端使用时需要重新开启一个会话,以便生效。

Windows安装

除了源码安装以外,Go官方给用户提供了两种安装开发环境的方法:一种是手动解压缩Zip包安装,这需要设置环境变量;另一种是全自动安装。

MSI安装: 打开MSI文件,按照指引界面一步步操作即可,默认安装在C:\Go路径下。安装器会自动把C:\Go\bin目录加入到环境变量中。同样,需要重启命令行使之生效。

Zip安装: 把Zip文件下载并解压缩到自己选择的目录,推荐C:\Go。如果放到C:\Go以外的目录,需要设置GOROOT变量。然后把解压缩后Go目录下的bin目录(如C:\Go\bin)加入到PATH环境变量中。

Windows下设置环境变量: 在Windows系统下,可以通过“计算机”→“系统属性”→“高级”→“PATH”来设置环境变量。

3. 测试Go语言环境

完成以上步骤后,Go语言环境便安装完成了,最后我们来测试一下。

首先,创建一个hellow.go的空白文件,输入以下代码:

package main
import "fmt"
func main() {
  fmt.Printf("hello, world\n")
}  

然后通过Go语言工具编译运行,示例如下:

$ go run hello.go
hello, world

如果看到了hello world,那么一切便大功告成了。

工具的配置与技巧

遗憾的是,Google官方并没有开发出一款专门为Golang打造的IDE,但开源社区为此作出了巨大的贡献。本节将介绍几种常见的IDE与编辑器的配置和使用技巧。

1. LiteIDE

LiteIDE是国人开发的一款专门为Go语言量身定做的IDE,它简单实用、开源并且可跨平台。

下载与安装

LiteIDE的安装文件托管在sourceforge平台上,因为项目是开源的,我们也可以在GitHub上下载项目源代码进行安装。下载地址为:http://sourceforge.net/projects/liteide/files

打开下载目录,如图1所示,会看到各个版本的下载目录,推荐下载最新的版本。有了Go开发环境的安装经验,安装LiteIDE就会简单很多。

LiteIDE.png图1 LiteIDE下载列表

下载相应版本的LiteIDE后进行解压缩。不同操作系统的用户,LiteIDE对应的安装方法如下:

  • Mac OS X:把解压后的LiteIDE.app直接拖动到Application文件夹下,以后即可在Launchpad中方便地找到并打开它。
  • Windows: 解压缩后,在liteide/bin目录下,双击liteide.exe即可打开运行。
  • Linux: 解压缩后,在liteide/bin/目录下,双击liteide即可打开运行。
  • LiteIDE支持Go语言阅读的功能简介

LiteIDE支持以下Go语言阅读功能。

  • Go语言包浏览器(Package browser)
  • 类视图和大纲(Class view and outline)
  • 文档浏览(Document browser)
  • Go语言Api函数检索(GOPATH API index)
  • 代码跳转(Jump to Declaration)
  • 代码表达式信息显示(Find Usages)

LiteIDE使用的图标是太极两仪的样式,有着浓浓的中国风,打开它就会看到介绍。可以使用打开文件夹功能,直接打开Docker源代码文件夹。如图2所示,在左边可以看到文件浏览目录、类试图、文件夹列表、大纲以及包浏览器这几个功能;右边是打开的Docker官方的README.md文件,可以看到LiteIDE支持预览Markdown格式,这样可以在这个IDE上面方便地读文档。

LiteIDE1.png图2 LiteIDE功能界面展示

打开IDE以后,大家可以在设置中查看和修改快捷键设置,如图3所示。

LiteIDE2.png图3 LiteIDE快捷键设置

需要注意的是,LiteIDE的代码跳转依旧不够完善,只有当跳转到的代码所在的文件处于打开(已经浏览过)状态时,才能正确地跳转。

Linux或者Mac OS X用户可以配合grep命令进行查看。如果我们要查找的函数是get_instance,则命令如下:

grep -rl get_instance docker/api
grep -rl [grep_pattern] [file_diretory]

Windows用户可以在文件中使用查找功能。

相信现在你已经能使用LiteIDE比较方便地阅读源码了。

2. Sublime Text 2

Sublime Text 2(简称ST2)自2012年发布以来,便以其简洁华丽的外观、多平台的支持、多语言支持以及超强的可扩展性而风靡起来。同样,作为一款文本编辑器,与VIM相比,它自带有目录树等功能,省去了一些配置上的麻烦,易于上手。

下载

打开Sublime Text的官方网站,页面下方映入眼帘的就是一个大大的Download图标,它会根据操作系统的平台自动选择适合的版本,只需直接点击Download即可下载。当然我们也可以打开下载列表页面(http://www.sublimetext.com/2),根据平台选择合适的版本进行下载。

安装

不同系统的用户可以参照不同的方式下载安装Sublime Text 2,方法如下:

  • Windows:下载后打开exe文件,按照引导界面进行安装即可。
  • Mac OS X:下载后打开dmg文件,按照引导界面进行安装即可。
  • Linux: 下载后进行解压缩,解压缩后进入目录点击sublime_text即可使用。但这样不便于使用,可以按照以下步骤进行配置,以便在终端也可方便地使用Sublime(假设已经解压缩到HOME目录)。 {{{mv $HOME/Sublime\ Text\ 2/ /opt/ sudo ln -s /opt/Sublime\ Text\ 2/sublime_text /usr/local/bin/subl}}}

以上配置完成后,我们便可以方便地在终端通过subl命令打开Sublime Text 2了。

插件安装

Package Control

  • 点击菜单栏偏好设置(Preferences)->包浏览(Browse Packages)。
  • 打开它的上一级目录Sublime-Text-2/,可以看到“Installed Packages”、“Packages”等文件夹。
  • 下载Control.sublime-package包,并且复制到Installed Packages/目录中。
  • 重启Sublime Text。

GoSublime

  • 安装完Package Control后,默认情况下,通过快捷键Ctrl+Shift+P①即可调出命令执行模块, 输入Package Control:Install Package即可激活包安装。
  • 在跳出的可用包列表中,键入GoSublime后按回车键,即可下载并自动安装。
  • 安装完GoSublime后,即可使用诸如代码补全、格式调整等功能。

CTags

  • 与GoSublime相同,通过快捷键Ctrl+Shift+P调出命令执行模块,输入Package Control:Install Package,在跳出的可用包列表中键入CTags,再按回车键即可自动安装。
  • 安装完成后,在Docker项目的根目录下点击鼠标右键,执行CTags:Rebuild Tags,对项目进行CTags检索。
  • 通过快捷键Ctrl+Shift+ . 即可进行代码跳转(跳转到定义),通过快捷键Ctrl+Shift+,即可跳回。

至此,Sublime的介绍就完成了,熟练运用以上3个插件,不仅便于阅读Docker源码,对于Go语言项目的编写也会有非常大的帮助。

3. Vim

相信习惯使用文本编辑器的读者,一定对开源软件Vim相当熟悉和亲切。Vim被誉为“编辑器之神”,学习曲线极为陡峭,但是,一旦熟练掌握了Vim自成体系的一套快捷键,代码编辑速度将快速提升,你也会从此对Vim爱不释手。本节只作为对Vim老用户的抛砖引玉,不适于Vim的初学者使用。

插件的安装

go-vim是一款让Vim可以高度支持Go语言的Vim插件,所以也是要使用Vim作为Go IDE的必装插件。

如果使用pathogen对插件进行管理,那么只要执行如下步骤即可。

cd ~/.vim/bundle
git clone https://github.com/fatih/vim-go.git

对于Vundle用户,需要在.vimrc文件中加入下面这行:

Plugin 'fatih/vim-go'

并且打开Vim,在命令模式下执行:PluginInstall。

安装完插件后,为确保所有依赖的二进制文件(如gocode、godef、 goimports等),可以在命令模式下执行如下命令进行自动安装:

:GoInstallBinaries

除go-vim外,还有如下可选插件。

  • 实时代码自动补全插件:YCM 或 neocomplete;
  • 侧边栏类试图插件:tagbar;
  • 代码段自动生成插件: ultisnips 或 neosnippet;
  • 目录浏览器插件:nerdtree。
常用命令
  • :GoDef [identifier]:用于代码跳转,默认会跳转的项为鼠标定位的函数或变量,后面可以跟标识符进行跳转。
  • :GoDoc:用于打开相关Go文档。
  • :GoInfo:用于显示鼠标定位的标识符的变量类型。
  • :GoFmt:用于对选中的代码进行Go格式化。
  • :GoDeps:用于显示当前包依赖的其他包。
  • :GoFiles:用于显示依赖当前包的其他包。
  • :GoInstallBinaries:用于安装Go语言的Vim依赖项。
  • :GoUpdateBinaries:用于更新Go语言的Vim依赖项。

关于Vim的介绍到此结束,但相信对于Vim老用户来说,探索才刚刚开始。Vim作为一个经久不衰、广受赞誉的好工具,一直都是每一个Geek心中最好的神兵利器!

4. Emacs

Emacs作为与Vim齐名的文本编辑器,号称“神之编辑器”,用来浏览和编写Go代码也是非常方便的。本节也只作为Emacs老用户的抛砖引玉,在此之前,用户需要做好适合自己的配置。下面我们就以Emacs24为例,简单介绍几个实用的插件,用户需要先使用go get命令安装好gofmt、godef、godoc、gocode等工具。

go-mode

go-mode在提供了自动缩进和语法高亮功能的基础上,还整合了Go语言自带的工具,如gofmt、godoc、godef等。在Emacs24以后的版本中,可以使用自带的Package工具进行安装,命令如下:M-x package-install go-mode下面我们主要介绍格式整理以及定义跳转两项功能的配置。

格式整理

格式整理功能直接调用了gofmt工具,该工具能使用户的代码风格与其他开发人员保持一致。在Emacs中,用户可以直接调用gofmt命令,对当前窗口的代码进行格式整理。另一种方式是为before-save-hook添加函数,示例如下:

(add-hook 'before-save-hook 'gofmt-before-save)

这样在用户每次存档时就会自动进行格式整理。

定义跳转

定义跳转使用了godef工具,该工具能分析用户的代码、其他包内的代码以及Go标准库,实现在这三者间的定义跳转。Emacs提供了godef-jump命令实现跳转,默认绑定键为C-c C-j,用户也可以自己定义按键绑定,如绑定到F3键:

(add-hook 'go-mode-hook
'(lambda () (local-set-key (kbd "") 'godef-jump)))

为了在跳转之后能跳转回来,用户可以添加如下配置,这样可以使用F2键回到原先的位置。

(add-hook 'go-mode-hook
'(lambda () (local-set-key (kbd "") 'pop-tag-mark)))

此外,go-mode还提供了管理imports、使用godoc等工具,这里不再一一赘述。

company-go

company-go调用gocode工具提供自动完成功能,用户可以直接使用Package工具安装company-mode和company-go,并进行如下配置:

(add-hook 'go-mode-hook 'company-mode)
(add-hook 'go-mode-hook
(lambda ()
(set (make-local-variable 'company-backends) '(company-go))
(company-mode)))

Emacs还为用户提供了极大的自由度,建议用户使用最新版本的Emacs和插件,善用Package功能和网上贡献的工具,这样能获得最新的功能和更好的体验。本文节选自《Docker——容器与容器云》,作者:张磊、孙健波。

Github Hacking

Github不仅能托管代码,还能对代码进行搜索,我们感受到了其便利的同时,也应该时刻注意,当你上传并公开你的代码时,一时大意,让某些敏感的配置信息文件等暴露于众。

让我们从第一个例子开始。当搜索ssh password关键字时,其中里面有这样一个有趣的结果:

好像是一个捷克教育科研网络的,账号密码写的这么简洁明了,于是登录上去看一看。

是不是还挺欢乐的,早就有无数人登陆过了,还有人留下文本善意提醒。这意味着什么,Github早已被盯上,也许下一个大事件会是某漏洞导致Github私有库代码大量泄漏。

当我们在Github上搜索时,我们到底能搜到什么

能搜到的东西很多,这里只是给个思路,具体怎么玩自己去尝试。

邮箱

比如说以mail password关键字搜索:

搜索很多邮箱的帐号密码,这里就不一一列举了。

如果说用@qq.com或者是@gmail.com等各种邮箱后缀为关键字进行搜索,你会发现某商户收集的客户qq信息:

各种账号密码

Github上能搜到的账号密码实在是太多了,筛选一下你会发现很多有意思的。比如说有微信公众平台帐号:

居然连Github的登陆帐号也放在上面。。

各种VIP

万万没想到啊,没想到Github上还有这等福利!

百度云

尽管大部分链接已经失效,但是好资源还是有的。

简历

没想到还有很多人把包含个人信息的如此重要的简历也放在了Github上。搜索相关关键字resume简历学历

其它

比如说有时候我需要微信开放平台的应用AppID(太懒,不想申请),于是搜索关键字WXApi registerApp,出来很多:

总之,鉴于越来越多人开始使用Github(非码农,比如说科学家,作家,音乐制作人,会计等职业),你可以在Github搜的内容也越来越多,不仅仅是代码,简直什么都有,什么某人做的笔记啊,写的小说啊,自拍照啊,还有书籍,论文等,简直出乎意料。

是时候该做点什么了

没错,当你看完本文,在以后上传项目代码时注意一下,以免泄露敏感信息;如果已经有帐号密码在上面了就赶快去修改吧。

Vim 自动补全神器:YouCompleteMe

第一次听说这个插件还是在偶然的情况下看到别人的博客,听说了这个插件的大名。本来打算在实训期间来完成安装的,无奈网实在不给力,也就拖到了回家的时候。在开始准备工作的时候就了解到这个插件不是很容易安装,安装的时候果然名不虚传。(关于这方面的内容,请查看另一篇文章)不过,有付出总有回报,安装之后用上这个插件,真心为这个插件的强大所折服。

那这个插件有何不同? 

YouCompleteMe的特别之处

基于语义补全

总所周知,Vim是一款文本编辑器。也就是说,其最基础的工作就是编辑文本,而不管该文本的内容是什么。在Vim被程序员所使用后,其慢慢的被肩负了与IDE一样的工作,文本自动补全(ie,acpomnicppcompleter),代码检查(Syntastic)等等工作。

针对文本自动补全这个功能来说,主要有两种实现方式。

基于文本

我们常用的omnicppcompleteracp,vim自带的c-x, c-n的实现方式就是基于文本。更通俗的说法,其实就是一个字:

其通过文本进行一些正则表达式的匹配,再根据生成的tags(利用ctags生成)来实现自动补全的效果。

基于语义

顾名思义,其是通过分析源文件,经过语法分析以后进行补全。由于对源文件进行分析,基于语义的补全可以做到很精确。但是这显然是vim所不可能支持的。而且经过这么多年发展,由于语法分析有很高的难度,也一直没有合适的工具出现。直到,由apple支持的clang/llvm横空出世。YouCompleteMe也正是在clang/llvm的基础上进行构建的。

整合实现了多种插件

  • clang_complete
  • AutoComplPop
  • Supertab
  • neocomplcache
  • Syntastic(类似功能,仅仅针对c/c++/obj-c代码)

支持语言

  • c
  • c++
  • obj-c
  • c#
  • python

对于其他的语言,会调用vim设置的omnifunc来匹配,因此同样支持phpruby等语言。

已知的有

使用效果图

使用感受

  • 和IDE一样,自动补全,
  • 根据include的文件进行补全
  • 不用再蹩脚的生成tags
  • 补全非常精准,而且速度很快,不会有延迟(以前在大项目上,acp用起来实在是很卡)
  • 支持类似tags的跳转,跳到定义处以及使用处
  • 出错提示很智能,并且用起来真的是如丝般柔滑,不用输入:w进行强制检测

安装

说完了那么多好处,就要说到安装了。不同于以往其他vim插件,YCM是一款编译型的插件。在下载完后,需要手动编译后才能使用。对应其他的插件来说,仅仅就是把。vim的文件丢到相应文件夹下就可以。而这也加大了使用YCM的难度。

安装准备

  • 最新版的Vim(7.3.584+),编译时添加+python标志(已经安装的可以通过vim –version查看)
  • cmake(mac可以通过homebrew安装,brew install cmake,ubuntu可以通过sudo apt-get install cmake
  • 安装vundle插件,用于安装管理vim的插件

mac下快速安装

.vimrc中添加下列代码

Bundle 'Valloric/YouCompleteMe'

保存退出后打开vim,在正常模式下输入

:BundleInstall

等待vundle将YouCompleteMe安装完成

而后进行编译安装:

cd ~/.vim/bundle/YouCompleteMe
./install --clang-completer

如果不需要c-family的补全,可以去掉–clang-completer。如果需要c#的补全,请加上–omnisharp-completer

正常来说,YCM会去下载clang的包,如果已经有,也可以用系统–system-libclang

就这样,安装结束。打开vim,如果没有提示YCM未编译,则说明安装已经成功了。

手动编译安装

安装的脚本并不是什么时候都好用,至少对我来说是这样的。安装完之后出现了问题,参考issue#809

在用:BundleInstall安装完成或者使用

git clone --recursive https://github.com/Valloric/YouCompleteMe.git

获取最新的仓库,而后使用git submodule update –init –recursive确认仓库的完整性后,开始安装流程。

  1. 下载最新的clang二进制文件 YCM要求clang版本 > 3.2,一般来说都是下载最新的
  2. 安装python-dev。(ubuntu下使用sudo apt-get install python-dev,mac下默认提供,否则请安装command line tools
  3. 编译

    cd ~
    mkdir ycm_build
    cd ycm_build
    cmake -G "Unix Makefiles"-DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir .~/.vim/bundle/YouCompleteMe/cpp
    make ycm_support_libs

这里需要注意的是,~/ycm_temp/llvm_root_dir中包含的是根据第一步下载的压缩包解压出来的内容(包括include, bin等等文件)

这样就完成了,开始感受YCM提供的完全不逊色于大型IDE所提供的自动补全功能吧。

配置

不同于很多vim插件,YCM首先需要编译,另外还需要有配置。在vim启动后,YCM会找寻当前路径以及上层路径的.ycm_extra_conf.py。在~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py中提供了默认的模板。也可以参考我的(就在模板上改改而已)。不过这个解决了标准库提示找不到的问题。

一般来说,我会在~目录下放一个默认的模板,而后再根据不同的项目在当前目录下再拷贝个.ycm_extra_conf.py

# This file is NOT licensed under the GPLv3, which is the license for the rest
# of YouCompleteMe.
#
# Here's the license text for this file:
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to copy, modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a compiled
# binary, for any purpose, commercial or non-commercial, and by any
# means.
#
# In jurisdictions that recognize copyright laws, the author or authors
# of this software dedicate any and all copyright interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under copyright law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to 
import os
import ycm_core
# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
flags = [
'-Wall',
'-Wextra',
#'-Werror',
#'-Wc++98-compat',
'-Wno-long-long',
'-Wno-variadic-macros',
'-fexceptions',
'-stdlib=libc++',
# THIS IS IMPORTANT! Without a "-std=" flag, clang won't know which
# language to use when compiling headers. So it will guess. Badly. So C++
# headers will be compiled as C headers. You don't want that so ALWAYS specify
# a "-std=".
# For a C project, you would set this to something like 'c99' instead of
# 'c++11'.
'-std=c++11',
# ...and the same thing goes for the magic -x option which specifies the
# language that the files to be compiled are written in. This is mostly
# relevant for c++ headers.
# For a C project, you would set this to 'c' instead of 'c++'.
'-x',
'c++',
'-I',
'.',
'-isystem',
'/usr/include',
'-isystem',
'/usr/local/include',
'-isystem',
'/Library/Developer/CommandLineTools/usr/include',
'-isystem',
'/Library/Developer/CommandLineTools/usr/bin/../lib/c++/v1',
]
# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
compilation_database_folder = ''
if os.path.exists( compilation_database_folder ):
  database = ycm_core.CompilationDatabase( compilation_database_folder )
else:
  database = None
SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
def DirectoryOfThisScript():
  return os.path.dirname( os.path.abspath( __file__ ) )
def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
  if not working_directory:
    return list( flags )
  new_flags = []
  make_next_absolute = False
  path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
  for flag in flags:
    new_flag = flag
    if make_next_absolute:
      make_next_absolute = False
      if not flag.startswith( '/' ):
        new_flag = os.path.join( working_directory, flag )
    for path_flag in path_flags:
      if flag == path_flag:
        make_next_absolute = True
        break
      if flag.startswith( path_flag ):
        path = flag[ len( path_flag ): ]
        new_flag = path_flag + os.path.join( working_directory, path )
        break
    if new_flag:
      new_flags.append( new_flag )
  return new_flags
def IsHeaderFile( filename ):
  extension = os.path.splitext( filename )[ 1 ]
  return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
def GetCompilationInfoForFile( filename ):
  # The compilation_commands.json file generated by CMake does not have entries
  # for header files. So we do our best by asking the db for flags for a
  # corresponding source file, if any. If one exists, the flags for that file
  # should be good enough.
  if IsHeaderFile( filename ):
    basename = os.path.splitext( filename )[ 0 ]
    for extension in SOURCE_EXTENSIONS:
      replacement_file = basename + extension
      if os.path.exists( replacement_file ):
        compilation_info = database.GetCompilationInfoForFile(
          replacement_file )
        if compilation_info.compiler_flags_:
          return compilation_info
    return None
  return database.GetCompilationInfoForFile( filename )
def FlagsForFile( filename, **kwargs ):
  if database:
    # Bear in mind that compilation_info.compiler_flags_ does NOT return a
    # python list, but a "list-like" StringVec object
    compilation_info = GetCompilationInfoForFile( filename )
    if not compilation_info:
      return None
    final_flags = MakeRelativePathsInFlagsAbsolute(
      compilation_info.compiler_flags_,
      compilation_info.compiler_working_dir_ )
    # NOTE: This is just for YouCompleteMe; it's highly likely that your project
    # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
    # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.
    #try:
    #  final_flags.remove( '-stdlib=libc++' )
    #except ValueError:
    #  pass
  else:
    relative_to = DirectoryOfThisScript()
    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
  return {
    'flags': final_flags,
    'do_cache': True
  }

YouCompleteMe提供的其他功能

YCM除了提供了基本的补全功能,自动提示错误的功能外,还提供了类似tags的功能:

  • 跳转到定义GoToDefinition
  • 跳转到声明GoToDeclaration
  • 以及两者的合体GoToDefinitionElseDeclaration

可以在.vimrc中配置相应的快捷键。

nnoremap gl :YcmCompleterGoToDeclaration
nnoremap gf :YcmCompleterGoToDefinition
nnoremap gg :YcmCompleterGoToDefinitionElseDeclaration

另外,YCM也提供了丰富的配置选项,同样在.vimrc中配置。具体请参考

let g:ycm_error_symbol ='>>'let g:ycm_warning_symbol ='>*'

同时,YCM可以打开location-list来显示警告和错误的信息:YcmDiags。个人关于ycm的配置如下:

" for ycm
let g:ycm_error_symbol = '>>'
let g:ycm_warning_symbol = '>*'
nnoremap gl :YcmCompleter GoToDeclaration
nnoremap gf :YcmCompleter GoToDefinition
nnoremap gg :YcmCompleter GoToDefinitionElseDeclaration
nmap  :YcmDiags

YCM提供的跳跃功能采用了vim的jumplist,往前跳和往后跳的快捷键为Ctrl+O以及Ctrl+I

总结

YouCompleteMe是我用过的最爽的一个自动补全的插件了。之前使用acp时,遇到大文件基本上就卡死了,以至于都不怎么敢使用。由于YCM使用的时C/S结构,部分使用vim脚本编写,部分认为原生代码,使得跑起来速度飞快。

抛弃Vim自带的坑爹的补全吧,抛弃ctags吧,抛弃cscope吧,YCM才是终极补全神器

在安装过程中,我也遇到了不少的坑。一会会发一篇解决这些坑的文章。

最后祝大家码年顺利,一码平川,码到功成。

给新手的 10 个有用 Linux 命令行技巧

我记得我第一次使用 Linux 的时候,我还习惯于 Windows 的图形界面,我真的很讨厌 Linux 终端。那时候我觉得命令难以记忆,不能正确使用它们。随着时间推移,我意识到了 Linux 终端的优美、灵活和可用性,说实话,我没有一天不使用它。今天,我很高兴和刚开始接触 Linux 的人一起来分享一些有用的技巧和提示,希望能帮助他们更好的向 Linux 过渡,并帮助他们学到一些新的东西(希望如此)。

给新手的 10 个命令行技巧

10 个 Linux 命令行技巧

这篇文章希望向你展示一些不需要很高的技术就可以像一个高手一样使用 Linux 终端的有用技巧。你只需要一个 Linux 终端和一些自由时间来体会这些命令。

1. 找到正确的命令

执行正确的命令对你的系统来说非常重要。然而在 Linux 中有如此多的、难以记忆的各种的命令行。那么怎样才能找到你需要的正确命令呢?答案是 apropos。你只需要运行:

# apropos 

其中你要用真正描述你要查找的命令的语句代替 “description”。这里有一个例子:

# apropos "list directory"
dir (1) - list directory contents
ls (1) - list directory contents
ntfsls (8) - list directory contents on an NTFS filesystem
vdir (1) - list directory contents

左边你看到的是命令,右边是它们的描述。

2. 执行之前的命令

很多时候你需要一遍又一遍执行相同的命令。尽管你可以重复按你键盘上的向上光标键,但你也可以用 history 命令替代。这个命令会列出自从你上次启动终端以来所有输入过的命令:

# history
    1  fdisk -l
    2  apt-get install gnome-paint
    3  hostname tecmint.com
    4  hostnamectl tecmint.com
    5  man hostnamectl
    6  hostnamectl --set-hostname tecmint.com
    7  hostnamectl -set-hostname tecmint.com
    8  hostnamectl set-hostname tecmint.com
    9  mount -t "ntfs" -o
   10  fdisk -l
   11  mount -t ntfs-3g /dev/sda5 /mnt
   12  mount -t rw ntfs-3g /dev/sda5 /mnt
   13  mount -t -rw ntfs-3g /dev/sda5 /mnt
   14  mount -t ntfs-3g /dev/sda5 /mnt
   15  mount man
   16  man mount
   17  mount -t -o ntfs-3g /dev/sda5 /mnt
   18  mount -o ntfs-3g /dev/sda5 /mnt
   19  mount -ro ntfs-3g /dev/sda5 /mnt
   20  cd /mnt
   ...

正如你上面看到的,你会得到一个你运行过的命令的列表。每一行中有一个数字表示你在第几行输入了命令。你可以通过以下方法重新调用该命令:

!#

其中要用命令的实际编号代替 #。为了更好的理解,请看下面的例子:

!501

等价于:

# history

3. 使用 midnight 命令

如果你不习惯使用类似 cd、cp、mv、rm 等命令,你可以使用 midnight 命令。它是一个简单的可视化 shell,你可以在上面使用鼠标:

Midnight 命令

Midnight 命令

借助 F1 到 F12 键,你可以轻易地执行不同任务。只需要在底部选择对应的命令。要选择文件或者目录,按下 “Insert” 键。

简而言之 midnight 就是所谓的 “mc”。要安装 mc,只需要运行:

$ sudo apt-get install mc        [On Debian based systems]

# yum install mc                 [On Fedora based systems]

下面是一个使用 midnight 命令器的简单例子。通过输入以下命令打开 mc:

# mc

现在使用 TAB 键选择不同的窗口 – 左和右。我有一个想要移动到 “Software” 目录的 LibreOffice 文件:

Midnight 命令移动文件

Midnight 命令移动文件

按 F6 按钮移动文件到新的目录。MC 会请求你确认:

移动文件到新目录

移动文件到新目录

确认了之后,文件就会被移动到新的目标目录。

4. 在指定时间关闭计算机

有时候你需要在下班几个小时后再关闭计算机。你可以通过使用下面的命令在指定时间关闭你的计算机:

$ sudo shutdown 21:00

这会告诉你在你指定的时间关闭计算机。你也可以告诉系统在指定分钟后关闭:

$ sudo shutdown +15

这表示计算机会在 15 分钟后关闭。

5. 显示已知用户的信息

你可以使用一个简单的命令列出你 Linux 系统的用户以及一些关于它们的基本信息。

# lslogins

这会输出下面的结果:

UID USER PWD-LOCK PWD-DENY LAST-LOGIN GECOS
0 root 0 0 Apr29/11:35 root
1 bin 0 1 bin
2 daemon 0 1 daemon
3 adm 0 1 adm
4 lp 0 1 lp
5 sync 0 1 sync
6 shutdown 0 1 Jul19/10:04 shutdown
7 halt 0 1 halt
8 mail 0 1 mail
10 uucp 0 1 uucp
11 operator 0 1 operator
12 games 0 1 games
13 gopher 0 1 gopher
14 ftp 0 1 FTP User
23 squid 0 1
25 named 0 1 Named
27 mysql 0 1 MySQL Server
47 mailnull 0 1
48 apache 0 1 Apache
...

6. 查找文件

查找文件有时候并不像你想象的那么简单。一个搜索文件的好例子是:

# find /home/user -type f

这个命令会搜索 /home/user 目录下的所有文件。find 命令真的很强大,你可以传递更多选项给它使得你的搜索更加详细。如果你想搜索超过特定大小的文件,可以使用:

# find . -type f -size 10M

上面的命令会搜索当前目录中所有大于 10M 的文件。确保不要在你 Linux 系统的根目录运行该命令,因为这可能导致你的机器 I/O 瓶颈。

我最经常和 find 命令一起使用的选项之一是 “exec”,这允许你对 find 命令的结果运行一些操作。

例如,假如我们想查找一个目录中的所有文件并更改权限。可以通过以下简单命令完成:

# find /home/user/files/ -type f -exec chmod 644 {} \;

上面的命令会递归搜索指定目录内的所有文件,并对找到的文件执行 chmod 命令。推荐你阅读 35 个 Linux ‘find’ 命令的使用方法,我肯定你会发现这个命令更多的使用方法。

7. 用一个命令创建目录树

你很可能知道可以使用 mkdir 命令创建新的目录。因此如果你想创建一个新的目录,你可能会运行:

# mkdir new_folder

但如果你想在该目录下创建 5 个子目录呢?运行 5 次 mkdir 命令并非是一个好的选择。相反你可以类似下面这样使用 -p 选项:

# mkdir -p new_folder/{folder_1,folder_2,folder_3,folder_4,folder_5}

最后你会在 new_folder 中有 5 个目录:

# ls new_folder/
folder_1 folder_2 folder_3 folder_4 folder_5

8. 复制文件到多个目录

通常使用 cp 命令进行文件复制。复制文件通常看起来类似:

# cp /path-to-file/my_file.txt /path-to-new-directory/

现在假设你需要复制该文件到多个目录:

# cp /home/user/my_file.txt /home/user/1
# cp /home/user/my_file.txt /home/user/2
# cp /home/user/my_file.txt /home/user/3

这有点荒唐。相反,你可以用简单的一行命令解决问题:

# echo /home/user/1/ /home/user/2/ /home/user/3/ | xargs -n 1  cp /home/user/my_file.txt

9. 删除大文件

有时候文件可能会变得很大。我看过由于缺乏管理技能一个日志文件就超过 250G 的例子。用 rm 命令可能不足以删除该文件,因为有大量的数据需要移除。应该避免这个很“笨重”的操作。相反,你可以使用一个简单的方法解决这个问题:

# > /path-to-file/huge_file.log

当然你需要根据你实际情况替换路径和文件名。上面的命令写一个空输出到该文件。用更简单的话说它会清空文件而不会导致你的系统产生大的 I/O 消耗。

10. 在多个 Linux 服务器上运行相同命令

最近我们的一个读者在 LinuxSay 论坛提问说如何通过 ssh 在多个 Linux 服务器上执行一个命令。他机器的 IP 地址是:

10.0.0.1
10.0.0.2
10.0.0.3
10.0.0.4
10.0.0.5

这里有一个简单的解决方法。将服务器的 IP 地址写到文件 list.txt 中,像上面那样一行一个。然后运行:

# for in $i(cat list.txt); do ssh user@$i 'bash command'; done

上面的命令中你需要用实际登录的用户替换 “user”,用你希望执行的实际命令替换 “bash command”。这个方法非常适用于通过使用 SSH 密钥进行无密码验证,因为这样你不需要每次都为用户输入密码。

注意取决于你 Linux 系统的设置,你可能还需要传递一些额外的参数给 SSH 命令。

总结

上面的例子都很简单,我希望它们能帮助你发现 Linux 的优美之处,你如何能简单实现在其它操作系统上需要更多时间的不同操作。


via: http://www.tecmint.com/10-useful-linux-command-line-tricks-for-newbies/

作者:Marin Todorov 译者:ictlyh 校对:wxy

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

RHCSA 系列(十一): 使用 firewalld 和 iptables 来控制网络流量

简单来说,防火墙就是一个基于一系列预先定义的规则(例如流量包的目的地或来源,流量的类型等)的安全系统,它控制着一个网络中的流入和流出流量。

使用 FirewallD 和 Iptables 来控制网络流量

RHCSA: 使用 FirewallD 和 Iptables 来控制网络流量 – Part 11

在本文中,我们将回顾 firewalld 和 iptables 的基础知识。前者是 RHEL 7 中的默认动态防火墙守护进程,而后者则是针对 Linux 的传统的防火墙服务,大多数的系统和网络管理员都非常熟悉它,并且在 RHEL 7 中也可以用。

FirewallD 和 Iptables 的一个比较

在后台, firewalld 和 iptables 服务都通过相同的接口来与内核中的 netfilter 框架相交流,这不足为奇,即它们都通过 iptables 命令来与 netfilter 交互。然而,与 iptables 服务相反, firewalld 可以在不丢失现有连接的情况下,在正常的系统操作期间更改设定。

在默认情况下, firewalld 应该已经安装在你的 RHEL 系统中了,尽管它可能没有在运行。你可以使用下面的命令来确认(firewall-config 是用户界面配置工具):

# yum info firewalld firewall-config

检查 FirewallD 的信息

检查 FirewallD 的信息

以及,

# systemctl status -l firewalld.service

检查 FirewallD 的状态

检查 FirewallD 的状态

另一方面, iptables 服务在默认情况下没有被包含在 RHEL 系统中,但可以被安装上。

# yum update && yum install iptables-services

这两个守护进程都可以使用常规的 systemd 命令来在开机时被启动和开启:

# systemctl start firewalld.service | iptables-service.service
# systemctl enable firewalld.service | iptables-service.service

另外,请阅读:管理 Systemd 服务的实用命令

至于配置文件, iptables 服务使用 /etc/sysconfig/iptables 文件(假如这个软件包在你的系统中没有被安装,则这个文件将不存在)。在一个被用作集群节点的 RHEL 7 机子上,这个文件看起来是这样:

Iptables 防火墙配置文件

Iptables 防火墙配置文件

而 firewalld 则在两个目录中存储它的配置文件,即 /usr/lib/firewalld/etc/firewalld

# ls /usr/lib/firewalld /etc/firewalld

FirewallD 的配置文件

FirewallD 的配置文件

在这篇文章中后面,我们将进一步查看这些配置文件,在那之后,我们将在这两个地方添加一些规则。现在,是时候提醒你了,你总可以使用下面的命令来找到更多有关这两个工具的信息。

# man firewalld.conf
# man firewall-cmd
# man iptables

除了这些,记得查看一下当前系列的第一篇 RHCSA 系列(一): 回顾基础命令及系统文档,在其中我描述了几种渠道来得到安装在你的 RHEL 7 系统上的软件包的信息。

使用 Iptables 来控制网络流量

在进一步深入之前,或许你需要参考 Linux 基金会认证工程师(Linux Foundation Certified Engineer,LFCE) 系列中的 配置 Iptables 防火墙 – Part 8 来复习你脑中有关 iptables 的知识。

例 1:同时允许流入和流出的网络流量

TCP 端口 80 和 443 是 Apache web 服务器使用的用来处理常规(HTTP)和安全(HTTPS)网络流量的默认端口。你可以像下面这样在 enp0s3 接口上允许流入和流出网络流量通过这两个端口:

# iptables -A INPUT -i enp0s3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o enp0s3 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -i enp0s3 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o enp0s3 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

例 2:从某个特定网络中阻挡所有(或某些)流入连接

或许有时你需要阻挡来自于某个特定网络的所有(或某些)类型的来源流量,比方说 192.168.1.0/24:

# iptables -I INPUT -s 192.168.1.0/24 -j DROP

上面的命令将丢掉所有来自 192.168.1.0/24 网络的网络包,而

# iptables -A INPUT -s 192.168.1.0/24 --dport 22 -j ACCEPT

将只允许通过端口 22 的流入流量。

例 3:将流入流量重定向到另一个目的地

假如你不仅使用你的 RHEL 7 机子来作为一个软件防火墙,而且还将它作为一个硬件防火墙,使得它位于两个不同的网络之间,那么在你的系统上 IP 转发一定已经被开启了。假如没有开启,你需要编辑 /etc/sysctl.conf 文件并将 net.ipv4.ip_forward 的值设为 1,即:

net.ipv4.ip_forward = 1

接着保存更改,关闭你的文本编辑器,并最终运行下面的命令来应用更改:

# sysctl -p /etc/sysctl.conf

例如,你可能在一个内部的机子上安装了一个打印机,它的 IP 地址为 192.168.0.10,CUPS 服务在端口 631 上进行监听(同时在你的打印服务器和你的防火墙上)。为了从防火墙另一边的客户端传递打印请求,你应该添加下面的 iptables 规则:

# iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 631 -j DNAT --to 192.168.0.10:631

请记住 iptables 会逐条地读取它的规则,所以请确保默认的策略或后面的规则不会重载上面例子中那些规则。

FirewallD 入门

firewalld 引入的一个变化是区域(zone) (注:翻译参考了 https://fedoraproject.org/wiki/FirewallD/zh-cn )。这个概念允许将网路划分为拥有不同信任级别的区域,由用户决定将设备和流量放置到哪个区域。

要获取活动的区域,使用:

# firewall-cmd --get-active-zones

在下面的例子中,public 区域是激活的,并且 enp0s3 接口被自动地分配到了这个区域。要查看有关一个特定区域的所有信息,可使用:

# firewall-cmd --zone=public --list-all

列出所有的 Firewalld 区域

列出所有的 Firewalld 区域

由于你可以在 RHEL 7 安全指南 中阅读到更多有关区域的知识,这里我们将仅列出一些特别的例子。

例 4:允许服务通过防火墙

要获取受支持的服务的列表,可以使用:

# firewall-cmd --get-services

列出所有受支持的服务

列出所有受支持的服务

要立刻生效且在随后重启后都可以让 http 和 https 网络流量通过防火墙,可以这样:

# firewall-cmd --zone=MyZone --add-service=http
# firewall-cmd --zone=MyZone --permanent --add-service=http
# firewall-cmd --zone=MyZone --add-service=https
# firewall-cmd --zone=MyZone --permanent --add-service=https
# firewall-cmd --reload

假如 -–zone 被忽略,则使用默认的区域(你可以使用 firewall-cmd –get-default-zone来查看)。

若要移除这些规则,可以在上面的命令中将 add 替换为 remove

例 5:IP 转发或端口转发

首先,你需要查看在目标区域中,伪装(masquerading)是否被开启:

# firewall-cmd --zone=MyZone --query-masquerade

在下面的图片中,我们可以看到对于外部区域,伪装已被开启,但对于公用区域则没有:

在 firewalld 中查看伪装状态

查看伪装状态

你可以为公共区域开启伪装:

# firewall-cmd --zone=public --add-masquerade

或者在外部区域中使用伪装。下面是使用 firewalld 来重复例 3 中的任务所需的命令:

# firewall-cmd --zone=external --add-forward-port=port=631:proto=tcp:toport=631:toaddr=192.168.0.10

不要忘了重新加载防火墙。

在 RHCSA 系列的 第九部分 你可以找到更深入的例子,在那篇文章中我们解释了如何允许或禁用通常被 web 服务器和 ftp 服务器使用的端口,以及在针对这两个服务所使用的默认端口被改变时,如何更改相应的规则。另外,你或许想参考 firewalld 的 wiki 来查看更深入的例子。

总结

在这篇文章中,我们已经解释了防火墙是什么,介绍了在 RHEL 7 中用来实现防火墙的几个可用的服务,并提供了可以帮助你入门防火墙的几个例子。假如你有任何的评论,建议或问题,请随意使用下面的评论框来让我们知晓。这里就事先感谢了!


via: http://www.tecmint.com/firewalld-vs-iptables-and-control-network-traffic-in-firewall/

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

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

说说 nginx 刚发布的 JavaScript 能力 nginScript

背景

2015年9月,nginx宣布支持类JavaScript语言。这意味着开发者可以更轻松、自由的控制全球最优秀的HTTP及反向代理服务器,并在此之上可以衍生出更多有用、好玩的创意。Nginx也更开发的走向了动态配置化的下一个阶段。大家可以点击查看 官方介绍链接

先简单说说nginx

Nginx [engine x]是全球最受欢迎,也是最优秀的web服务器、反向代理服务器。通过第三方公司的统计,目前全球至少有23%的服务器采用了nginx,当然这个数字还在不断的扩大。目前也是国内BAT首选,所以这也是为什么我们第一时间关注到它的原因。 Nginx主要可以做以下几点:

  1. 工作在TCP第七层,可以对HTTP协议的所有内容进行分析和处理。
  2. 支持lua,perl,JavaScript动态语言
  3. 支持第三方插件

再说说nginScript

  1. nginScript是JavaScript/ECMAscript的子集。它实现了大部分的JavaScript语言的能力,没有完全遵从ECMAScript标准,同时抛弃了JavaScript比较难懂的部分。
  2. nginScript不是通过V8引擎实现的。而是通过一个更小、能耗更低、更符合nginx应用场景的小虚拟机(VM)来实现。可以理解为nginx为其实现了一套自己的词法解析。
  3. nginScript是跑在nginx的配置文件里。 比如:nginx.conf文件里。所以nginScript可以完成传统配置文件所能处理的所有事情,同时可以让配置管理动态化。这也是nginScript出现的最重要的原因。
  4. nginScript是以nginx插件的方式存在。 插件名叫:njs 。和其他nginx插件一样,我们需要重新编译nginx来完成安装。
  5. nginScript目前是早期研发状态。大家可以通过邮件nginx-devel@nginx.org等方式和nginx团队进行沟通和提出你的诉求。

如何安装nginScript

这里直接按照官方给出的步骤来就好:

  1. 下载最新nginx包,地址可见: http://nginx.org/en/download.html 。
    wget http://nginx.org/download/nginx-1.9.4.tar.gz 
  2. 解压 
    tar -xzvf nginx-1.9.4.tar.gz
  3. 通过mercurial获取nginScript模块,这里如果没有安装mercurial,需要先运行
    yum install mercurial
    hg clone http://hg.nginx.org/njs
  4. 编译nginx,这里只具体了njs模块,其他需要的模块自己要记得一起装哦。如果你没编译过nginx,有些依赖模块需要yum安装,请自行搜索
    cd nginx-1.9.4
    ./configure --add-module=../njs/nginx --prefix=/usr/local
    make
    make install

这就安装完了,我们可以开始玩啦。

具体如何使用nginScript

nginScript的使用主要是在nginx的配置体系里增加了2个指令。具体指令分别为:

  • js_set,设置配置里的变量值
  • js_run ,直接执行配置规则

1、先看看js_set 在nginx.conf里怎么运行的。

http {
    js_set $msg"
            var str = 'hello,imweb';
            // JavaScript str;
    ";
    server {
        ...
        location /{
            return 200 $msg;
        }
    }
}

结果:

上面例子里,可以看出,我们可以通过JS随意地给nginx设置变量值。而这些变量是可以用在nginx配置的各个地方。比如:proxy_pass,limit_req_zone, and sub_filter。这里相对之前配置已经大大的提高了灵活性。

2、js_run的运行规则和场景

  • js_run是运行在location指令里,匹配指定location的路径就会执行对应的JavaScript
  • js_run是直接通过JavaScript来产生HTTP返回的内容

下面举个具体的例子:

location /imwebteam {
    js_run "
        var res;
        res = $r.response;
        res.status = 200;
        res.send('hello,imweb!');
        res.finish();
    ";
}

这个结果和第一个结果是一样的。这里就不赘述。

3、处理两个指令以外,还有个重要的变量$r

通过js_setjs_run可以对HTTP request请求有完整的控制权,控制的方式就是变量$r的使用。 $r里有什么可以通过以下简单例子看到。

http {
    js_set $summary "
    var a, s, h;
    s = 'JS summary\n\n';
    s += 'Method: ' + $r.method + '\n';
    s += 'HTTP version: ' + $r.httpVersion + '\n';
    s += 'Host: ' + $r.headers.host + '\n';
    s += 'Remote Address: ' + $r.remoteAddress + '\n';
    s += 'URI: ' + $r.uri + '\n';
    s += 'Headers:\n';
    for (h in $r.headers) {
        s += '  header \"' + h + '\" is \"' + $r.headers[h] + '\"\n';
    }
    s += 'Args:\n';
    for (a in $r.args) {
        s += '  arg \"' + a + '\" is \"' + $r.args[a] + '\"\n';
    }
    s;
    ";
    server {
    listen 8000;
    location /imwebteam{
        return 200 $summary;
    }
}

结果如图:

nginScript目前还存在的问题

经过上面的介绍,相信大家对nginScript已经有了基本的认识。那么我们在看看这个新生儿有哪些问题吧。

  • 首先,调试方法弱。目前还是比较原始,通过log的方式来展示,且错误日志的详细程度很不如人意。
  • 其次,控制力度弱。目前nginScript的处理力度还仅限于http request的处理和返回response的层面,还无法做到动态处理nginx请求之外的一些内容,比如动态用户数据或转发配置表动态更新等。
  • 最后,整体实现弱。整体结构还是比较简单,js_run和js_set的运行环境是不太一致的,js_set执行ok的代码段在js_run上会出现一些异常。

综合来说,nginScript还是一个愿望和前景很美好的新生儿。需要一定时间打磨和优化。也希望大家多多的提供意见和反馈,甚至是提交自己的插件。从而使得它有更好的成长。

对于我们的实践场景

这个之前和黎小腾君,donald讨论过的2个主要场景,realLog系统和nohost2.0系统。 nginScript对这里两个场景来讲都无疑是很大的好消息,这里在规则响应上,在现有的体系下就可以有很灵活的处理方法。 但在用户配置动态加载方面,我们仍需要通过其他方式来实现,这个部分我们先提issue给到nginx开发团队,看下具体情况再和大家进一步讨论和同步。

RHCSA 系列(十二): 使用 Kickstart 完成 RHEL 7 的自动化安装

无论是在数据中心还是实验室环境,Linux 服务器很少是独立的机器,很可能有时你需要安装多个以某种方式相互联系的机器。假如你将在单个服务器上手动安装 RHEL 7 所花的时间乘以你需要配置的机器数量,这将导致你必须做出一场相当长的努力,而通过使用被称为 kicksta 的无人值守安装工具则可以避免这样的麻烦。

在这篇文章中,我们将向你展示使用 kickstart 工具时所需的一切,以便在安装过程中,不用你时不时地照看“处在襁褓中”的服务器。

RHEL 7 的自动化 Kickstart 安装

RHCSA: RHEL 7 的自动化 Kickstart 安装

Kickstart 和自动化安装简介

Kickstart 是一种被用来执行无人值守操作系统安装和配置的自动化安装方法,主要被 RHEL(以及其他 Fedora 的副产品,如 CentOS,Oracle Linux 等)所使用。因此,kickstart 安装方法可使得系统管理员只需考虑需要安装的软件包组和系统的配置,便可以得到相同的系统,从而省去必须手动安装这些软件包的麻烦。

准备 Kickstart 安装

要执行 kickstart 安装,我们需要遵循下面的这些步骤:

  1. 创建一个 Kickstart 文件,它是一个带有多个预定义配置选项的纯文本文件。

  2. 将 Kickstart 文件保存在可移动介质上,如一个硬盘或一个网络位置。kickstart 客户端需要使用 rhel-server-7.0-x86_64-boot.iso 镜像文件,而你还需要可从一个网络资源上获取得到完整的 ISO 镜像 rhel-server-7.0-x86_64-dvd.iso ,例如通过一个 FTP 服务器的 HTTP 服务形式(在我们当前的例子中,我们将使用另一个 IP 地址为 192.168.0.18 的 RHEL 7 机器)。

  3. 开始 Kickstart 安装。

要创建一个 kickstart 文件,请登录你的红帽客户门户网站(Red Hat Customer Portal)帐户,并使用 Kickstart 配置工具 来选择所需的安装选项。在向下滑动之前请仔细阅读每个选项,然后选择最适合你需求的选项:

Kickstart 配置工具

Kickstart 配置工具

假如你指定安装将通过 HTTP,FTP,NFS 来执行,请确保服务器上的防火墙允许这些服务通过。

尽管你可以使用红帽的在线工具来创建一个 kickstart 文件,但你还可以使用下面的代码来作为参考手动地创建它。例如,你可以注意到,下面的代码指定了安装过程将使用英语环境,使用拉丁美洲键盘布局,并设定时区为 America/Argentina/San_Luis 时区:

lang en_US
keyboard la-latin1
timezone America/Argentina/San_Luis --isUtc
rootpw $1$5sOtDvRo$In4KTmX7OmcOW9HUvWtfn0 --iscrypted
#platform x86, AMD64, or Intel EM64T
text
url --url=http://192.168.0.18//kickstart/media
bootloader --location=mbr --append="rhgb quiet crashkernel=auto"
zerombr
clearpart --all --initlabel
autopart
auth --passalgo=sha512 --useshadow
selinux --enforcing
firewall --enabled
firstboot --disable
%packages
@base
@backup-server
@print-server
%end

在上面的在线配置工具中,在选择以 HTTP 来作为安装源后,设置好在安装过程中使用 192.168.0.18 来作为 HTTP 服务器的地址,/kickstart/tecmint.bin 作为 HTTP 目录。

在上面的 kickstart 示例文件中,你需要特别注意

url --url=http://192.168.0.18//kickstart/media

这个目录是你展开 DVD 或 ISO 安装介质内容的地方。在执行解压之前,我们将把 ISO 安装文件作为一个回环设备挂载到 /media/rhel 目录下:

# mount -o loop /var/www/html/kickstart/rhel-server-7.0-x86_64-dvd.iso /media/rhel

挂载 RHEL ISO 镜像

挂载 RHEL ISO 镜像

接下来,复制 /media/rhel 中的全部文件到 /var/www/html/kickstart/media 目录:

# cp -R /media/rhel /var/www/html/kickstart/media

这一步做完后,/var/www/html/kickstart/media 目录中的文件列表和磁盘使用情况将如下所示:

Kickstart 媒体文件

Kickstart 媒体文件

现在,我们已经准备好开始 kickstart 安装了。

不管你如何选择创建 kickstart 文件的方式,在执行安装之前检查下这个文件的语法是否有误总是一个不错的主意。为此,我们需要安装 pykickstart 软件包。

# yum update && yum install pykickstart

然后使用 ksvalidator 工具来检查这个文件:

# ksvalidator /var/www/html/kickstart/tecmint.bin

假如文件中的语法正确,你将不会得到任何输出,反之,假如文件中存在错误,你得到警告,向你提示在某一行中语法不正确或出错原因未知。

执行 Kickstart 安装

首先,使用 rhel-server-7.0-x86_64-boot.iso 来启动你的客户端。当初始屏幕出现时,选择安装 RHEL 7.0 ,然后按 Tab 键来追加下面这一句,接着按 Enter 键:

# inst.ks=http://192.168.0.18/kickstart/tecmint.bin

RHEL Kickstart 安装

RHEL Kickstart 安装

其中 tecmint.bin 是先前创建的 kickstart 文件。

当你按了 Enter 键后,自动安装就开始了,且你将看到一个列有正在被安装的软件的列表(软件包的数目和名称根据你所选择的程序和软件包组而有所不同):

RHEL 7 的自动化 Kickstart 安装

RHEL 7 的自动化 Kickstart 安装

当自动化过程结束后,将提示你移除安装介质,接着你就可以启动到你新安装的系统中了:

RHEL 7 启动屏幕

RHEL 7 启动屏幕

尽管你可以像我们前面提到的那样,手动地创建你的 kickstart 文件,但你应该尽可能地考虑使用受推荐的方式:你可以使用在线配置工具,或者使用在安装过程中创建的位于 root 家目录下的 anaconda-ks.cfg 文件。

这个文件实际上就是一个 kickstart 文件,你或许想在选择好所有所需的选项(可能需要更改逻辑卷布局或机器上所用的文件系统)后手动地安装第一个机器,接着使用产生的 anaconda-ks.cfg 文件来自动完成其余机器的安装过程。

另外,使用在线配置工具或 anaconda-ks.cfg 文件来引导将来的安装将允许你在系统安装时以加密的形式设置 root 密码。

总结

既然你知道了如何创建 kickstart 文件并如何使用它们来自动完成 RHEL 7 服务器的安装,你就可以不用时时照看安装进度的过程了。这将给你时间来做其他的事情,或者若你足够幸运,你还可以用来休闲一番。

无论以何种方式,请使用下面的评论栏来让我们知晓你对这篇文章的看法。提问也同样欢迎!

另外,请阅读:使用 PXE 和 kickstart 来自动化安装多个 RHEL/CentOS 7 发行版本


via: http://www.tecmint.com/automatic-rhel-installations-using-kickstart/

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

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