Skip to content Skip to main navigation Skip to footer

Linux

Linux:如何在 Ubuntu 14.04 里面配置 chroot 环境

你可能会有很多理由想要把一个应用、一个用户或者一个环境与你的 linux 系统隔离开来。不同的操作系统有不同的实现方式,而在 linux 中,一个典型的方式就是 chroot 环境。

在这份教程中,我会一步一步指导你怎么使用 chroot 命令去配置一个与真实系统分离出来的独立环境。这个功能主要可以用于测试项目,以下这些步骤都在 Ubuntu 14.04 虚拟专用服务器(VPS)上执行。

学会快速搭建一个简单的 chroot 环境是一项非常实用的技能,绝大多数系统管理员都能从中受益。

Chroot 环境

一个 chroot 环境就是通过系统调用,将一个本地目录临时变成根目录。一般所说的系统根目录就是挂载点”/”,然而使用 chroot 命令后,你可以使用其它目录作为根目录。

Linux:如何在 Ubuntu 14.04 里面配置 chroot 环境
Linux:如何在 Ubuntu 14.04 里面配置 chroot 环境

原则上,任何运行在 chroot 环境内的应用都不能访问系统中其他信息(LCTT译注:使用 chroot 把一个目录变成根目录,在里面运行的应用只能访问本目录内的文件,无法访问到目录外的文件。然而,运行在 chroot 环境的应用可以通过 sysfs 文件系统访问到环境外的信息,所以,这里有个“原则上”的修饰语)。

Chroot 环境的用处

  • 测试一个不稳定的应用服务不会影响到整个主机系统。

  • 就算使用 root 权限做了些不当的操作,把 chroot 环境搞得一塌糊涂,也不会影响到主机系统。

  • 可以在你的系统中运行另外一个操作系统。

举个例子,你可以在 chroot 环境中编译、安装、测试软件,而不去动真实的系统。你也可以在64位环境下使用 chroot 创建一个32位环境,然后运行一个32位的程序(LCTT泽注:如果你的真实环境是32位的,那就不能 chroot 一个64位的环境了)。

但是为了安全考虑,chroot 环境为非特权用户设立了非常严格的限制,而不是提供完整的安全策略。如果你需要的是有完善的安全策略的隔离方案,可以考虑下 LXC、Docker、vservers等等。

Debootstrap 和 Schroot

使用 chroot 环境需要安装 debootstrapschroot,这两个软件都在 Ubuntu 的镜像源中。其中 schroot 用于创建 chroot 环境。

Debootstrap 可以让你通过镜像源安装任何 Debian(或基于 Debian 的)系统,装好的系统会包含最基本的命令。

Schroot 命令允许用户使用相同的机制去创建 chroot 环境,但在访问 chroot 环境时会做些权限检查,并且会允许用户做些额外的自动设置,比如挂载一些文件系统。

在 Ubuntu 14.04 LTS 上,我们可以通过两步来实现这个功能:

1. 安装软件包

第一步,在Ubuntu 14.04 LTS 主机系统上安装 debootstrap 和 schroot:

$ sudo apt-get install debootstrap
$ sudo apt-get install schroot

2. 配置 Schroot

现在我们有工具在手,需要指定一个目录作为我们的 chroot 环境。这里创建一个目录先:

sudo mkdir /linoxide

编辑 schroot 的配置文件:

sudo nano /etc/schroot/schroot.conf

再提醒一下,我们现在是在 Ubuntu 14.04 LTS 系统上。如果我们想测试一个软件包能不能在 Ubuntu 13.10(代号是“Saucy Salamander”) 上运行,就可以在配置文件中添加下面的内容:

[saucy]
description=Ubuntu Saucy
location=/linoxide
priority=3
users=arun
root-groups=root
Linux:如何在 Ubuntu 14.04 里面配置 chroot 环境
Linux:如何在 Ubuntu 14.04 里面配置 chroot 环境

根据你的系统要求,调整上面的配置信息。

3. 使用 debootstrap 安装32位 Ubuntu 系统

Debootstrap 命令会在你的 chroot 环境里面下载安装一个最小系统。只要你能访问镜像源,你就可以安装任何基于 Debian 的系统版本。

前面我们已经创建了 /linoxide 目录用于放置 chroot 环境,现在我们可以在这个目录里面运行 debootstrap 了:

cd /linoxide
sudo debootstrap --variant=buildd --arch amd64 saucy /linoxide/ http://archive.ubuntu.com/ubuntu/
sudo chroot /linoxide /debootstrap/debootstrap --second-stage

你可以将 –arch 的参数换成 i386 或其他架构,只要存在这种架构的镜像源。你也可以把镜像源 http://archive.ubuntu.com/ubuntu/ 换成离你最近的镜像源,具体可参考 Ubuntu 官方镜像主页

注意:如果你是在64位系统中创建32位系统,你需要在上面第3行命令中加入 –foreign 选项,就像下面的命令:

sudo debootstrap --variant=buildd --foreign --arch i386 saucy /linoxide/ http://archive.ubuntu.com/ubuntu/

下载需要一段时间,看你网络带宽性能。最小系统大概有500M。

4. 完成 chroot 环境

安装完系统后,我们需要做一些收尾工作,确保系统运行正常。首先,保证主机的 fstab 程序能意识到 chroot 环境的存在:

sudo nano /etc/fstab

在文件最后面添加下面的配置:

proc /linoxide/proc proc defaults 0 0
sysfs /linoxide/sys sysfs defaults 0 0

保存并关闭文件。

挂载一些文件系统到 chroot 环境:

$ sudo mount proc /linoxide/proc -t proc
$ sudo mount sysfs /linoxide/sys -t sysfs

复制 /etc/hosts 文件到 chroot 环境,这样 chroot 环境就可以使用网络了:

$ sudo cp /etc/hosts /linoxide/etc/hosts

最后使用 schroot -l 命令列出系统上所有的 chroot 环境:

$ schroot -l

使用下面的命令进入 chroot 环境:

$ sudo chroot /linoxide/ /bin/bash

测试安装的版本:

# lsb_release -a
# uname -a

为了在 chroot 环境中使用图形界面,你需要设置 DISPLAY 环境变量:

$ DISPLAY=:0.0 ./apps

目前为止,我已经成功地在 Ubuntu 14.04 LTS 上安装了 Ubuntu 13.10。

退出 chroot 环境:

# exit

清理一下,卸载文件系统:

$ sudo umount /test/proc
$ sudo umount /test/sys

via: http://linoxide.com/ubuntu-how-to/configure-chroot-environment-ubuntu-14-04/

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

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

来源:https://linux.cn/article-4936-1.html

Linux:怎样在 Linux 系统中恢复已删除文件

当用户意外地删除了一个仍然需要的文件时,大多数情况下,是没有简便的方法可以重新找回或重建这个文件。不过,幸运的是文件是可以通过一些方法恢复的。当用户删除了一个文件,该文件并没有消失,只是被隐藏了一段时间。

这里将解释它是如何工作的。在一个文件系统中,有一个叫做 文件分配表 的东西,这个表跟踪文件在存储单元(如硬盘, MicroSD 卡,闪存驱动器等等)中的位置。当一个文件被删除,文件系统将会在文件分配表中执行以下两个任务之一:这个文件在文件分配表上的条目被标记为 “自由空间” 或删除文件分配表里这个文件的条目,且将相应的空间被标记为自由空间 。现在,如果有一个新的文件需要被放置在一个存储单元上,操作系统将会把这个文件放置到标记为空位的地方。在新文件被写入到这个空位后,被删除的文件就彻底消失了。当需要恢复一个已经删除的文件时,用户绝对不能再对任何文件进行操作,因为假如该文件对应的“空位”被占用,这个文件就永远也不能恢复了。

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件

恢复软件是如何工作的?

大多数的文件系统(在删除文件时)只是标记空间为空白。在这些文件系统下,恢复软件查看文件分配表这个文件,然后复制被删除的文件到另外的存储单元中。假如该文件被复制到其它需要恢复的被删除的存储单元中,那么用户将有可能会失去那个所需的删除文件。

文件系统很少会擦除文件分配表中的条目。假如文件系统真的这样做了, 这便是恢复软件在恢复文件了。恢复软件在存储单元中扫描文件头,所有文件都拥有一个特殊的编码字符串,它们位于文件的最前面,也被叫做 魔法数字。例如,一个编译的 JAVA 类文件的魔法数字在十六进制中是“CAFEBABE”。所以,假如要恢复该类型的文件,恢复软件会查找 “CAFEBABE” 然后复制文件到另一个存储单元。一些恢复软件可以查找某种特殊的文件类型。若用户想恢复一个 PDF 文件,则恢复软件将会查找十六进制的魔法数字 “25504446”,这恰恰是 ASCII 编码中的 “%PDF”。恢复软件将会查找所有的魔法数字,然后用户可以选择恢复哪个已删除的文件。

假如一个文件的部分被覆写了,则整个文件就会被损坏。通常这个文件可以被恢复,但是其中的内容可能已经没有什么用处。例如,恢复一个已损坏的 JPEG 文件将会是无意义的,因为图片查看器不能从这个损坏的文件产生一幅图片。因此,即使用户拥有了这个文件,该文件也将毫无用处。

设备的位置:

在我们继续之前,下面的一些信息将会对指引恢复软件找到正确的存储单元起到一定的帮助。所有的设备均挂载在 /dev/ 目录下。操作系统赋予每个设备的名称(并不是管理员给予每个分区或设备的名称)遵循一定的命名规律。

第一个 SATA 硬盘的第二个分区的名称将会是 sda2。名称的第一个字母暗示了存储类型,在这里指的是 SATA,但字母 “s” 也可能指的是 SCSI、 FireWire(火线端口)或 USB。第二个字母 “d” 指的是 disk(硬盘)。第三个字母指的是设备序数,即字母 “a” 指的是第一个 SATA 而 “b” 指的是第二个。最后的数字代表分区。没有分区数字的设备名代表该设置的所有分区。对于上面的例子,对应的名称为 sda 。作为命名的第一个字母还可能是 “h” ,这对应 PATA 硬盘(IDE)。

以下为命名规律的一些例子。假如一个用户有一个 SATA 硬盘(sda),这个设备有 4 个分区- sda1、 sda2、 sda3 和 sda4 。该用户删除了第三个分区,但直到格式化第四个分区之前,第四个分区名 sda4 都将保留不变。然后该用户插入了一个带有一个分区 – 即sdb1- 的 usb 存储卡(sdb),又增加了一个带有一个分区 -hda1- 的 IDE 硬盘 ,接着该用户又增加了一个 SCSI 硬盘 – sdc1 。接着用户移除了 USB 存储卡(sdb)。现在,SCSI 硬盘的名称仍然为 sdc,但如果这个 SCSI 被移除接着再被插入,则它的名称将变为 sdb。虽然还有其他的存储设备存在, 那个 IDE 硬盘的名称仍会有一个 “a”, 因为它是第一个 IDE 硬盘,IDE 设备的命名与 SCSI、 SATA、 FireWire 和 USB 设备要分开计数。

使用 TestDisk 进行恢复:

每个恢复软件有其不同的功能,特征及支持的不同文件系统。下面是一些关于 使用 TestDisk 在各种文件系统中恢复文件的指南。

FAT16、 FAT32、 exFAT (FAT64)、 NTFS 以及 ext2/3/4:

TestDisk 是一个运行在 Linux、 *BSD、 SunOS、 Mac OS X、 DOS 和 Windows 等操作系统下的开源的自由软件。 TestDisk 可以从下面的链接中找到 :http://www.cgsecurity.org/wiki/TestDisk。TestDisk 也可以通过键入 sudo apt-get install testdisk 来安装。TestDisk 有着许多的功能,但这篇文章将只关注恢复文件这个功能。

使用 root 权限从终端中打开 TestDisk 可以通过键入 sudo testdisk 命令。

现在, TestDisk 命令行应用将会被执行。终端的显示将会改变。TestDisk 询问用户它是否可以保留日志,这完全由用户决定。假如一个用户正从系统存储中恢复文件,则不必保留日志。可选择的选项有“生成”、 “追加” 和 “无日志”。假如用户想保留日志,则日志将会保留在该用户的主目录。

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件

在接着的屏幕中,存储设备以 /dev/*的方式被罗列出来。对于我的系统,系统的存储单元为 /dev/sda,这意味着我的存储单元为 一个 SATA硬盘(sd)且它是第一个硬盘(a)。每个存储单元的容量以 Gigabyte(千兆字节)为单位显示的。使用上下键来选择一个存储设备然后点击进入。

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件

下一屏显示出一个列有分区表(也叫做分区映射表)的清单。正如文件有文件配置表,分区有着分区表。分区是存储设备上的分段。例如在几乎所有的 Linux 系统中,至少存在两种分区类型 – EXT3/4 和 Swap 。每一个分区表将会在下面被简要地描述。TestDisk 并不支持所有类型的分区表,所以这并不是完整的列表。

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件
  • Intel – 这类分区表在 Windows 系统和许多的 Linux 系统中非常普遍,它也常常称作 MBR 分区表。
  • EFI GPT – 这种类型的分区表通常用在 Linux 系统中。对于 Linux 系统,这种分区表是最为推荐的, 因为逻辑分区或扩展分区的概念并不适用于 GPT (GUID Partition Table) 分区表。 这意味着,如果每个分区中有一个 Linux 系统,一个 Linux 用户可以从多种类型的 Linux 系统中进行多重启动。当然使用 GPT 分区表还有其他的优势,但那些已超出了本文的讨论范围。
  • Humax – Humax 分区映射表适用于韩国公司 Humax 生产的设备。
  • Mac – Apple 分区映射表 (APM) 适用于 Apple 的设备。
  • None – 某些设备并没有分区表。例如,许多 Subor 游戏控制台不使用分区映射表。如果一个用户试图以其它分区表类型从这类设备中恢复文件,用户就会困扰 TestDisk 为何找卟到任何的文件系统或者文件。
  • Sun – Sun 分区表适用于 Sun 系统。
  • Xbox -Xbox 适用于使用 Xbox 分区映射表的存储设备。

假如用户选择了 “Xbox” ,尽管他的系统使用了 GPT 分区表, 那么 TestDisk 将不能找到任何分区或文件系统。假如 TestDisk 按照用户的选择执行,则它可能猜测错误。(下面的图片显示的是当分区表类型错误时的输出)

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件

当用户为他们的设备选择了正确的选项,则在下一屏中,选择 “高级” 选项。

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件

现在,用户将看到一个列有用户存储设备中所有的文件系统或分区的列表。假如用户选择了错误的分区映射表,则在这一步中用户就将会知道他们做出了错误的选择。假如没有错误,通过移动文字光标来高亮选择含有被删除文件的分区。使用 左右键来高亮位于终端底部的 “列表”。接着,按下回车确认。

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件

新的一屏便会呈现出列有文件和目录的列表。那些白色的文件名就是未被删除的文件,而红色的文件名是那些已被删除的文件。最右边的一列是文件的名称,从右到左方向的接着一列是文件的创建日期,再往左的一列是文件的大小(以 byte/ 比特为单位),最左边带有“-”,“d” ,“r”, “w” 和”x”的一列则代表的是文件的权限情况。“d” 表示该文件为一个目录,其他的权限术语与本文关系不大。在列表的最顶端以“.”代表的一项表示当前目录,第二行以”..”代表的一项表示当前目录的上级目录,所以用户可以通过选择目录所在行到达该目录。

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件

举个例子,我想进入”Xaiml_Dataset” 目录,该目录基本上由被删除的文件组成。通过按键盘上的 “c”键,我将恢复文件 “computers.xaiml”,接着我被询问选择一个目标目录,当然,我应该放置该文件到另一个分区中。现在,当我在我的家目录时,按下了“c”键。(选择目标目录时)哪个目录被高亮并没有什么影响,当前目录就是目标目录,在屏幕的上方,将会显示“复制完成”的消息。在我的家目录中便会有一个名为”Xaiml_Dataset”的目录,里面里有一个 Xaiml 文件。 假如我在更多的已删除文件上按“c” 键,则这些文件将会被放置到新的文件夹中而无需再向我询问目标目录。

Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件
Linux:怎样在 Linux 系统中恢复已删除文件

当这些步骤完成后,重复按“q”键直到看到正常的终端模样。目录”Xaiml_Dataset” 只能被 root 用户访问。为了解决这个问题,使用 root 权限改变该目录及其子目录的权限。做完这些后,文件便被恢复了且用户可以访问它们。

特别的 ReiserFS:

为了从 ReiserFS 文件系统中恢复一个文件,首先需将分区中的所有文件做一个备份。因为如果发生某些错误, 这个方法可能会引起文件丢失。接着执行下面的命令,其中 DEVICE指的是那些以 sda2 形式命名的设备。一些文件将被放入 lost+found 目录而其他则会保存到原先被删除的位置。

reiserfsck --rebuild-tree --scan-whole-partition /dev/DEVICE

恢复被某个程序打开的删除文件:

假设用户意外地删除了一个文件,且该文件被某个程序打开。虽然在硬盘中该文件被删除了,但这个程序正使用着位于 RAM 中的该文件的副本。幸好,我们有两种简单的解决方法来恢复该文件。

假如这个软件有保存功能,如文本编辑器,则用户可以重新保存该文件,这样,文本编辑器可以将该文件写入硬盘中。

假设在音乐播放器中有一个 MP3 文件,而该音乐播放器并不能保存该 MP3 文件,则这种情形下需要比先前花更多的时间来恢复文件。不幸的是,这种方法并不能保证在所有的系统和应用中有效。首先,键入下面的命令。

lsof -c smplayer | grep mp3

上面的命令会列出所有由 smplayer 使用的文件,这个列表由 grep 命令通过管道搜索 mp3 。命令的输入类似于下面:

smplayer  10037 collier  mp3    169r      8,1  676376  1704294 /usr/bin/smplayer

现在,键入下面的命令来直接从 RAM(在 Linux 系统中,/proc/映射到 RAM)中恢复文件,并复制该文件到选定的文件夹中。其中 cp 指的是复制命令,输出中的数字 10037 来自于进程数,输出中的数字 169 指的是文件描述符,”~/Music/”为目标目录,最后的 “music.mp3” 为用户想恢复的文件的名称。

cp /proc/10037/fd/169 ~/Music/music.mp3

真正的删除:

为确保一个文件不能被恢复,可以使用一个命令来 “擦除” 硬盘。擦除硬盘实际上是向硬盘中写入无意义的数据。例如,许多擦除程序向硬盘中写入零,随机字母或随机数据。不会有空间被占用或丢失,擦除程序只是对空位进行重写覆盖。假如存储单元被文件占满而没有空余空间,则所有先前被删除的文件将会消失而不能恢复。

擦除硬盘的目的是确保隐私数据不被他人看见。举个例子,一个公司可能预订了一些新的电脑,总经理决定将旧的电脑卖掉,然而,新的电脑拥有者可能会看到公司的一些机密或诸如信用卡号码,地址等顾客信息。幸好,公司的电脑技术人员可以在卖掉这些旧电脑之前,擦除这些硬盘。

为了安装擦除程序 secure-delete,键入 sudo apt-get install secure-delete,这个命令将会安装一个包含 4 个程序的程序集,用以确保被删除的文件不能被恢复。

  • srm – 永久删除一个文件。使用方法: srm -f ./secret_file.txt
  • sfill – 擦除空白空间。使用方法: sfill -f /mount/point/of/partition
  • sswap – 擦除 swap 空间。使用方法: sswap -f /dev/SWAP_DEVICE

假如电脑实际去清除那些删除的文件,那么就需要花费更长的时间去执行删除任务。将某些空间标记为空位是快速且容易的,但使得文件永远消失需要花费一定的时间。例如,擦除一个存储单元,可能需要花费几个小时的时间(根据磁盘容量大小)。总之,现在的系统工作的就挺好,因为即便用户清空了垃圾箱,他们仍然有另一次机会来改变他们当初的想法(或错误)。


via: http://www.linux.org/threads/undelete-files-on-linux-systems.4316/

作者:DevynCJohnson 译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-4938-1.html

Linux:Linux有问必答:如何修复Chrome的"Your profile could not be opened correctly"

提问:当我在linux打开Google Chrome 浏览器时,我已经几次收到弹出窗口,提示我的配置文件没有被正确打开(Your profile could not be opened correctly.)。每次我打开Chrome都要弹出来,我应该如何修复这个问题?

当你在你的Chrome上看见”Your profile could not be opened correctly”错误信息时,从某种程度上讲,那是因为你的Chrome配置文件数据已经损坏。这个问题经常发生在手动升级Google Chrome的时候。

Linux:Linux有问必答:如何修复Chrome的"Your profile could not be opened correctly"
Linux:Linux有问必答:如何修复Chrome的"Your profile could not be opened correctly"

修复取决于到底哪个文件损坏,你可以试试下面的几个方法。

方法一

关掉所有Chrome窗口和标签页。

进入~/.config/google-chrome/Default,移除或者重命名”Web Data”文件。

$ cd ~/.config/google-chrome/Default
$ rm "Web Data"

再次开打Google Chrome浏览器。

方法二

关掉所有Chrome窗口和标签页。

进入~/.config/google-chrome/”Profile 1″,并重命名”History”文件。

$ cd ~/.config/google-chrome/"Profile 1"
$ mv History History.bak

再次开打Google Chrome浏览器。

方法三

如果依然没有解决,你可以试试移除所有默认配置文件夹(~/.config/google-chrome/Default)。注意:如果这样做,你将会遗失所有之前打开的Google标签、导入的书签,浏览记录和登录数据等。

在移除之前,先关掉所有Chrome窗口和标签页

$ rm -rf ~/.config/google-chrome/Default

之后重启Google Chrome,文件夹~/.config/google-chrome/Default会自动生成。


via: http://ask.xmodulo.com/your-profile-could-not-be-opened-correctly-google-chrome.html

译者:VicYu/Vic020 校对:Caroline

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

来源:https://linux.cn/article-4941-1.html

Linux:配置高可用的Hadoop平台

1.概述

  在Hadoop2.x之后的版本,提出了解决单点问题的方案--HA(High Available 高可用)。这篇博客阐述如何搭建高可用的HDFS和YARN,执行步骤如下:

  1. 创建hadoop用户
  2. 安装JDK
  3. 配置hosts
  4. 安装SSH
  5. 关闭防火墙
  6. 修改时区
  7. ZK(安装,启动,验证)
  8. HDFS+HA的结构图
  9. 角色分配
  10. 环境变量配置
  11. 核心文件配置
  12. slave
  13. 启动命令(hdfs和yarn的相关命令)
  14. HA的切换
  15. 效果截图

  下面我们给出下载包的链接地址:

  hadoop2.x下载地址

  zookeeper下载地址

      JDK下载地址

  注:若JDK无法下载,请到Oracle的官网下载JDK。

  到这里安装包都准备好了,接下来我们开始搭建与配置。

2.搭建

2.1创建Hadoop用户

useradd hadoop
passwd hadoop

 然后根据提示,设置密码。接着我给hadoop用户设置面免密码权限,也可自行添加其他权限。

chmod +w /etc/sudoers
hadoop ALL=(root)NOPASSWD:ALL
chmod -w /etc/sudoers

2.2安装JDK

  将下载好的安装包解压到 /usr/java/jdk1.7,然后设置环境变量,命令如下:

sudo vi /etc/profile

  然后编辑配置,内容如下:

export JAVA_HOME=/usr/java/jdk1.7
export PATH=$PATH:$JAVA_HOME/bin

  然后使环境变量立即生效,命令如下:

source /etc/profile

  然后验证JDK是否配置成功,命令如下:

java -version

  若显示对应版本号,即表示JDK配置成功。否则,配置无效!

2.3配置hosts

  集群中所有机器的hosts配置要要相同(推荐)。可以避免不必要的麻烦,用域名取代IP,方便配置。配置信息如下:

10.211.55.12    nna  # NameNode Active
10.211.55.13    nns  # NameNode Standby
10.211.55.14    dn1  # DataNode1
10.211.55.15    dn2  # DataNode2
10.211.55.16    dn3  # DataNode3

  然后用scp命令,将hosts配置分发到各个节点。命令如下:

# 这里以NNS节点为例子
scp /etc/hosts hadoop@nns:/etc/

2.4安装SSH

  输入如下命令:

ssh-keygen –t rsa

  然后一路按回车键,最后在将id_rsa.pub写到authorized_keys,命令如下:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

  在hadoop用户下,需要给authorized_keys赋予600的权限,不然免密码登陆无效。在其他节点只需要使用 ssh-keygen –t rsa 命令,生产对应的公钥,然后将各个节点的id_rsa.pub追加到nna节点的authorized_keys中。最后,将nna节点下的authorized_keys文件通过scp命令,分发到各个节点的 ~/.ssh/ 目录下。目录如下:

# 这里以NNS节点为例子
scp ~/.ssh/authorized_keys hadoop@nns:~/.ssh/

   然后使用ssh命令相互登录,看是否实现了免密码登录,登录命令如下:

# 这里以nns节点为例子
ssh nns

  若登录过程中木有提示需要输入密码,即表示密码配置成功。

2.5关闭防火墙

  由于hadoop的节点之间需要通信(RPC机制),这样一来就需要监听对应的端口,这里我就直接将防火墙关闭了,命令如下:

chkconfig  iptables off

  注:如果用于生产环境,直接关闭防火墙是存在安全隐患的,我们可以通过配置防火墙的过滤规则,即将hadoop需要监听的那些端口配置到防火墙接受规则中。关于防火墙的规则配置参见“linux防火墙配置”,或者通知公司的运维去帮忙配置管理。

  同时,也需要关闭SELinux,可修改 /etc/selinux/config 文件,将其中的 SELINUX=enforcing 改为 SELINUX=disabled即可。

2.6修改时区

  各个节点的时间如果不同步,会出现启动异常,或其他原因。这里将时间统一设置为Shanghai时区。命令如下:

# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cp: overwrite `/etc/localtime'? yes
修改为中国的东八区
# vi /etc/sysconfig/clock
ZONE="Asia/Shanghai"
UTC=false
ARC=false

 

2.7ZK(安装,启动,验证)

2.7.1安装

  将下载好的安装包,解压到指定位置,这里为直接解压到当前位置,命令如下:

tar -zxvf zk-{version}.tar.gz

  修改zk配置,将zk安装目录下conf/zoo_sample.cfg重命名zoo.cfg,修改其中的内容:

# The number of milliseconds of each tick
# 服务器与客户端之间交互的基本时间单元(ms)
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
# zookeeper所能接受的客户端数量
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# 服务器和客户端之间请求和应答之间的时间间隔
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 保存zookeeper数据,日志的路径
dataDir=/home/hadoop/data/zookeeper
# the port at which the clients will connect
# 客户端与zookeeper相互交互的端口
clientPort=2181
server.1= dn1:2888:3888
server.2= dn2:2888:3888
server.3= dn3:2888:3888
#server.A=B:C:D#其中A是一个数字,代表这是第几号服务器;B是服务器的IP地址;#C表示服务器与群集中的“领导者”交换信息的端口;当领导者失效后,D表示用来执行选举时服务器相互通信的端口。

  接下来,在配置的dataDir目录下创建一个myid文件,里面写入一个0-255之间的一个随意数字,每个zk上这个文件的数字要是不一样的,这些数字应该是从1开始,依次写每个服务器。文件中序号要与dn节点下的zk配置序号一直,如:server.1=dn1:2888:3888,那么dn1节点下的myid配置文件应该写上1。

2.7.2启动

  分别在各个dn节点启动zk进程,命令如下:

bin/zkServer.sh start

  然后,在各个节点输入jps命令,会出现如下进程:

QuorumPeerMain

2.7.3验证

  上面说的输入jps命令,若显示对应的进程,即表示启动成功,同样我们也可以输入zk的状态命令查看,命令如下:

bin/zkServer.sh status

  会出现一个leader和两个follower。

2.8HDFS+HA的结构图

  HDFS配置HA的结构图如下所示:

Linux:配置高可用的Hadoop平台
Linux:配置高可用的Hadoop平台

  上图大致架构包括:

  1. 利用共享存储来在两个NN间同步edits信息。以前的HDFS是share nothing but NN,现在NN又share storage,这样其实是转移了单点故障的位置,但中高端的存储设备内部都有各种RAID以及冗余硬件,包括电源以及网卡等,比服务器的可靠性还是略有 提高。通过NN内部每次元数据变动后的flush操作,加上NFS的close-to-open,数据的一致性得到了保证。

  2. DN同时向两个NN汇报块信息。这是让Standby NN保持集群的最新状态的必须步骤。

  3. 用于监视和控制NN进程的FailoverController进程。显然,我们不能在NN进程内部进行心跳等信息同步,最简单的原因,一次FullGC 就可以让NN挂起十几分钟,所以,必须要有一个独立的短小精悍的watchdog来专门负责监控。这也是一个松耦合的设计,便于扩展或更改,目前版本里是 用ZooKeeper(简称ZK)来做同步锁,但用户可以方便的把这个Zookeeper FailoverController(简称ZKFC)替换为其他的HA方案或leader选举方案。

  4. 隔离(Fencing),防止脑裂,就是保证在任何时候只有一个主NN,包括三个方面:

    共享存储fencing,确保只有一个NN可以写入edits。

    客户端fencing,确保只有一个NN可以响应客户端的请求。

    DN fencing,确保只有一个NN向DN下发命令,譬如删除块,复制块等等。

2.9角色分配

名称

Host

职责

NNA

10.211.55.12

zkfc

NNS

10.211.55.13

zkfc

DN1

10.211.55.14

zookeeper

DN2

10.211.55.15

zookeeper

DN3

10.211.55.16

zookeeper

2.10环境变量配置

  这里列出了所有的配置,后面配置其他组件,可以参考这里的配置。 配置完成后,输入:. /etc/profile(或source /etc/profile)使之立即生效。严重是否环境变量配置成功与否,输入:echo $HADOOP_HOME,若输出对应的配置路径,即可认定配置成功。

  注:hadoop2.x以后的版本conf文件夹改为etc文件夹了

  配置内容如下所示:

export JAVA_HOME=/usr/java/jdk1.7
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0
export ZK_HOME=/home/hadoop/zookeeper-3.4.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOM

来源:http://www.cnblogs.com/smartloli/p/4298430.html

Linux:3种方法来创建轻量、持久化的Xubuntu Linux USB系统盘

使用Universal USB Install创建持久化USB Xubuntu系统盘

这个教程为你介绍如何使用Xubuntu Linux创建一个轻量并且持久化的Linux USB系统盘。

译者注:持久化Linux USB系统盘(Persistent Linux USB drive),安装在优盘的Linux系统,允许用户保存数据到优盘而不是仅仅将这些修改留在内存中。这些数据可以在重启后恢复并且重新使用,甚至是在其他的机器上面启动也没有关系。一般情况下,持久化系统盘会安装一个压缩过的Linux操作系统。

为什么要这样做呢,这里有5个很好的理由:

  1. 你想要在你的电脑上安装一个轻量并且功能完善的Linux版本。
  2. 你的电脑没有硬盘,那么一个Linux USB系统盘就可以让这台电脑摆脱被扔到垃圾堆的命运。
  3. 你想体验一下Linux,但是你却不想花太多的时间去准备。
  4. 你想创建一个USB系统恢复盘,并且在优盘上安装一些特定的应用程序。
  5. 你想要一个可定制的Linux版本,能装在后兜或者挂在钥匙圈上。

现在,我们有了充足的理由,那么开始做一些准备工作吧。

如果你使用的是Windows:

  1. 下载Xubuntu。
  2. 下载Universal USB Installer。
  3. 插入一个空的优盘。
  4. 使用Universal USB Installer创建一个常驻系统启动盘。

如果你使用的是Ubuntu:

  1. 下载Xubuntu。
  2. 使用Ubuntu Startup Creator。

如果你使用的是其他版本的Linux:

  1. 下载Xubuntu。
  2. 使用UNetbootin。

还有一些场景,可能需要使用命令行,会更难一些,但是上面列的三种应该已经可以满足大部分的情况。

下载Xubuntu和Universal USB Installer

访问Xubuntu网站,然后选一个你喜欢的版本下载。

目前有两个版本可供使用:

14.04版是一个长期维护的版本,维护周期会持续3年。14.10是最新版本,但是只提供9个月的维护。

你选择了下载站点以后,会提示你选择32位版本或者64位版本。如果你的电脑是32位,就选32位版本,同样,如果你的电脑是64位,那就选64位版本。

点击这里,有一个教程来教你辨别你的电脑是32位还是64位

可以从Pendrive Linux网站下载Universal USB Installer,点击download链接,过一会下载页面就会弹出来了。

使用Universal USB Installer创建一个Xubuntu启动优盘

下载完Universal USB Installer和Xubuntu以后,运行Universal USB Installer,出现安全警告时,点击“Accept”。

Universal USB Installer用来创建一个持久化的Xubuntu启动优盘。

第一屏是许可协议。点击“I Agree”继续。

Universal USB Installer主界面出现以后,从下拉列表中选择你想要的配置(i.e Xubuntu),第二步,点击“Browse”选择你下载的ISO文件的路径。

在电脑上插入一个空的优盘,然后选中“Showing all drives”复选框。

在下拉列表中选中你的优盘(一定要确定选的是正确的盘符哦)。如果优盘不是空的,选中格式化复选框。

注:格式化优盘会清除优盘上的所有数据,首先一定要确认是否以及备份过相关的数据。

在第四步中选择用于保存“持久化”系统数据的存储空间大小。

点击“Create”按钮继续。

最后一个界面提示你如果点击“Yes”,那么将会直接应用你的配置。

这是停止安装的最后一个机会,一定要确定你选了正确的优盘盘符,并且优盘上没有需要备份的其他文件。

点击“Yes”,然后耐心等待优盘创建完成。

注:创建持久化保存空间会花费一些时间,并且这时候进度条不会继续滚动。

这个过程完成以后,重启电脑,如果从优盘启动,就会加载Xubuntu。

使用Ubuntu的Startup Disk Creator创建Xubuntu启动优盘

如果你已经安装了Ubuntu,那么创建持久化USB Xubuntu系统盘的最简单的办法就是使用Startup Disk Creator。

按下超级键(Windows键),打开Dash,搜索“Startup Disk Creator”,图标出现以后点击它。

如果你对Ubuntu Dash不太熟悉,你可以点击这里,查看一个完整的教程

Startup Disk Creator使用起来很简单。

界面被划分成两个部分。上部分指定下载的系统盘路径,下部分指定安装的优盘。

首先,点击“Other”按钮,第二步,选择你所下载的Xubuntu ISO文件。

然后插入优盘,点击“Erase”按钮清除优盘数据。

注:点击“Erase”会删除优盘中所有的数据,记得先备份数据。

选中“Stored in reserved extra sapce”单选按钮,然后拖动“How much”来确定你想要用来存储“持久化”数据的空间。

点击“Make Startup Disk”。

你创建的过程中,你可能需要输入几次你的系统密码,USB系统盘创建完成以后,你就可以使用它启动到Xubuntu了。

使用UNetbootin创建持久化的Xubuntu系统盘

我要介绍的最后一个工具是UNetbootin,这个工具在Windows和Linux上都可以使用。

个人来说,在Windows系统上面我喜欢用Universal USB Installer,但Linux的话,UNetbootin更合适一些。

注:UNetbootin并不是100%完美的,不是所有的Linux发行版都支持。

Windows平台可以点击这里下载UNetbootin。

Linux平台可以使用package manager安装UNetbootin。

确认你的优盘已经连接到电脑上,确认优盘已经格式化,并且在优盘上没有其他的数据。

在Windows平台上运行UNetbootin只需要双击可执行程序即可,在Linux运行的话则需要提升权限。

在Linux上如何运行取决于你使用的是何种桌面环境以及Linux发行版。从命令行运行的话,输入下列命令:

sudo unetbootin

UNetbootin的界面分为两个部分。你可以在上半部分选择一个Linux发行版,然后下载它,如果已经下载了某个发行版,可以在下半部分选择已经下载的系统盘。

点击“Diskimage”单选框,然后点击三个点的按钮。找到已经下载的Xubuntu ISO文件。路径会显示到按钮旁边的文本框里面。

设置“Space used to preserve files across reboots”的值,来指定你想要用来存储“持久化”数据的空间大小。

类型选择USB drive,然后选择优盘的盘符。

点击“OK”来创建一个持久化Xubuntu启动优盘。

创建的过程要花一些时间,创建完成以后,你就可以通过优盘启动到Xubuntu系统了。

如果你想要创建一个支持UEFI的Xubuntu启动优盘,照着这个教程来做,只需要把Ubuntu ISO替换为Xubuntu ISO就可以了。


 

via : http://linux.about.com/od/howtos/ss/How-To-Create-A-Persistent-Bootable-Xubuntu-Linux-USB-Drive.htm

作者:Gary Newell 译者:zhouj-sh 校对:Caroline

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

来源:https://linux.cn/article-4946-1.html

Linux:使用 tuned/tuned-adm 工具动态调优系统

RHEL/CentOS 在 6.3 版本以后引入了一套新的系统调优工具 tuned/tuned-adm,其中 tuned 是服务端程序,用来监控和收集系统各个组件的数据,并依据数据提供的信息动态调整系统设置,达到动态优化系统的目的;tuned-adm 是客户端程序,用来和 tuned 打交道,用命令行的方式管理和配置 tuned,tuned-adm 提供了一些预先配置的优化方案可供直接使用,比如:笔记本、虚拟机、存储服务器等。

如果你正在使用笔记本(电池电源),想优化系统、节约电源又不想知道太多这方面的细节,就可以用 tuned/tuned-adm 这套工具并应用 laptop-battery-powersave 方案来调整和优化系统。当然不同的系统和应用场景有不同的优化方案,tuned-adm 预先配置的优化策略不是总能满足要求,这时候就需要定制,tuned-adm 允许用户自己创建和定制新的调优方案。

Linux:使用 tuned/tuned-adm 工具动态调优系统
Linux:使用 tuned/tuned-adm 工具动态调优系统

(题图来自:dribbble.com)

系统的性能优化是个很大的话题,如果对这方面感兴趣可以参考 Linux 性能监测专题

安装和启动 tuned:

# yum update
# yum install tuned
# service tuned start
# chkconfig tuned on
# service ktune start
# chkconfig ktune on

查看当前优化方案:

# tuned-adm active
Current active profile: default
Service tuned: enabled, running
Service ktune: enabled, running

查看预先配置好的优化方案:

# tuned-adm list
Available profiles:
- laptop-battery-powersave
- virtual-guest
- desktop-powersave
- sap
- server-powersave
- virtual-host
- throughput-performance
- enterprise-storage
- laptop-ac-powersave
- latency-performance
- spindown-disk
- default
Current active profile: default

如果服务器是虚拟机母机的话,可以选用 virtual-host 方案优化。如果报错 “kernel.sched_migration_cost” is an unknown key 可以通过编辑 sysctl.ktune 这个文件解决。

# tuned-adm profile virtual-host
Reverting to saved sysctl settings:                        [  OK  ]
Calling '/etc/ktune.d/tunedadm.sh stop':                   [  OK  ]
Reverting to cfq elevator: sda sdb sdc sdd sde sdf sdg     [  OK  ]
Stopping tuned:                                            [  OK  ]
Switching to profile 'virtual-host'
Applying deadline elevator: sda sdb sdc sdd sde sdf sdg    [  OK  ]
Applying ktune sysctl settings:
/etc/ktune.d/tunedadm.conf:                                [FAILED]
  error: "kernel.sched_migration_cost" is an unknown key
Calling '/etc/ktune.d/tunedadm.sh start':                  [  OK  ]
Applying sysctl settings from /etc/sysctl.conf
Starting tuned:                                            [  OK  ]
# vi /etc/tune-profiles/virtual-host/sysctl.ktune
...
#kernel.sched_migration_cost = 5000000
...
# tuned-adm profile virtual-host

如果是企业存储服务器的话,可以用 enterprise-storage 方案:

# tuned-adm profile enterprise-storage
Stopping tuned:                                            [  OK  ]
Switching to profile 'enterprise-storage'
Applying deadline elevator: dm-0 sda sdb sdc sdd           [  OK  ]
Applying ktune sysctl settings:
/etc/ktune.d/tunedadm.conf:                                [  OK  ]
Calling '/etc/ktune.d/tunedadm.sh start':                  [  OK  ]
Applying sysctl settings from /etc/sysctl.conf
Starting tuned:                                            [  OK  ]

上面预定的方案不是总能满足要求,如果有自己的需求可以定制自己的方案。自己定制很容易,切换到优化方案的配置目录,拷贝一个例子,然后编辑里面的相关参数就可以了,使用 tuned-adm list 命令会看到刚创建的新方案 my-virtual-host:

# cd /etc/tune-profiles/
# cp -r virtual-host my-virtual-host
# vi my-virtual-host/*
# tuned-adm list
Available profiles:
- laptop-battery-powersave
- virtual-guest
- desktop-powersave
- sap
- server-powersave
- virtual-host
- throughput-performance
- enterprise-storage
- laptop-ac-powersave
- latency-performance
- spindown-disk
- default
- my-virtual-host
Current active profile: virtual-host

来源:http://www.vpsee.com/2014/08/tuning-your-system-with-redhat-tuned-tool/

Linux:如何避免在ELemetary OS Freya中出现两个Chrome图标

Linux:如何避免在ELemetary OS Freya中出现两个Chrome图标
Linux:如何避免在ELemetary OS Freya中出现两个Chrome图标

这篇文章会教你如何避免在ELemetary OS Freya中出现两个Google Chrome 图标

Chrome才是我在所有系统中使用的主浏览器。Modori 是默认放在dock中的浏览器,所以你每次使用Chrome时都需要在Slingshot中搜索Google Chrome,而为了节省时间,我通常会将它“保持在dock”中。

这里的问题是当你点击dock中的Chrome图标时,它会创建另外一个Google Chrome的实例。这就在dock中留下两个Chrome图标,这或许你可以不在意,但是很显然处女座不能忍!如果你有相同的感受,让我们看下如何移除这第二个Google Chrome图标。

在Elementary OS Freya的dock中删除第二个Google Chrome 图标

第一步:

从dock中删除Google Chrome。

第二步:

打开终端并使用下面的命令:

cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications

第三步:

接下来我们要编辑google-chrome.destop文件。使用下面的命令:

scratch-text-editor ~/.local/share/applications/google-chrome.desktop

这会用Scratch打开google-chrome.destop文件。在[Desktop Entry]段落下,加入下面的行:

StartupWMClass=Google-chrome-stable

看上去像这样:

Linux:如何避免在ELemetary OS Freya中出现两个Chrome图标
Linux:如何避免在ELemetary OS Freya中出现两个Chrome图标

第四步:

进入Slingshot并且再次打开Google Chrome。再次选择“keep in dock”。关闭并重新打开它来验证它是否在dock中打开了另外一个新的Chrome图标。这里不需要重启系统。

我希望这篇提示能够帮助你删除Elementary OS Freya中多出的Chrome图标。有任何问题或建议让我在评论区中知道。


via: http://itsfoss.com/rid-google-chrome-icons-dock-elementary-os-freya/

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

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

来源:https://linux.cn/article-4956-1.html

Linux:Linux有问必答:如何在curl中设置自定义的HTTP头

问题:我正尝试使用curl命令获取一个URL,但除此之外我还想在传出的HTTP请求中设置一些自定义的头部字段。我如何能够在curl中使用自定义的HTTP头呢?

curl是一个强大的命令行工具,它可以通过网络将信息传递给服务器或者从服务器获取数据。他支持很多的传输协议,尤其是HTTP/HTTPS以及其他诸如FTP/FTPS, RTSP, POP3/POP3S, SCP, IMAP/IMAPS协议等。当你使用curl向一个URL发送HTTP请求的时候,它会使用一个默认只包含必要的头部字段(如:User-Agent, Host, and Accept)的HTTP头。

Linux:Linux有问必答:如何在curl中设置自定义的HTTP头
Linux:Linux有问必答:如何在curl中设置自定义的HTTP头

在一些个例中,或许你想要在一个HTTP请求中覆盖掉默认的HTTP头或者添加一个新的自定义头部字段。例如,你或许想要重写“HOST”字段来测试一个负载均衡,或者通过重写”User-Agent”字符串来假冒特定浏览器以解决一些访问限制的问题。

为了解决所有这些问题,curl提供了一个简单的方法来完全控制传出HTTP请求的HTTP头。你需要的这个参数是“-H” 或者 “–header”。

为了定义多个HTTP头部字段,”-H”选项可以在curl命令中被多次指定。

例如:以下命令设置了3个HTTP头部字段。也就是说,重写了“HOST”字段,并且添加了两个字段(”Accept-Language” 和 “Cookie”)

$ curl -H 'Host: 157.166.226.25' -H 'Accept-Language: es' -H 'Cookie: ID=1234' http://cnn.com

对于”User-Agent”, “Cookie”, “Host”这类标准的HTTP头部字段,通常会有另外一种设置方法。curl命令提供了特定的选项来对这些头部字段进行设置:

  • -A (or –user-agent): 设置 “User-Agent” 字段.
  • -b (or –cookie): 设置 “Cookie” 字段.
  • -e (or –referer): 设置 “Referer” 字段.

例如,以下两个命令是等效的。这两个命令同样都对HTTP头的”User-Agent”字符串进行了更改。

$ curl -H "User-Agent: my browser" http://cnn.com
$ curl -A "my browser" http://cnn.com

wget是另外一个类似于curl,可以用来获取URL的命令行工具。并且wget也一样允许你使用一个自定义的HTTP头。点击这里查看wget命令的详细信息。


via: http://ask.xmodulo.com/custom-http-header-curl.html

译者:Ping 校对:wxy

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

来源:https://linux.cn/article-4957-1.html

Linux:如何在崩溃后重启Cinnamon

Cinnamon是一个提供了高级创新特性和传统用户体验的Linux桌面环境。桌面布局和Gnome 2相似。底层的技术与Gnome Shell相似。它的重点是让用户以熟悉的方式得到简单和舒适的桌面体验。

本篇中我们会展示一个快速的方法来重启Cinnamon而不用在崩溃后登出或者重启。

下图是Cinnamon桌面崩溃后,文本和图标从菜单和面板消失了。

Linux:如何在崩溃后重启Cinnamon
Linux:如何在崩溃后重启Cinnamon

要重启Cinnamon,按下Alt + F2 将会打开一个命令菜单,输入r并按下回车。

Linux:如何在崩溃后重启Cinnamon
Linux:如何在崩溃后重启Cinnamon

Cinnamon应该会重新在面板和菜单中显示图标和文本了。

Linux:如何在崩溃后重启Cinnamon
Linux:如何在崩溃后重启Cinnamon

试试吧!


via: http://www.unixmen.com/quick-tip-restart-cinnamon-crash/

作者:Enock Seth Nyamador 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4958-1.html

Linux:手把手教你安装Xubuntu Linux

简介

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

这个教程会一步步教你如何安装Xubuntu Linux。

为什么你会想要安装Xubuntu呢?这里有三个原因:

  1. 你有一台安装Windows XP的计算机,但是微软已经不再对Windows XP提供支持。
  2. 你的电脑运行很慢,你想要一个轻量级并且跟得上时代潮流的操作系统。
  3. 你想要自定义你的电脑使用体验。

首先,你需要下载Xubuntu,并且创建一个可启动的USB驱动器

完成以后,用优盘启动到当前版本的Xubuntu,然后点击安装Xubuntu图标。

选择你的安装语言

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

第一步,选择你的安装语言。

在左边的列表中选择语言,然后单击“Continue”。

选择无线网络链接

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

第二步,需要你来选择你的网络链接。这个步骤不是必须的,你在这个阶段可能会选择不设置网络链接是有原因的。

如果你的网络状况十分糟糕,不选无线网络是一个明智的选择,因为安装程序会在安装过程中从网络上下载一些更新包。那么可想而知,你的安装过程就会花费很长的时间。

当然,如果你的网速很快,选择一个无线网,然后输入密码就行了。

准备安装

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

这时候,你将会看到一个列表,显示安装Xubuntu的一些准备条件:

  • 是否拥有至少6.2G的磁盘空间
  • 是否链接到互联网
  • 是否连接了电源

只有磁盘空间是必要条件。

在上一个步骤中提到过,你可以在安装Xubuntu的过程中不安装更新包。在系统安装完成以后再安装更新包也是可以的。

安装过程中,如果电池电量耗完的话,你才必须要链接到到电源。

请注意,如果你连网了,这里有一个关闭安装过程中下载更新包的复选框。

这里还有一个复选框,提示你是否安装用于播放MP3或者Flash视频的第三方软件,当然,这些内容也可以在安装完成以后进行。

选择安装类型

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

接下来的步骤是选择安装类型。显示哪些选项,取决于之前电脑上安装了什么系统。

在我的示例中,我已经安装了Ubuntu MATE,所以,我的选项是重装Ubuntu、删除并且重装、安装Xubuntu和Ubuntu双系统,或者其它。

如果你的计算机上安装了Windows,那么你得到的选项就是,安装双系统,使用Xubuntu替换Windows或者其他。

这个教程只是用来说明如何在计算机上安装Xubuntu,而不是怎么安装双系统,那将是一个完全不同的教程。

选择使用Xubuntu替换当前系统,然后点击“Continue”。

备注:这会导致你的磁盘被完全清除,在继续安装之前,你应该备份你的数据。

选择安装磁盘

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

选择你要安装Xubuntu的磁盘。

点击“Install Now”。

这时候会弹出一个警告窗口,会提示你选择的磁盘驱动器会被完全清除,然后会显示一个新创建的分区列表。

备注:这是你改变主意的最后一个机会,如果你点击继续,磁盘就会被完全清除,然后开始安装Xubuntu。

点击“Continue”来安装Xubuntu。

选择地区

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

这个步骤中,你需要通过点击底图来选择你的地区。系统根据你的选择来设置时区,这样,你的时钟就可以显示正确的时间了。

选择以后点击“Continue”。

选择键盘布局

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

选择你的键盘布局。

在左边的列表中选择键盘语言,然后在右边的列表显示确切的键盘布局。

你也可以点击“Detect Keyboard Layout”让系统选择最适合的键盘布局。

如果你需要确认键盘布局是否正确,可以在“Type here to test your keyboard”输入字符。你需要特别注意fn键和一些符号,例如英镑和美元符号。

如果在安装过程中没有设置正确也没关系,安装完成以后在Xubuntu系统设置中也可以进行调整。

新增用户

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

为了使用Xubuntu,你至少需要设置一个用户,因此安装程序需要你设置一个默认用户。

在前两个输入框里面,输入你的名字以及用来识别你的计算机的名字。

为用户选择一个用户名并且创建一个密码。为了保证你的密码输入正确,你需要输入两遍。

如果你想要系统自动登入,而不是在每次启动的时候输入密码,选择“Log in automatically”。对于我来说,我肯定不会选择这个选项。

更好的选项是“Require my password to log in”,并且如果你想要更高的安全等级,勾选“Encrypt my home folder”选项。

点击“Continue”然后继续。

等待安装完成

Linux:手把手教你安装Xubuntu Linux
Linux:手把手教你安装Xubuntu Linux

这个步骤中,将会拷贝文件到你的电脑,并且安装Xubuntu。

在这个过程中,你会看到一个简短的幻灯片。在这个时候你可以去泡一杯咖啡或者放松一下。

安装完成以后,会弹出提示告诉你是否重新启动,并且开始体验一下新安装的Xubuntu系统。

准备好了么?拔掉启动盘重新启动吧。

备注:在UEFI机器上面安装Xubuntu的话,需要一些额外的步骤,在这个教程里面没有提到。关于这方面的内容,且听下回分解。

via : http://linux.about.com/od/howtos/ss/A-Step-By-Step-Guide-To-Installing-Xubuntu-Linux.htm#step-heading

作者:Gary Newell 译者:zhouj-sh 校对:Caroline

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

来源:https://linux.cn/article-4959-1.html

Linux:Btrfs文件系统在Linux中的创建及其特性

Btrfs(B-tree file system,B-tree文件系统)是针对Linux开发的一个新的CoW(copy-on-write,写时复制)文件系统。它最初是由甲骨文公司在2007年着手开始开发的,并在2014年8月正式发布其稳定版。开发Btrfs的目的在于解决Linux文件系统中缺少池、快照、校验和以及集成的跨多设备访问等问题,目标在于实现Linux的规模化存储。规模化不仅仅是指解决存储问题,也意味着通过简洁的界面提供对存储的管控和管理能力,让大家能看到已使用的内容并使它更可靠。

你应该注意到,Btrfs才刚刚发布稳定版,所以强烈推荐你使用最新版的内核以避免可能出现的问题和漏洞。

Linux:Btrfs文件系统在Linux中的创建及其特性
Linux:Btrfs文件系统在Linux中的创建及其特性

Btrfs特性

新文件系统的最重要的特性有:

  • 基于扩展的文件存储
  • 文件大小上限16EiB
  • 小文件和索引目录的高效空间利用
  • 动态索引节点分配
  • 支持快照可写和快照只读
  • 子卷(分离内部文件系统的根)
  • 支持数据和元数据的校验和
  • 压缩 (gzip和LZO)
  • 整合的多设备支持
  • 支持文件条块化、文件镜像和文件条块化+镜像三种部署方案
  • 高效的增量备份
  • 后台消除进程支持查找和修复冗余副本上的文件错误
  • 支持在线文件系统碎片整理和离线文件系统检查
  • Btrfs文件系统对RAID 5/RAID 6加强支持,在linux 3.19中添加了许多漏洞修补

你可以在此关于本主题的维基文章中阅读关于新特性的内容

转换到Btrfs

警告:在尝试转换文件系统前,请务必备份数据!虽然此操作很稳定,也很安全,但它仍然可能导致数据丢失,而防止此情况发生的唯一途径就是进行数据备份。

将现存的ext4文件系统转换到btrfs是相当简单而易懂的。你首先需要使用fsck来检查你现存分区上是否存在错误,然后使用btrfs-convert命令进行转换。如果你想要对/dev/sda3分区进行转换,你可以进行以下操作:

# fsck.ext4 /dev/sda4
# btrfs-convert /dev/sda4

然后,你就可以使用mount命令将它挂载到你想要的任何位置。

btrfs-convert

转换根分区

如果你想要对你系统上的根分区进行转换,你首先需要使用Live CD启动。对于Ubuntu,你可以使用Ubuntu安装盘来完成此操作,在启动后第一个屏幕选择“尝试Ubuntu”。对于其它系统,你同样可以使用Live CD镜像,操作类似。

在启动后,打开终端,使用下面的命令来转换文件系统。

# fsck.ext4 /dev/sda1
# btrfs-convert /dev/sda1

接下来,chroot到文件系统,这样你就可以修改fstab并重新安装grub了。

# mount /dev/sda1 /mnt
# for i in dev dev/pts proc sys ; do mount --bind /$i /mnt/$i ; done
# chroot /mnt
# blkid | grep sda1
Linux:Btrfs文件系统在Linux中的创建及其特性
Linux:Btrfs文件系统在Linux中的创建及其特性

现在来编辑fstab,并根据blkid输出的结果来修改当前“/”文件系统的UUID,并将它的文件系统类型修改为btrfs,修改后的行如下:

UUID=8e7e80aa-337e-4179-966d-d60128bd3714 / btrfs defaults 0 1

然后,重新安装Grub:

# grub-install /dev/sda
# update-grub

现在,你可以把启动光盘丢到一边了,重启机器后,你就可以使用新的文件系统了。


via: http://linoxide.com/file-system/create-btrfs-features/

作者:Adrian Dinu 译者:GOLinux 校对:wxy

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

来源:https://linux.cn/article-4960-1.html

Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号

怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号

通过 GitHub 将它们嵌入到网页和其他项目中。

Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号
Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号

Emoji, 来自日本的小巧符号,通过图像表达感情,已经征服了移动互联网的信息世界。

现在,你可以在虚拟世界中随处使用它们了。 Twitter 最近开源了他们的 emoji 符号库,使得你可以在你自己的网站,应用,和项目中使用它们。

但这需要一点体力活。 Unicode 已经识别甚至标准化了 emoji 字母表, 然而 emoji 仍然不能完全与所有的网络浏览器相兼容,这意味着大多数情况下,它们将呈现为 “豆腐块”或“空白盒子”。当 Twitter 想使得 emoji 到处可用时,这家社交网络联合了一家名为Icon Factory的公司来渲染浏览器以模仿文本信息符号的效果。Twiter 认为人们对他们的 emoji 库有很大的需求。

现在, 你可以从 GitHub 上克隆 Twitter 的整个库,从而在你的开发项目中使用它们。 下面将为你介绍如何达到上面的目的以及如何使得 emoji 更容易被使用。

为 Emoji 得到 Unicode 支持

Unicode 是国际编码标准,它为任意的符号、字母或人们想在网络上使用的数字配置了一串编码。换句话说,它是你如何在计算机上阅读文本与计算机如何读取文本之间的缺失环节。例如,对于你正看到的位于这些句子中的空格(LCTT 译注:英文分词中间的空格),计算机读取为 “&nbsp”。

Unicode 甚至拥有其自己的原始 emoji,它们可以在没有你的任何努力的情况下在浏览器中被阅读。例如,当你看到了 一个 ❤ 符号,你的计算机正在解码字符串 “2665” 。

要在大多数情况下使用 Twitter 的 emoji 库,你只需在你的 HTML 网页中的 块中添加如下脚本:


这样就使得你的项目可以访问包含有已经在 Twitter 中可使用的数以百计的 Emoji 符号的 JavaScript 库。然而,创建一个仅仅包含这个脚本的文档并不能使得在你的网站中呈现出 emoji 符号,实际上,你仍需要嵌入这些 emoji 符号!

在 块中,粘贴一些可以在 Twitter 的preview.html 文件源代码 中找到的 emoji 字符串。我使用了  和 &#x1F3C1,当然我并不知道在浏览器窗口中它们的样子。是的,你必须粘贴并猜测它们。你已经看出了问题,我们将在第二小节中予以解决。

无论如何,通过一些尝试,你可以将一个如下图的原始 HTML 文件—

Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号
Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号

—显示为如下图的网页:

Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号
Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号

将 Emoji 转换为可阅读的语言

对于一个网站或应用,Twitter 的解决方案是非常适用的。但如果你想通过 HTML 轻易地插入你喜爱的 emoji 符号,你需要一个更易实现的解决方案,而不是记住所有代表 emoji 的 Unicode 字符串。

那正是程序员 Elle Kasai 的 Twemoji Awesome 样式大展身手的地方。

通过向任意网页中添加 Elle 的开源样式表,你可以适用 英语单词来理解你正插入的 emoji 符号的意义。所以如若你想展示一个 心形 emoji 符号,你可以简单地输入:


为了实现上面的目的,让我们下载 Elle 的项目,通过点击在 GitHub 上 “Download ZIP” 按钮。

接着,我们在桌面上新建一个文件夹,然后进入该文件夹,并将 emoji.html—我先前向你展示的 HTML 源文件— 和 Elle 的 twemoji-awesome.css 一同放进去。

我们还需要 HTML 文件识别这个 CSS 文件,所以在 html 网页中的 块中,为 CSS 文件添加一个链接:


一旦你将上面的代码添加了进去,你便可以删除先前添加的 Twitter 的脚本链接。

现在,找到 body 块部分的代码,然后添加一些 emoji 符号。我使用了 , ,

最终,你将得到如下的代码:

Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号
Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号

保存并在浏览器中查看上面的文件:

Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号
Linux:怎样通过 Twitter 的开源库来随处使用 Emoji 表情符号

Duang!这样你不仅得到了一个可以在浏览器中支持 emoji 符号的基本网页,而且还知道了如何简单地实现它。你可以随意的在我的 GitHub 中查看这个教程,并且可以克隆这些实际的文件而不只是看看这些截图。

题图来自于得到 Emoji; Lauren Orsini 截图。


via: http://readwrite.com/2014/11/12/how-to-use-emoji-in-the-browser-window

作者:Lauren Orsini 译者:FSSlc 校对:wxy

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

来源:https://linux.cn/article-4961-1.html

Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器

Xen 是一个直接运行在硬件上的虚拟机监视器,这意味着你必须准备一个裸机来安装和运行 Xen。而 KVM 则和 Xen 有一些不同 —— 你可以把它添加到任何已经正在运行 Linux 的机器上。本教程描述了如何在废旧的硬件上安装和配置 Xen 虚拟机监视器。

整个安装过程使用 Debian Jessie(Debian 的测试发行版)作为宿主机操作系统(也称作 Dom0)。Jessie 并不是唯一的选择 —— Xen 的支持是内建在 Linux 内核中的,许多 Linux 发行版 都包含支持 Xen 的内核。

Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器
Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器

找点废旧的硬件

首先,找一个可以格式化的合适的工作站,比如一台旧的笔记本或者台式机。旧的硬件可能不适合玩游戏,但是足够安装一个宿主机和一些客户机了。一个满足下面这些要求的 PC 机就可以了。

  • 一个双核 CPU(64 位)
  • 4GB 内存
  • 80GB 硬盘
  • 能够从 CD,DVD 或者 USB 引导启动
  • 一块网卡

注意 CPU 必须是 64 位的,因为 Debian 已经不再支持 32 位的 Xen 安装包。如果你没有空余的硬件,你可以花点钱买一台旧机器。2010 年值 $1000 的旗舰级笔记本现在只需要 $100。从 eBay 买台二手笔记本并升级下内存也可以满足需求。

刻录一个引导 CD/USB

下载 Debian Jessie 的 ISO 镜像。从 Debian 官网 下载网络安装镜像就可以了。

$ wget http://cdimage.debian.org/cdimage/jessie_di_beta_2/amd64/iso-cd/debian-jessie-DI-b2-amd64-netinst.iso

接下来,记下你的 CD/DVD 或者 USB设备 所识别的设备名 (例如 /dev/sdc)。

使用 dd 命令将 ISO 镜像刻录至 CD 或者 USB 中。将下面的 /dev/sdc 替换为你上面识别出的设备名。

$ sudo dd if=debian-jessie-DI-b2-amd64-netinst.iso of=/dev/sdc

开始安装

安装前,使用刻录的 CD/USB 启动 Debian 的安装界面。

最好是使用有线网络,而不是 WIFI。如果因为固件或者驱动的原因导致 WIFI 不能连接,你将无法完成下面的步骤。

Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器
Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器

硬盘分区

这里的设置使用了四个分区。自动安装时通常会创建一个包含逻辑分区的扩展分区。像下面这样给硬盘分四个区。

  • sda1 挂载至 /boot,200MB
  • sda2 做为 /, 20GB, Ubuntu 占用 4GB
  • sda3 做为 swap, 6GB (4GB x 1.5 = 6)
  • sda4 保留用作 LVM, 不挂载,大小为剩余的硬盘大小

安装基本的系统

这里尽可能的让系统的安装更简单快速一些。一个基本的工作用系统可以稍后再添加。Debian 的 APT(Advanced Package Tool)使得添加软件非常的简单。在机器上安装 Debian 可能会有一些很浪费时间的问题。可能显卡驱动与内核不监控或者可能老旧的 CD-ROM 驱动器只能间歇性的工作。

当选择安装软件时,选择安装一个 SSH 服务器,不要安装桌面环境如 Gnome。

Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器
Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器

安装一个图形桌面需要安装成百上千的包 —— 这些额外的工作可以稍后再进行。如果你遇到问题了,等待图形桌面的安装会浪费很多时间。同时,没有桌面组件,系统的启动可以更快一些 —— 只需要几十秒而不是几分钟。整个安装过程会需要重启几次,因此这样做可以节省不少时间。

一个 SSH 服务器可以让你从另一台电脑来配置这台工作站。这可以避免一些旧硬件的问题 —— 可能旧机器的键盘少了几个键,LCD 屏幕有坏点或者触摸板没有反应等等。

添加 LVM (Logical Volume Manager)

以 root 身份安装 LVM 工具。

# apt-get update
# apt-get install lvm2

选择一个分区创建物理卷。

# pvcreate /dev/sda4

创建卷组。

# vgcreate vg0 /dev/sda4

你并不需要创建逻辑卷。如果你想测试 LVM 是否正常,可以创建一个逻辑卷然后删掉它。

# lvcreate -nmytempvol -L10G vg0
# lvremove /dev/vg0/mytempvol

检查 LVM 状态。

# pvs (查看物理卷的信息)
# vgs (查看卷组的信息)
# lvs (查看逻辑卷的信息)

添加一个 Linux 网桥

这里我们要添加一个桥接网卡,这样 Xen 客户机就可以通过网桥连接网络。

安装桥接的工具。

# apt-get install bridge-utils

查看在哪块网卡配置桥接。

# ip addr
Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器
Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器

在这个例子中,我们有一块网卡名称为 eth0。我们准备修改配置文件(/etc/network/interfaces)将 eth0 作为桥接设备。

在进行更改之前,备份网络配置文件以保证原来的工作配置是安全的。

# cd /etc/network/
# cp interfaces interfaces.backup
# vi /etc/network/interfaces

文件的内容类似下面这样。

auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp

修改成这样。

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto xenbr0
iface xenbr0 inet dhcp
bridge_ports eth0

激活网卡配置的修改:

# systemctl restart networking

验证网络设置

验证桥接设备 xenbr0 创建成功。

# ip addr show xenbr0

同时检查 eth0 被成功加入网桥。

# brctl show

你现在安装好了 Jessie 系统。不过此时 Xen 还没有安装。下面我们开始安装 Xen。

安装 Xen 虚拟机监视器

安装 Xen 和 QEMU 包,并升级 GRUB 引导程序。

# apt-get install xen-linux-system

重启。

当 GRUB 界面出现时,你可以看到列出的额外的启动选项。

Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器
Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器

第一个选项会在 5 秒钟内自动启动(在 /etc/default/grub 的 GRUB_TIMEOUT 这行设置),因此这点时间可来不及喝咖啡。

按下方向键选择 “Debian GNU/Linux, with Xen hypervisor” 这个选项,然后按回车。这时屏幕会出现很多行信息,接着是正常的登录界面。

检查 Xen 工作是否正常

Xen 虚拟机监视器带有一个管理 Xen 的命令行程序叫做 xl,可以用来创建和管理 Xen 虚拟机。使用 xl 命令来检查 Xen 是否成功安装了。

以 root 用户登录,执行:

# xl info

将会显示很多关于 Xen 主机的信息。

Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器
Linux:怎样在废旧的硬件上安装 Xen 虚拟机监视器

查看已有 Xen 虚拟机的列表:

# xl list

这里显示了一个主机的列表。因为没有创建任何的 Xen 客户机,唯一的条目是 Domain-0,即你安装的 Debian 系统。

修改启动顺序

当你到这一步之后,Xen 的安装已经完成了。这里还有一件事需要修改 —— 默认的启动选项不会加载 Xen。GRUB 选择启动菜单的第一个选项 (Debian GNU/Linux),而不是第三个(Debian GNU/Linux, with Xen hypervisor)。

启动菜单的默认选项是在 grub 配置文件 /boot/grub/grub.cfg 中定义的。修改选项时,不要直接修改这个文件,而是编辑 /etc/default/grub 这个文件。有一个叫做 grub-mkconfig 的工具可以读取这个配置文件和 /etc/grub.d/ 中的所有莫爸妈,并写入到 grub.cfg 文件中。

编辑 Debian 的 grub-mkconfig 的配置文件

# vi /etc/default/grub

修改这一行:

GRUB_DEFAULT=0

改为

GRUB_DEFAULT='Debian GNU/Linux, with Xen hypervisor'

然后更新 grub 的配置文件。

# grub-mkconfig -o /boot/grub/grub.cfg

最后重启。几秒钟后,grub 启动菜单出现了。检查看第三个选项 “Debian GNU/Linux, with Xen hypervisor” 是否是自动选中的选项。

最后

如果你使用这台主机作为你的工作站,可以安装一个图形桌面。Debian 包括好几种桌面环境。如果你想要一个包含所有东西的图形桌面,那么安装 Gnome 吧。如果它的图形效果并不是你的菜,试试 Awesome 吧。

注意 Debian 的默认 Gnome 环境有大量的额外应用程序包括办公套件 LibreOffice,Iceweasel 浏览器和 Rhythmbox 音乐播放器。安装命令 “apt-get install gnome” 会安装 1,000 多个包并需要将近 2GB 的硬盘空间。运行这个重量级的桌面环境需要占用 1GB 的内存。

(LCTT 译注:本文没有涉及如何安装 guest 虚拟机,请关注后继文章)


via: http://xmodulo.com/install-xen-hypervisor.html

作者:Nick Hardiman 译者:Liao 校对:wxy

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

来源:https://linux.cn/article-4962-1.html

Linux:使用Golang快速构建WEB应用

我们从来都不开发代码,我们只是代码的搬运工。— 阿飞

希望大家都变卡卡西。 — 啊贱

大家copy愉快,文档只做参考。如果发现问题或者有好的建议请回复我我回及时更正。

Linux:使用Golang快速构建WEB应用
Linux:使用Golang快速构建WEB应用

1.Abstract

在学习web开发的过程中会遇到很多困难,因此写了一篇类似综述类的文章。作为路线图从web开发要素的index出发来介绍golang开发的学习流程以及Example代码。

在描述中多是使用代码来描述使用方法不会做过多的说明。最后可以方便的copy代码来实现自己的需求。

本文适应对象:

  1. 对web开发有一定经验的人
  2. 能够灵活使用ajax的人(至少懂得前后分离)
  3. golang web 开发有一定了解,至少略读过一些golang web开发的书籍

看完本文之后您会收获:

  1. golang web开发的一些技巧
  2. golang web开发的一些实用API

本文在描述的时候为了解释尽量详细,已经把解释写到代码注释中。

2.golang web 开发check list

略过的部分:基本流程控制,OOP等基础语法知识。

3.路由器

路由器是整个网站对外的灵魂,如果路由做的不好URL会非常恶心。所以这部分设计成第一个要说的内容。

路由分两种一种是手动路由为了通过tul调度固定的功能,另外一点就是资源的获取,通过url的分析来模仿静态页的方式来获取资源(类似get)

自动路由,主要使用OOP的COMMAND模式来实现。所有功能使用post,统一入口,方便权限管理,安全管理,跨域管理。但是如此强大的功能还是交给框架来做吧。这里就不给新手做参考了。

3.1手动路由

package main
import (
  "log"
  "net/http"
  )
  func main() {
    RouterBinding() // 路由绑定函数
    err := http.ListenAndServe(":9090", nil) //设置监听的端口
    if err != nil {
      log.Fatal("ListenAndServe: ", err)
    }
  }

在httpserver运行之前先绑定路由

3.2 手动路由的绑定

3.2.1 静态文件

http.Handle("/pages/", http.StripPrefix("/pages/", http.FileServer(http.Dir("./pages"))))

3.2.2 固定函数与资源获取

他们都是一样的

http.HandleFunc("/images/", fileUpload.DownloadPictureAction)

4.页面加载

4.1 纯静态页(HTML)

直接交给路由就行了。自动就访问那个文件夹了。不过生产环境果然还得是cdn,如果自己服务器比较多。可以nginx反向代理。

主要好处前后分离,能上CDN就是通讯次数多了。不过通过优化改善之类的都还ok啦。

4.2 模板页面的加载

commonPage, err := template.ParseFiles("pages/common/head.gtpl", //加载模板
"pages/common/navbar.gtpl", "pages/common/tail.gtpl")
if err != nil {
  panic(err.Error())
}
navArgs := map[string]string{"Home": "home", "User": "yupengfei"}//复杂的参数开始往里塞
knowledgePage, err := template.ParseFiles("pages/knowledge/knowledge.gtpl")
knowledgeArgs := map[string]interface{}{"Head": "This is a test title",
"Author": "kun.wang", "PublishDatetime": "2014-09-14",
"Content": template.HTML("

为什么要用语义呢?

")}//不是不好,只是做字符串分析会影响工程效率 commonPage.ExecuteTemplate(w, "header", nil)// render 开始 commonPage.ExecuteTemplate(w, "navbar", navArgs) knowledgePage.ExecuteTemplate(w, "knowledge", knowledgeArgs) commonPage.ExecuteTemplate(w, "tail", nil)

仅提供关键代码。

  • 其他的都还挺好,就是页面渲染用服务器是不是有点太奢侈了。
  • 字符串数组作为输入参数差错比较困难
  • 总结:虽然减少的通讯次数,但是没办法上CDN蛋疼,另外,模板的mapping蛋疼。

5.表示层脚本

表示层脚本做的比较困难也不是很好学。但是一旦搞定了,代码的复用性会有非常可观的提升。

就普通情况而言JS开发效率是非常高的灵活度高,并且使用的是客户端的cpu性能好,免费资源多,学习的人也多,好招聘。

5.1 require.js

5.1.1 加载

整个网页之留这么一个加载脚本的入口(每个页面最好只有一个js文件)

好处

  • js是延迟加载。不会出现网页卡死的情况
  • 最大化使用缓存。(HTTP 304)
  • 一个网页只用一个js
  • dom事件绑定,不用在html控件上写js绑定了

坏处

  • 学习比较难
  • 网站更新始终有缓存没更新的浏览器。造成错误(所以有些情况客户自己就知道多刷新几次了,已经成用户习惯了)

参数解释

  • `data-main` 业务逻辑入口,载入当前字符串.js这个文件
  • `language` 不解释
  • `defer async` 字面意思
  • `src` r.js就是require.js的意思。代码到处都能搞到。

5.1.2 页面Business

加载依赖文件

require.baseUrl = "/"
require.config({
  baseUrl: require.baseUrl,
  paths: {
    "jquery": "js/jquery-1.10.2.min",
    "domready" : "reqmod/domReady",
    "pm" : "reqmod/pmodal",
    "cookie":"reqmod/cookie",
    "user":"reqmod/user",
    "bootstrap": "reqmod/bootstrap.min",
    "nav":"reqmod/nav"
  },
  shim: {
    'bootstrap': {
      deps: ['jquery']
    }
  }
});
//直接copy全搞定。

执行页面business

执行里面做的最多的就是dom跟事件绑定而已。加载各种js库直接引用。

代码美观,开发效率,执行效率都是非常棒的。

require(['nav','domready', 'jquery', 'user','pm'], function (nav,doc, $, user,pm){
  //这个函数的第一个`数组`参数是选择的依赖的模块。1. 网站绝对路径。 2. 使用加载依赖模块的时候选择export的内容
  //数组的顺序要跟function顺序一致,如果有两个模块依赖比如说jquery插件,就写道最后不用变量,直接使用`$`
  doc(function () { // domReady
    pm.load();//加载各种插件HTML模板之类的都ok
    $('#btn_login')[0].onclick = function(){user.login();}//button 事件绑定
  });
});

页面MODEL

define(['jquery','reqmod/cookie','user','bootstrap'],function ($,cookie,user){
    //define 函数的参数内容require是一样的。
    // 这里依赖的模块要在调用此模块中的模块中有path配置。不然会死的很惨,报错的时候不会说缺少什么什么地方错了。
  var nav_load = function () { // 注意函数定义的方式copy就行
    $.get('/nav.html', function(result){
      var newNode = document.createElement("div");
      newNode.innerHTML = result;
      $('body')[0].insertBefore(newNode,$('body')[0].firstChild);
      //document.body.innerHTML = result + document.body.innerHTML;
      $('#btn_login')[0].onclick = function(){user.login();}
      $('#btn_reg')[0].onclick = function(){window.location='/register.html'}
      $.post('/login_check',{},function(data){
        if(data==0){
          Form_login.style.display=""
        }
        else{
          form_userInfo.style.display=""
        }
      })
    });
  }
  return {//这里类似微型路由。非常灵活,非常方便
    load :nav_load
  };
});

5.2 JQuery

JQ的功能只要require.js引用了之后基本上都是一样的。

如果有需要可以到w3school上学习一下。

6.业务层

Post分析

func XXXAction(w http.ResponseWriter, r *http.Request) {
  r.parseForm() //有这个才能获取参数
  r.Form["Email"] // 获取Email 参数(String)
  // 写接下来的业务。
}

资源入口函数资源require分析(url分析固定写法)

func Foo(w http.ResponseWriter, r *http.Request) {
  queryFile := strings.Split(r.URL.Path, "/")
  queryResource := queryFile[len(queryFile)-1] // 解析文件
}
//完成字符串分割之后,按照需求来获取资源就可以了。

直接输入object

data, err := ioutil.ReadAll(r.Body) //直接读取form为 json 字符串
	if err != nil {
		utility.SimpleFeedBack(w, 10, "failed to read body")
		pillarsLog.PillarsLogger.Print("failed to read body")
		return
	}
	k := 【BUSINESS OBJECT】
	err = json.Unmarshal(data, &k)
	if err != nil {
		utility.SimpleFeedBack(w, 13, "Pramaters failed!")
		pillarsLog.PillarsLogger.Print("Pramaters failed!")
		return
	}
//方便快捷。再访问参数的时候,直接调用结构体参数就可以了。
//注意ajax调用函数的时候需要做出一些调整代码如下:
$.ajax([dist],JSON.stringify([data]),function(){},'json');//注意JSON

7.持久层

7.1 Mysql

其实不管什么语言的Mysql驱动都是从PRO*C来的,所以会PRO*C之后,啥都好说

Insert/Delete/Update

stmt, err := mysqlUtility.DBConn.Prepare("INSERT INTO credit (credit_code, user_code, credit_rank) VALUES (?, ?, ?)")
if err != nil {
  pillarsLog.PillarsLogger.Print(err.Error())
  return false, err
}
defer stmt.Close()
_, err = stmt.Exec(credit.CreditCode, credit.UserCode, credit.CreditRank)
if err 	!= nil {
  return false, err
  } else {
    return true, err
  }
  //还是比较方便的

Query

stmt, err := mysqlUtility.DBConn.Prepare(`SELECT commodity_code, commodity_name, description, picture,
  price, storage, count, status,
  insert_datetime, update_datetime FROM commodity WHERE commodity_code = ?`)
  if err != nil {
    return nil, err
  }
  defer stmt.Close()
  result, err := stmt.Query(commodityCode)
  if err != nil {
    return nil, err
  }
  defer result.Close()
  var commodity utility.Commodity
  if result.Next() {
    err = result.Scan(&(commodity.CommodityCode), &(commodity.CommodityName), &(commodity.Description),
    &(commodity.Picture), &(commodity.Price), &(commodity.Storage), &(commodity.Count), &(commodity.Status),
    &(commodity.InsertDatetime), &(commodity.UpdateDatetime))
    if err != nil {
      pillarsLog.PillarsLogger.Print(err.Error())
      return nil, err
    }
  }
  return &commodity, err

7.2 Mongodb

err := 	mongoUtility.PictureCollection.Find(bson.M{"picturecode":*pictureCode}).One(&picture)

这里只给出最简单的例子。具体的看mgo的开发文档就ok。还是比较简单的。

8.单元测试注意事项

  • 测试命令 go test -v (没有其他参数了!!!) 如果不带-v只显示结果,不显示调试过程,主要是调试开发的时候用
  • 文件格式 xxx_test.go 但是建议改成 xxx_test0.go 或者喜欢改成别的也可以。
    • 由于测试先行的原则,在开发的时候一次测试也就一两个函数。
    • 这样相当于把其他测试注释掉
  • 测试的时候的配置文件要放到测试目录下面。别忘了。
  • 心态,错误太多一个一个来,要有个好心态。

9.LOG

注意在调试中Log的不可缺失性。

下面api如果不知道从何而来直接doc搜索就可以了。

package utility
import "log"
import "os"
import "fmt"
// Logger Model min variable.
var Logger *log.Logger
var outFile *os.File
// init function if Logger if not inited will invoke this function
func init() {
  if Logger == nil {
    propertyMap := ReadProperty("pic.properties")
    logFileName := propertyMap["LogFile"]
    fmt.Println("Initial and Open log file ", logFileName)
    var err error
    outFile, err = os.OpenFile(logFileName, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
    if err != nil {
      panic(err.Error())
    }
    Logger = log.New(outFile, "", log.Ldate|log.Ltime|log.Llongfile)
  }
}
// CloseLogFile function : close Logger invoke file.
func CloseLogFile() {
  outFile.Close()
}

使用方法:

utility.Logger.Println("Log test")

总结

  1. 看完这里copy代码日常工作还是能好应付一点。
  2. 如果是新手看完这个之后,看那么厚的书就有一定的目标性了。能方便一点

AUTH:PHILO VERSION 2

来源:http://www.philo.top/1899/11/30/GolangWebManual/

Linux:使用iSCSI Target创建集中式安全存储(一)

iSCSI 是一种块级别的协议,用于通过TCP/IP网络共享原始存储设备,可以用已经存在的IP和以太网如网卡、交换机、路由器等通过iSCSI协议共享和访问存储。iSCSI target是一种由远程iSCSI服务器(target)提供的远程硬盘。

Linux:使用iSCSI Target创建集中式安全存储(一)
Linux:使用iSCSI Target创建集中式安全存储(一)

在Linux中安装iSCSI Target

我们不需要占用很大的资源就可以为客户端提供稳定的连接和性能。iSCSI服务器称为“Target(目标器)”,它提供服务器上的存储共享。iSCSI客户端称为“Initiator(发起程序)”,它访问目标器共享的存储。市场中有卖的用于大型存储服务如SAN的iSCSI适配器。

我们为什么要在大型存储领域中使用iSCSI适配器

以太网适配器(NIC)被设计用于在系统、服务器和存储设备如NAS间传输分组数据,它不适合在Internet中传输块级数据。

iSCSI Target的功能

  • 可以在一台机器上运行几个iSCSI 目标器
  • 一台机器可以提供多个iSCSI 目标器用于iSCSI SAN访问
  • 一个目标器就是一块存储,并且可以通过网络被发起程序(客户端)访问
  • 把这些存储汇聚在一起让它们在网络中可以访问的是iSCSI LUN(逻辑单元号)
  • iSCSI支持在同一个会话中使用多个连接
  • iSCSI发起程序在网络中发现目标接着用LUN验证并登录,这样就可以本地访问远程存储。
  • 我们可以在本地挂载的LUN上安装任何操作系统,就像我们安装我们本地的操作系统一样。

为什么需要iSCSI?

在虚拟化中,我们需要存储拥有高度的冗余性、稳定性,iSCSI以低成本的方式提供了这些特性。与使用光纤通道的SAN比起来,我们可以使用已经存在的设备比如NIC、以太网交换机等建造一个低成本的SAN。

现在我开始使用iSCSI 目标器安装并配置安全存储。本篇中,我们遵循下面的步骤:

  • 我们需要隔离一个系统来设置iSCSI 目标器和发起程序(客户端)。
  • 在大型存储环境中可以添加多个硬盘,但是这里我们除了基本的安装盘之外只使用了一个额外的驱动器。
  • 这里我们只使用了2块硬盘,一个用于基本的服务器安装,另外一个用于存储(LUN),这个我们会在这个系列的第二篇描述。

主服务器设置

  • 操作系统 – CentOS 6.5 (Final)
  • iSCSI 目标器 IP – 192.168.0.200
  • 使用的端口 : TCP 860, 3260
  • 配置文件 : /etc/tgt/targets.conf

安装 iSCSI Target

打开终端并使用yum命令来搜索需要在iscsi 目标器上安装的包名。

# yum search iscsi

输出示例

========================== N/S matched: iscsi =======================
iscsi-initiator-utils.x86_64 : iSCSI daemon and utility programs
iscsi-initiator-utils-devel.x86_64 : Development files for iscsi-initiator-utils
lsscsi.x86_64 : List SCSI devices (or hosts) and associated information
scsi-target-utils.x86_64 : The SCSI target daemon and utility programs

你会的到上面的那些结果,选择Target包来安装。

# yum install scsi-target-utils -y
Linux:使用iSCSI Target创建集中式安全存储(一)
Linux:使用iSCSI Target创建集中式安全存储(一)

安装iSCSI工具

列出安装的包里面的内容来了解默认的配置、服务和man页面的位置。

# rpm -ql scsi-target-utils.x86_64
Linux:使用iSCSI Target创建集中式安全存储(一)
Linux:使用iSCSI Target创建集中式安全存储(一)

列出所有的iSCSI包里面的文件

让我们启动iSCSI服务,并检查服务运行的状态,iSCSI的服务名是tgtd

# /etc/init.d/tgtd start
# /etc/init.d/tgtd status

Start iSCSI Service

启动iSCSI服务

现在我们需要配置开机自动启动。

# chkconfig tgtd on

现在验证tgtd服务的运行级别是否配置正确。

# chkconfig --list tgtd
Linux:使用iSCSI Target创建集中式安全存储(一)
Linux:使用iSCSI Target创建集中式安全存储(一)

开机启动iSCSI

现在使用tgtadm来列出在我们的服务器上已经配置了哪些target和LUN。

# tgtadm --mode target --op show

tgtd已经安装并在运行了,但是上面的命令没有输出因为我们还没有在Target服务器上定义LUN。要查看手册,可以运行‘man‘命令。

# man tgtadm
Linux:使用iSCSI Target创建集中式安全存储(一)
Linux:使用iSCSI Target创建集中式安全存储(一)

iSCSI Man 页面

如果你的目标器上有iptable的话,那么我们需要为iSCSI添加iptable规则。首先使用netstat命令找出iscsi target的端口号,目标器总是监听TCP端口3260。

# netstat -tulnp | grep tgtd

Find iSCSI Port

找出iSCSI端口

下面加入如下规则让iptable允许广播iSCSI 目标器发现包。

# iptables -A INPUT -i eth0 -p tcp --dport 860 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --dport 3260 -m state --state NEW,ESTABLISHED -j ACCEPT

Open iSCSI Ports

打开iSCSI端口

Linux:使用iSCSI Target创建集中式安全存储(一)
Linux:使用iSCSI Target创建集中式安全存储(一)

添加iSCSI端口到iptable中

注意: 规则可能根据你的默认链策略而不同。接着保存iptable并重启该服务。

# iptables-save
# /etc/init.d/iptables restart
Linux:使用iSCSI Target创建集中式安全存储(一)
Linux:使用iSCSI Target创建集中式安全存储(一)

重启iptable

现在我们已经部署了一个目标器来共享LUN给通过TCP/IP认证的发起程序。这也适用于从小到大规模的生产环境。

在我的下篇文章中,我会展示如何在目标器中使用LVM创建LUN,并且如何在客户端中共享LUN,不要忘记留下有价值的评论。


via: http://www.tecmint.com/create-centralized-secure-storage-using-iscsi-targetin-linux/

作者:Babin Lonston 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4971-1.html

Linux:如何在终端使用后台运行模式启动一个Linux应用程序

Linux:如何在终端使用后台运行模式启动一个Linux应用程序
Linux:如何在终端使用后台运行模式启动一个Linux应用程序

这是一个篇幅不长但是十分有用的教程,可以帮助你在终端启动一个Linux应用程序,并且使终端窗口不会丢失焦点。

我们有很多可以在Linux系统中打开一个终端窗口的方法,这取决于你的选择以及你的桌面环境。

如果是使用Ubuntu的话,你可以利用CTRL+ALT+T组合键打开终端。当然你也可以使用超级键(Windows键)打开Dash,搜索“TERM”,然后点击“Term”图标来打开终端窗口。

对于其他的桌面环境来说,例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜单中找到终端。有些环境会在停靠栏或者面板上面包含终端图标。

通常情况下,你可以在终端里面直接输入应用程序名来启动一个应用程序。比如说,你可以通过输入“firefox”来启动Firefox。

在终端启动应用程序的好处是,你可以包含一些额外的参数。

例如,你可以通过下列命令来打开一个Firefox浏览窗口,然后利用默认的搜索引擎搜索相关信息:

firefox -search "linux.cn"

你可能会注意到,如果你启动Firefox,程序打开以后,回到了终端窗口控制,这就意味着你可以继续在终端进行工作。

通常情况下,如果你在终端启动了应用程序,控制会切换到新启动的应用程序,只有程序被关闭以后才会重新切换到终端控制。这是因为你在前台启动了这个程序。

如果要在Linux终端打开应用程序并且返回终端控制,那么你需要将应用程序启动为后台进程。

和下面所列的命令一样,我们可以通过增加一个(&)符号,将应用程序在后台启动。

libreoffice &

译者注:如果需要加参数的话,记得把&符号放在最后。

译者注:一般情况下,关闭终端时,在这个终端启动的后台程序也会被终止,要使终端关闭以后,后台程序依然保持执行可以使用下列命令

nohup command [arg…] &

如果应用程序目录没有安装在PATH变量包含的目录里面的话,我们就没有办法直接通过应用程序名来启动程序,必须输入应用程序的整个路径来启动它。

/path/to/yourprogram &

如果你不确定程序输入哪个Linux目录结构的话,可以使用find或者location命令来定位它。

可以输入下列符号来找到一个文件:

find /path/to/start/from -name programname

例如,你可以输入下列命令来找到Firefox:

find / -name firefox

命令运行的结果会嗖的一下输出一大堆,别担心,你也可以通过less或者more来进行分页查看。

find / -name firefox | more
find / -name firefox | less

当find命令查找到没有权限访问的文件夹时,会报出一条拒绝访问错误,

你可以通过sudo命令来提示权限。当然,如果你没有安装sudo的话,就只能切换到一个拥有权限的用户了。

sudo find / -name firefox | more

如果你知道你要查找的文件在你的当前目录结构中,那么你可以使用点来代替斜杠:

sudo find . -name firefox | more

你可能需要sudo来提升权限,也可能根本就不需要,如果这个文件在你的主目录里面,那么就不需要使用sudo。

有些应用程序则必须要提升权限才能运行,否则你就会得到一大堆拒绝访问错误,除非你使用一个具有权限的用户或者使用sudo提升权限。

这里有个小窍门。如果你运行了一个程序,但是它需要提升权限来操作,输入下面命令试试:

sudo !!

 

via : http://linux.about.com/od/commands/fl/How-To-Run-Linux-Programs-From-The-Terminal-In-Background-Mode.htm

作者:Gary Newell 译者:zhouj-sh 校对:Caroline

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

来源:https://linux.cn/article-4974-1.html

Linux:Xfce 4.12 新特性概览

Xfce 4.12 经过漫长的等待终于发布了,这里向您介绍一下 Xfce 4.12的主要新特性,这里只介绍了外在的一些改进,完整的改进列表请参见  changelogs 。

窗口管理器 (xfwm4)

窗口切换器对话框

窗口管理器的 Alt + Tab 对话框全面更换主题,还增加了两个模式 列表模式窗口预览模式此外用户可以使用鼠标点击选择要切换窗口

tabwin-simple-crop

传统的对话框现已更换全新主题

tabwin-list-crop

列表模式会显示全部窗口的标题

Linux:Xfce 4.12 新特性概览
Linux:Xfce 4.12 新特性概览

缩略图模式

窗口预览模式会以窗口内容的缩略图及其图标显示。这种模式需要先激活 compositor。

拼接、缩放和客户端装饰

对客户端装饰 (CSDs) 的支持进行了改进。现在可以正确的对齐桌面和面板的边框,窗口的完美拼接,甚至包括了阴影。

Linux:Xfce 4.12 新特性概览
Linux:Xfce 4.12 新特性概览

Gtk3 应用及其装饰由客户端进行绘制

Linux:Xfce 4.12 新特性概览
Linux:Xfce 4.12 新特性概览

将窗口拖放到角落以拼接它

改进了窗口拼接模式,支持角落拼接。可以使用 Alt + 鼠标滚轮来缩放窗口。

HiDPI 支持

为了更好的支持高分屏,增加了两个新的主题(hdpi, xhdpi)。

面板 (xfce4-panel)

智能隐藏

当窗口拖放到面板附近时,面板会智能隐藏。

panel-shown

厄?这窗口是干嘛的?!

panel-shown-stack

别离我这么近!

panel-hidden

哈!这下你看不见我了吧!

Gtk3 插件

增加了 Gtk3 插件的支持。

桌面管理器 (xfdesktop)

新的壁纸设置对话框有许多新选项,对多显示器支持更好。要修改哪个显示器或工作空间的墙纸,只需要将壁纸设置对话框拖到那里即可。

Linux:Xfce 4.12 新特性概览
Linux:Xfce 4.12 新特性概览

更好的多显示器支持

在设置对话框里面(xfce4-settings)不勾选“应用到全部工作空间”就可以为每个工作空间设置不同的墙纸。

设置 (xfce4-settings)

显示设置

在显示设置对话框里面对多显示器的支持大为改进。当连接了一个新的显示器时,就会弹出一个快速设置对话框来设置一些常用模式。

Linux:Xfce 4.12 新特性概览
Linux:Xfce 4.12 新特性概览

配置多显示器

Linux:Xfce 4.12 新特性概览
Linux:Xfce 4.12 新特性概览

选择新显示器的使用方式

外观设置

外观设置对话框现在展示了风格和图标的预览。

Linux:Xfce 4.12 新特性概览
Linux:Xfce 4.12 新特性概览

Gtk 风格预览

Linux:Xfce 4.12 新特性概览
Linux:Xfce 4.12 新特性概览

图标主题预览

来源:https://linux.cn/article-4977-1.html

Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

LUN是逻辑单元号,它与iSCSI存储服务器共享。iSCSI 目标器通过TCP/IP网络共享它的物理驱动器给发起程序(initiator)。这些来自一个大型存储(SAN:Storage Area Network)的驱动器集合称作LUN。在真实环境中LUN是在LVM中定义的,因为它可以按需扩展。

Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

在目标器中使用 LVM 创建 LUN

为什么使用LUN?

LUN用于存储,SAN存储大多数由LUN的集群来组成存储池,LUN由目标器的几块物理驱动器组成。我们可以使用LUN作为系统物理驱动器来安装操作系统,LUN可以用在集群、虚拟服务器、SAN中。在虚拟服务器中使用LUN的主要用途是作为操作系统的存储。LUN的性能和可靠性根据在创建目标存储服务器时所使用的驱动器决定。

前置阅读

要了解创建iSCSI 目标器,点击下面的链接。

主服务器设置

系统信息和网络设置部分与前文的iSCSI 目标器相同 – 我们在相同的服务器上定义LUN。

  • 操作系统 – CentOS 6.5 (Final)
  • iSCSI 目标器 IP – 192.168.0.200
  • 使用的端口 : TCP 860, 3260
  • 配置文件 : /etc/tgt/targets.conf

在iSCSI 目标器使用LVM创建LUN

首先,用fdisk -l命令找出驱动器的列表,这会列出系统中所有分区的列表。

# fdisk -l

上面的命令只会给出基本系统的驱动器信息。为了得到存储设备的信息,使用下面的命令来得到存储设备的列表。

# fdisk -l /dev/vda && fdisk -l /dev/sda
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

列出存储设备

注意:这里vda是虚拟机硬盘,因为我使用的是虚拟机来用于演示,/dev/sda 是额外加入的存储。

第一步: 创建用于LUN的LVM驱动器

我们使用/dev/sda驱动器来创建LVM。

# fdisk -l /dev/sda
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

列出LVM驱动器

现在让我们使用如下fdisk命令列出驱动器分区。

# fdisk -cu /dev/sda
  • 选项 ‘-c’ 关闭DOS兼容模式。
  • 选项 ‘-u’ 用于列出分区表时给出扇区而不是柱面的大小。

使用n创建新的分区。

Command (m for help): n

使用p创建主分区。

Command action
   e   extended
   p   primary partition (1-4)

给我们创建的分区一个分区号。

Partition number (1-4): 1

到这里,我们就要设置LVM驱动器了。因此,我们需要使用默认的设置来使用整个驱动器。

First sector (2048-37748735, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-37748735, default 37748735):
Using default value 37748735

选择分区的类型,这里我们要设置LVM,因此使用8e。使用l列出所有的类型。

Command (m for help): t

选择想要改变类型的分区。

Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

在改变完类型之后,通过打印(p)选项来列出分区表。

Command (m for help): p
Disk /dev/sda: 19.3 GB, 19327352832 bytes
255 heads, 63 sectors/track, 2349 cylinders, total 37748736 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9fae99c8
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    37748735    18873344   8e  Linux LVM

使用w写入设置并退出fdisk工具,重启系统使设置生效。

作为参考,我下面附上了截图来给你在创建LVM驱动器时一个明确的指导。

Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

创建LVM分区

系统重启后,使用fdisk命令列出分区表。

# fdisk -l /dev/sda
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

验证LVM分区

第二步: 为LUN创建逻辑卷

现在我们使用‘pvcreate’命令创建物理卷。

# pvcreate /dev/sda1

用iSCSI的名字创建卷组来区分这个卷组。

# vgcreate vg_iscsi /dev/sda1

这里我定义了4个逻辑卷,因此在我的iSCSI target上就会有4个LUN。

# lvcreate -L 4G -n lv_iscsi vg_iscsi
# lvcreate -L 4G -n lv_iscsi-1 vg_iscsi
# lvcreate -L 4G -n lv_iscsi-2 vg_iscsi
# lvcreate -L 4G -n lv_iscsi-3 vg_iscsi

列出物理卷、卷组和逻辑卷确定。

# pvs && vgs && lvs
# lvs

为了更好地理解上面的命令,我在下面包含了截图作为参考。

Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

创建LVM逻辑卷

Verify LVM Logical Volumes

验证LVM逻辑卷

第三步: 在目标器中定义LUN

我们已经创建了逻辑卷并准备使用LUN,现在我们在目标器配置中定义LUN,只有这样做它才能用在客户机中(发起程序)。

用你选择的编辑器打开位于‘/etc/tgt/targets.conf’的目标器配置文件。

# vim /etc/tgt/targets.conf

追加下面的target配置文件中的定义。保存并关闭文件。


       backing-store /dev/vg_iscsi/lv_iscsi


       backing-store /dev/vg_iscsi/lv_iscsi-1


       backing-store /dev/vg_iscsi/lv_iscsi-2


       backing-store /dev/vg_iscsi/lv_iscsi-3

Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

在target中配置LUN

上图的解释:

  1. iSCSI 采取限定名 (iqn.2014-07.com.tecmint:tgt1).
  2. 名称随便你
  3. 用于确定目标名, 这是这台服务器中的第一个目标
  4. LVM共享特定的LUN。

接下来使用下面的命令重载tgd服务配置。

# /etc/init.d/tgtd reload

Reload Configuration

重载配置

接下来使用下面的命令验证可用的LUN。

# tgtadm --mode target --op show
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

列出可用LUN

Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)
Linux:在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

LUN信息

上面的命令会列出可用LUN的下面这些信息

  1. iSCSI 限定名
  2. iSCSI 已经准备好
  3. 默认LUN 0被控制器所保留
  4. LUN 1是我们定义的目标器
  5. 这里我为每个LUN都定义了4GB
  6. 在线: 是的,这就是可以使用的LUN

现在我们已经使用LVM为目标器定义了LUN,这可扩展并且支持很多特性,如快照。我们将会在第三部分了解如何用目标器授权,并且本地挂载远程存储。


via: http://www.tecmint.com/create-luns-using-lvm-in-iscsi-target/

作者:Babin Lonston 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4972-1.html

Linux:学习和使用 PHP 应该注意的10件事

1 多阅读手册和源代码

没什么比阅读手册更值得强调的事了–仅仅通过阅读手册你就可以学习到很多东西,特别是很多有关于字符串和数组的函数。就在这些函数里面包括许多有用的功能,如果你仔细阅读手册,你会经常发现在以往的项目开发过程中,很多时候你在“重复发明轮子”,而实际上你只需要一个核心函数就可以完成相应的功能。手册是你的朋友。另外,现在有很多使用PHP开发的开源程序。为什么不去学习和借鉴呢?下载一份开源的PHP应用程序的源代码,仔细阅读它吧。也许越大的项目越值得去阅读,虽然它们也许有更复杂的结构和系统,但也有更详细的解释文档。

2 编写模块化代码 

良好的PHP代码应该是模块化的代码。PHP的面向对象的编程功能是一些特别强大的工具,可以把你的应用程序分解成函数或方法。你应该尽可能多的从你的应用程序的服务器端分开前端的HTML/CSS/JavaScript代码,你也可以在任何PHP框架上遵循MVC(模型-视图-控制器)模式。  

3 代码编写规范

良好的PHP代码应该有一套完整的代码编写规范。通过对变量和函数的命名,统一的方法访问数据库和对错误的处理,以及同样的代码缩进方式等来达到编程规范,这样可以使你的代码更具可读性。  

4 编写可移植代码

良好的PHP代码应该是可移植的。你可以使用php的现有功能,如魔术引号和短标签。试着了解你的需求,然后通过适应PHP特性来编写代码让代码独立、可移植。  

5 编写安全代码

良 好的PHP代码应该是安全的。PHP5提供了出色的性能和灵活性。但是安全问题完全在于开发人员。对于一个专业的PHP开发人员来说,深入理解重大安全漏 洞是至关重要的,如:跨站点脚本(XSS)、跨站请求伪造(CSRF)、代码注入漏洞、字符编码漏洞。通过使用PHP的特殊功能和函数, 如:mysql_real_escape_string等等,你可以编写出安全的代码。  

Linux:学习和使用 PHP 应该注意的10件事
Linux:学习和使用 PHP 应该注意的10件事

(题图来自:acneeinstein.com)

6 代码注释

代码注释是代码的重要组成部分。通过代码注释可以知道该变量或函数是做什么的,这将在今后的代码维护中十分有用。  

7 使用单引号代替双引号

字符串始终使用单引号代替双引号,以避免PHP搜索字符串内的变量导致的性能下降。 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会 。

8 转义字符串输出

使用ENT_QUOTES作参数传递给htmlspecialchars函数,以确保单引号(‘)也转换成HTML实体,这是一个好习惯。  

9 使用逗号分隔字符串输出

通过echo语句输出使用逗号(,)分隔的字符串,要比使用字符串连接操作符(.)的性能更好。  

10 输出前检查传来的值

输出前检查传过来的值$_GET[‘query’]。使用isset或empty函数,可以用来检查变量是否为null值。

来源:http://www.php100.com/html/dujia/2015/0204/8555.html

Linux:如何使 GDebi 默认代替 Ubuntu 软件中心

Linux:如何使 GDebi 默认代替 Ubuntu 软件中心
Linux:如何使 GDebi 默认代替 Ubuntu 软件中心

如果你使用 Ubuntu 或基于 Ubuntu 的 Linux 发行版本,比如Elementary OS Freya,也许你使用 Ubuntu 软件中心来安装.deb 可执行文件。对于查找和安装应用,Ubuntu 软件中心是一个很好的应用,但它会消耗很多资源且运行速度缓慢。这就是为什么我更偏爱使用 一个 Ubuntu 软件中心的轻量级替代品—App Grid 的原因。

现在,假如你只是尝试安装一个 .deb 文件,我不会向你推荐 Ubuntu 软件中心或 App Grid ,我的建议为 GDebi,一个安装 Debian 可执行文件的专用程序。它极其轻量,且专注于安装 .deb 文件。GDebi 最有用的功能是它也可以为你展示出将要安装的程序的依赖。

在这篇文章中,我们将看一看 如何安装 GDebi 以及使用它代替 Ubuntu 软件中心作为默认的安装器

在 Ubuntu 和其他 Linux 发行版本中安装 GDebi

打开终端并使用下面的命令:

sudo apt-get install gdebi

使得 GDebi 成为默认的 .deb包安装器

一旦你安装了 GDebi,就是时候来看看如何使它成为安装 .deb 文件的默认应用了。请读者注意在这篇教程中我使用的是 Elementary OS Freya ,但下面的步骤对于所有基于 Ubuntu 的发行版本都是适用的。可能截屏显示会有点不同。

首先下载一个 .deb文件。例如你已经下载了一个 Google Chrome 的 .deb包。进入下载目录并右击该 .deb文件。在这里,接着选择 属性选项。

Linux:如何使 GDebi 默认代替 Ubuntu 软件中心
Linux:如何使 GDebi 默认代替 Ubuntu 软件中心

在属性中,你应该可以看到 打开方式 选项。点击它并选择为 GDebi。

Linux:如何使 GDebi 默认代替 Ubuntu 软件中心
Linux:如何使 GDebi 默认代替 Ubuntu 软件中心

这样下次你双击一个 .deb 文件,便会自动打开 GDebi 来安装这个.deb 文件。使用这样轻量级的应用的确是一个加速 Ubuntu 或其他 Linux 系统的好方法。

你怎么看呢?对于安装应用,你仍然偏爱 Ubuntu 软件中心还是 GDebi 呢?如果你是一个守旧派,也许你更喜欢 新立得软件包管理器(Synaptic Package Manager)?那么,哪一个是你的最爱?


via: http://itsfoss.com/gdebi-default-ubuntu-software-center/

作者:Abhishek 译者:FSSlc 校对:Caroline

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

来源:https://linux.cn/article-4982-1.html

Linux:十个提升生产力的 bash 技巧

我喜欢钻研bash环境。很多时候,在使用bash编程中,有些问题一遍又一遍的重复遇到。每次我都需要重新思考这些问题的解决方法。直到有一天我无法忍受,于是坐下来,编写一个通用的函数,放入我的.bashrc文件中,部署到电脑上。

希望我的这些追求最大化命令行效率的努力成果也能给其他喜欢使用bash的朋友们带来一些帮助。我更大的期望是我的这种行为能引起其他朋友的互动——给我提建议、提出更好的bash技巧。

别的不多说了,下面就是我的总结。

Linux:十个提升生产力的 bash 技巧
Linux:十个提升生产力的 bash 技巧

(题图来自:understandquran.com)

技巧一、用命令行往文件的顶部添加文字

每次我都会重新寻找这个命令的写法。下面就是如何使用sed往一个文件顶部添加一行的方法:

sed -i '1s/^/line to insertn/' path/to/file/you/want/to/change.txt

技巧二、用命令行往配置文件里插入多行文本

这种方法非常简单,很多人都知道,下面就是如何用命令行将(>>)多行文本插入一个文件中。这里使用的是“here document”语法,它能让你通过块文本符号来将段落插入文件中,通常用的符合是EOF(意思是 “End Of File”):

cat >> path/to/file/to/append-to.txt << "EOF"
export PATH=$HOME/jdk1.8.0_31/bin:$PATH
export JAVA_HOME=$HOME/jdk1.8.0_31/
EOF

两个”EOF“之间的所有内容都会被添加到文件中。

技巧三、用命令行递归方式全局搜索目录文件和替换

如果你使用Eclipse,ItelliJ或其它IDE,这些工具的强大重构能力也许会让你轻松实现很多事情。但我估计很多时候你的开发环境中没有这样的集成工具。

如何使用命令行对一个目录进行递归搜索和替换?别想Perl语言,你可以使用find and sed。感谢Stack Overflow提供的指导(注:原文的命令有误,根据“河南南阳”的网友意见修改。):

# OSX version
find . -type f -name '*.txt' -exec sed -i 's/this/that/g' {} +

使用了一段时间后,我总结写出了一个函数,添加入了 .bashrc ,就像下面这样:

function sr {
    find . -type f -exec sed -i "s/$1/$2/g" {} +
}

你可以像这样使用它:

sr wrong_word correct_word

技巧四、用命令行在vim和Dropbox里开启一个临时文件

我过去喜欢用Emacs里的scratch facility功能。也经常用Vim快速创建临时文件。下面这两个函数是使用openssl生成随机的字符串作为文件名:

function sc {
  gvim ~/Dropbox/$(openssl rand -base64 10 | tr -dc 'a-zA-Z').txt
}
function scratch {
  gvim ~/Dropbox/$(openssl rand -base64 10 | tr -dc 'a-zA-Z').txt
}

在命令行窗口输入sc或scratch,一个新的gvim或macvim窗口就会弹出来,里面会加载一个随机文件名的临时文件。

技巧五、用命令行下载文件,支持链接转向、HTTPS和安全加密等情况

下载一个页面输出到终端,跟随链接转向,忽略安全异常:

curl -Lks 

下载一个链接,跟随链接转向,忽略安全异常:

curl -OLks 

这里用了很多参数,你可以阅读这个简单的curl文档来了解它们。

技巧六、Bashmarks

你还没有在.bashrc里使用bashmarks吗?还在等待什么?它真的非常有用。它能帮你保持历史操作,跳回到你经常使用的目录。下面是我的配置文件里脚本,但我想上面的链接能提供你更多技巧:

# USAGE:
# s bookmarkname - saves the curr dir as bookmarkname
# g bookmarkname - jumps to the that bookmark
# g b[TAB] - tab completion is available
# l - list all bookmarks
# save current directory to bookmarks
touch ~/.sdirs
function s {
  cat ~/.sdirs | grep -v "export DIR_$1=" > ~/.sdirs1
  mv ~/.sdirs1 ~/.sdirs
  echo "export DIR_$1=$PWD" >> ~/.sdirs
}
# jump to bookmark
function g {
  source ~/.sdirs
  cd $(eval $(echo echo $(echo $DIR_$1)))
}
# list bookmarks with dirnam
function l {
  source ~/.sdirs
  env | grep "^DIR_" | cut -c5- | grep "^.*="
}
# list bookmarks without dirname
function _l {
  source ~/.sdirs
  env | grep "^DIR_" | cut -c5- | grep "^.*=" | cut -f1 -d "="
}
# completion command for g
function _gcomp {
    local curw
    COMPREPLY=()
    curw=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=($(compgen -W '`_l`' -- $curw))
    return 0
}
# bind completion command for g to _gcomp
complete -F _gcomp g

技巧七、从格式化输出里提取一列(我最常使用的awk技巧)

我几乎天天都会使用它。真的。经常会有一些输出,我只需要其中的第二列,或第三列,下面这个命令就能做到这些:

#Sample output of git status -s command:
$ git status -s
M .bashrc
?? .vim/bundle/extempore/
# Remove status code from git status and just get the file names
$ git status -s | awk '{print $2}'
.bashrc
.vim/bundle/extempore/

为什么不写个函数,让我们随时都可以用呢?

function col {
  awk -v col=$1 '{print $col}'
}

这使得提取列非常容易,比如,你不想要第一列?简单:

$ git status -s | col 2
.bashrc
.vim/bundle/extempore/

技巧八、忽略头x个词

我对xargs很着迷,我感觉它就像一把快刀。但有时候用它获得的结果需要调整一下,也许需要取得一些值。例如,你想去掉下面文件影像里的一些信息:

function skip {
    n=$(($1 + 1))
    cut -d' ' -f$n-
}

下面是如何使用它:

  • 使用 docker images 得到下面的输出:
$ docker images
REPOSITORY                   TAG         IMAGE ID            CREATED             VIRTUAL SIZE
                             65a9e3ef7171        3 weeks ago         1.592 GB
                             7c01ca6c30f2        3 weeks ago         11.1 MB
                             9518620e6a0e        3 weeks ago         7.426 MB
                             430707ee7fe8        3 weeks ago         7.426 MB
boot2docker/boot2docker      latest      1dbd7ebffe31        3 weeks ago         1.592 GB
spaceghost/tinycore-x86_64   5.4         f47686df00df        7 weeks ago         11.1 MB
durdn/bithub                 latest      df1e39df8dbf        8 weeks ago         100.9 MB
                             c5e6cf38d985        8 weeks ago         100.9 MB
nginx                        latest      e426f6ef897e        12 weeks ago        100.2 MB
zoobab/tinycore-x64          latest      8cdd417ec611        8 months ago        7.426 MB
scratch                      latest      511136ea3c5a        20 months ago       0 B
  • 使用上面的函数,你可以获取所有的IDs:
$ docker images | col 3
IMAGE
65a9e3ef7171
7c01ca6c30f2
9518620e6a0e
430707ee7fe8
1dbd7ebffe31
f47686df00df
df1e39df8dbf
c5e6cf38d985
e426f6ef897e
8cdd417ec611
511136ea3c5a
  • 进一步处理:
docker images | col 3 | xargs
IMAGE 65a9e3ef7171 7c01ca6c30f2 9518620e6a0e 430707ee7fe8 1dbd7ebffe31 f47686df00df df1e39df8dbf c5e6cf38d985 e426f6ef897e 8cdd417ec611 511136ea3c5a
  • 但前面的”IMAGE”字符我也想去掉:
docker images | col 3 | xargs | skip 1
65a9e3ef7171 7c01ca6c30f2 9518620e6a0e 430707ee7fe8 1dbd7ebffe31 f47686df00df df1e39df8dbf c5e6cf38d985 e426f6ef897e 8cdd417ec611 511136ea3c5a
  • 完整的写下来就是这样:
docker rmi $(docker images | col 3 | xargs | skip 1)

技巧九、创建自己的命令包

在bash里,你可以很容易的创建自己的命令组件,你可以看一下下面我写的:

function dur {
  case $1 in
  clone|cl)
    git clone git@bitbucket.org:nicolapaolucci/$2.git
    ;;
  move|mv)
    git remote add bitbucket git@bitbucket.org:nicolapaolucci/$(basename $(pwd)).git
    git push --all bitbucket
    ;;
  trackall|tr)
    #track all remote branches of a project
    for remote in $(git branch -r | grep -v master ); do git checkout --track $remote ; done
    ;;
  key|k)
    #track all remote branches of a project
    ssh $2 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
    ;;
  fun|f)
    #list all custom bash functions defined
    typeset -F | col 3 | grep -v _ | xargs | fold -sw 60
    ;;
  def|d)
    #show definition of function $1
    typeset -f $2
    ;;
  help|h|*)
    echo "[dur]dn shell automation tools"
    echo "commands available:"
    echo " [cl]one, [mv|move]"
    echo " [f]fun lists all bash functions defined in .bashrc"
    echo " [def]  lists definition of function defined in .bashrc"
    echo " [k]ey  copies ssh key to target host"
    echo " [tr]ackall], [h]elp"
    ;;
  esac
}

通过上面的脚本,我可以将ssh key拷贝到任何网站服务器——只需要键入 dur key user@somehost.

总结

你可以试一下我的这个.bashrc文件,或你自己也可以写一个。你有更好更多的技巧吗?请写在下面的评论里。

来源:http://www.techug.com/ten-tips-for-wonderful-bash-productivity

Linux:设置iSCSI的发起程序(客户端)(三)

iSCSI 发起程序是一种用于同 iSCSI 目标器认证并访问服务器上共享的LUN的客户端。我们可以在本地挂载的硬盘上部署任何操作系统,只需要安装一个包来与目标器验证。

Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

初始器客户端设置

功能

  • 可以处理本地挂载磁盘上的任意文件系统
  • 在使用fdisk命令分区后不需要重启系统

前置阅读

我的客户端设置

  • 操作系统 – CentOS 6.5 (Final)
  • iSCSI 目标器 IP – 192.168.0.50
  • 使用的端口 : TCP 3260

警告:永远不要在LUN还挂载在客户端(发起程序)时停止服务。

客户端设置

1. 在客户端,我们需要安装包‘iSCSI-initiator-utils’,用下面的命令搜索包。

# yum search iscsi

示例输出

============================= N/S Matched: iscsi ================================
iscsi-initiator-utils.x86_64 : iSCSI daemon and utility programs
iscsi-initiator-utils-devel.x86_64 : Development files for iscsi-initiator-utils

2. 找到了包,就用下面的yum命令安装初始化包。

# yum install iscsi-initiator-utils.x86_64

3. 安装完毕后,我们需要发现目标器上的共享。客户端的命令有点难记,因此我们使用man找到需要运行的命令列表。

# man iscsiadm
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

man iscsiadm

4. 按下SHIFT+G 进入man页的底部并且稍微向上滚动找到示例的登录命令。下面的发现命令中,需要用我们的服务器IP地址来替换。

# iscsiadm --mode discoverydb --type sendtargets --portal 192.168.0.200 --discover

5. 这里我们从下面的命令输出中找到了iSCSI的限定名(iqn)。

192.168.0.200:3260,1 iqn.2014-07.com.tecmint:tgt1

Discover Target

发现服务器

6. 要登录就用下面的命令来连接一台LUN到我们本地系统中,这会与服务器验证并允许我们登录LUN。

# iscsiadm --mode node --targetname iqn.2014-07.com.tecmint:tgt1 --portal 192.168.0.200:3260 --login
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

登录到服务器

注意:登出使用登录命令并在命令的最后使用logout来替换。

# iscsiadm --mode node --targetname iqn.2014-07.com.tecmint:tgt1 --portal 192.168.0.200:3260 --logout
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

登出服务器

7. 登录服务器后,使用下面的命令列出节点的记录行。

# iscsiadm --mode node

List Node

列出节点

8. 显示特定节点的所有数据

# iscsiadm --mode node --targetname iqn.2014-07.com.tecmint:tgt1 --portal 192.168.0.200:3260

示例输出

# BEGIN RECORD 6.2.0-873.10.el6
node.name = iqn.2014-07.com.tecmint:tgt1
node.tpgt = 1
node.startup = automatic
node.leading_login = No
iface.hwaddress = 
iface.ipaddress = 
iface.iscsi_ifacename = default
iface.net_ifacename = 
iface.transport_name = tcp
iface.initiatorname = 
iface.bootproto = 
iface.subnet_mask = 
iface.gateway = 
iface.ipv6_autocfg = 
iface.linklocal_autocfg = 
....

9. 接着列出使用的磁盘,fdisk会列出所有的登录认证过的磁盘。

# fdisk -l /dev/sda
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

列出磁盘

10. 运行fdisk命令来创建一个新的分区

# fdisk -cu /dev/sda
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

创建新分区

注意:在使用fdisk创建新分区之后,我们无需重启,就像使用我们本地的文件系统一样就行。因为这个将远程共享存储挂载到本地了。

11. 格式化新创建的分区

# mkfs.ext4 /dev/sda1
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

格式化新分区

12. 创建一个目录来挂载新创建的分区

# mkdir /mnt/iscsi_share
# mount /dev/sda1 /mnt/iscsi_share/
# ls -l /mnt/iscsi_share/
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

挂载新分区

13. 列出挂载点

# df -Th
  • -T – 输出文件系统类型
  • -h – 以易读的方式显示大小
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

列出新分区

14. 如果需要永久挂载,使用fdtab文件

# vim /etc/fstab

15.在fstab后追加下面行

/dev/sda1  /mnt/iscsi_share/   ext4    defaults,_netdev   0 0

注意: 在fdtab中使用_netdev,说明这是一个网络设备。

Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

自动挂载分区

16. 最后检查我们fstab文件是否有错误。

# mount -av
  • -a – 所有挂载点
  • -v – 冗余模式
Linux:设置iSCSI的发起程序(客户端)(三)
Linux:设置iSCSI的发起程序(客户端)(三)

验证fstab文件

我们已经成功完成了我们的客户端配置。现在让我们像本地磁盘一样使用它吧。


via: http://www.tecmint.com/iscsi-initiator-client-setup/

作者:Babin Lonston 译者:geekpi 校对:wxy

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

来源:https://linux.cn/article-4973-1.html

Linux:dupeGuru—直接从硬盘中查找并移除重复文件

简介

对我们来说,磁盘被装满是棘手问题之一。无论我们如何小心谨慎,我们总可能将相同的文件复制到多个不同的地方,或者在不知情的情况下,重复下载了同一个文件。因此,迟早你会看到“磁盘已满”的错误提示,若此时我们确实需要一些磁盘空间来存储重要数据,以上情形无疑是最糟糕的。假如你确信自己的系统中有重复文件,那么 dupeGuru 可能会帮助到你。

Linux:dupeGuru—直接从硬盘中查找并移除重复文件
Linux:dupeGuru—直接从硬盘中查找并移除重复文件

dupeGuru 团队也开发了名为 dupeGuru 音乐版 的应用来移除重复的音乐文件,和名为 dupeGuru 图片版 的应用来移除重复的图片文件。

1. dupeGuru (标准版)

需要告诉那些不熟悉 dupeGuru 的人,它是一个免费、开源、跨平台的应用,其用途是在系统中查找和移除重复文件。它可以在 Linux, Windows, 和 Mac OS X 等平台下使用。通过使用一个快速的模糊匹配算法,它可以在几分钟内找到重复文件。同时,你还可以调整 dupeGuru 使它去精确查找特定文件类型的重复文件,以及从你想删除的文件中,清除某种文件。它支持英语、 法语、 德语、 中文 (简体)、 捷克语、 意大利语、亚美尼亚语、俄语、乌克兰语、巴西语和越南语。

在 Ubuntu 14.10/14.04/13.10/13.04/12.04 中安装 dupeGuru

dupeGuru 开发者已经构建了一个 Ubuntu PPA (Personal Package Archives)来简化安装过程。想要安装 dupeGuru,依次在终端中键入以下命令:

sudo apt-add-repository ppa:hsoft/ppa
sudo apt-get update
sudo apt-get install dupeguru-se

使用

使用非常简单,可从 Unity 面板或菜单中启动 dupeGuru。

Linux:dupeGuru—直接从硬盘中查找并移除重复文件
Linux:dupeGuru—直接从硬盘中查找并移除重复文件

点击位于底部的 + 按钮来添加你想扫描的文件目录。点击 扫描 按钮开始查找重复文件。

Linux:dupeGuru—直接从硬盘中查找并移除重复文件
Linux:dupeGuru—直接从硬盘中查找并移除重复文件

一旦所选目录中含有重复文件,那么它将在窗口中展示重复文件。正如你所看到的,在下面的截图中,我的下载目录中有一个重复文件。

Linux:dupeGuru—直接从硬盘中查找并移除重复文件
Linux:dupeGuru—直接从硬盘中查找并移除重复文件

现在,你可以决定下一步如何操作。你可以删除这个重复的文件,或者对它进行重命名,抑或是 复制/移动 到另一个位置。为此,选定该重复文件,或在菜单栏中选定写有“仅显示重复”选项 ,如果你选择了“仅显示重复”选项,则只有重复文件在窗口中可见,这样你便可以轻松选择并删除这些文件。点击“操作”下拉菜单,最后选择你将执行的操作。在这里,我只想删除重复文件,所以我选择了“移动标记文件到垃圾箱”这个选项。

Linux:dupeGuru—直接从硬盘中查找并移除重复文件
Linux:dupeGuru—直接从硬盘中查找并移除重复文件

接着,点击“继续”选项来移除重复文件。

Linux:dupeGuru—直接从硬盘中查找并移除重复文件
Linux:dupeGuru—直接从硬盘中查找并移除重复文件

2. dupeGuru 音乐版

dupeGuru 音乐版 或简称 dupeGuru ME,它的功能与 dupeGuru 类似。它拥有 dupeGuru 的所有功能,但它包含更多的信息列 (如比特率,持续时间,标签等)和更多的扫描类型(如带有字段的文件名,标签以及音频内容)。和 dupeGuru 一样,dupeGuru ME 也运行在 Linux、Windows 和 Mac OS X 中。

它支持众多的格式,诸如 MP3、WMA、AAC (iTunes 格式)、OGG、FLAC,以及失真率较少的 AAC 和 WMA 格式等。

在 Ubuntu 14.10/14.04/13.10/13.04/12.04 中安装 dupeGuru ME

现在,我们不必再添加任何 PPA,因为在前面的步骤中,我们已经进行了添加。所以在终端中键入以下命令来安装它:

sudo apt-get install dupeguru-me

使用

你可以从 Unity 面板或菜单中启动它。dupeGuru ME 的使用方法、操作界面以及外观和正常的 dupeGuru 类似。添加你想扫描的目录并选择你想执行的操作。重复的音乐文件就会被删除。

Linux:dupeGuru—直接从硬盘中查找并移除重复文件
Linux:dupeGuru—直接从硬盘中查找并移除重复文件

3. dupeGuru 图片版

dupeGuru 图片版,或简称为 duepGuru PE,是一个在你的电脑中查找重复图片的工具。它和 dupeGuru 类似,但独具匹配重复图片的功能。dupeGuru PE 可运行在 Linux、Windows 和 Mac OS X 中。

dupeGuru PE 支持 JPG、PNG、TIFF、GIF 和 BMP 等图片格式。所有的这些格式可以被同时比较。Mac OS X 版的 dupeGuru PE 还支持 PSD 和 RAW (CR2 和 NEF) 格式。

在 Ubuntu 14.10/14.04/13.10/13.04/12.04 中安装 dupeGuru PE

由于我们已经添加了 PPA,我们也不必为 dupeGuru PE 再次添加。只需运行如下命令来安装它。

sudo apt-get install dupeguru-pe

使用

就使用方法,操作界面和外观而言,它与 dupeGuru,dupeGuru ME 类似。我就纳闷为什么开发者为不同的类别开发了不同的版本。我想如果开发一个结合以上三个版本功能的应用,或许会更好。

启动它,添加你想扫描的目录,并选择你想执行的操作。就这样,你的重复文件将被清除。

Linux:dupeGuru—直接从硬盘中查找并移除重复文件
Linux:dupeGuru—直接从硬盘中查找并移除重复文件

如果因为任何的安全问题而不能移除某些重复文件,请记下这些文件的位置,通过终端或文件管理器来手动删除它们。

欢呼吧!


via: http://www.unixmen.com/dupeguru-find-remove-duplicate-files-instantly-hard-drive/

作者:SK 译者:FSSlc 校对:Caroline

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

来源:https://linux.cn/article-4992-1.html

Linux:Linux桌面环境终极指南

去年,Network World网站内的Linux老牌拥护者Bryan Lunduke曾经给自己定下一项奋斗目标,即深入到各类Linux桌面系统当中、以至少一周的时间利用其完成工作及个人计算任务,而后将他的心得体会记 录在Linux Tycoon博客当中。

Linux:Linux桌面环境终极指南
Linux:Linux桌面环境终极指南

最终他撰写出十篇评测报告,我们将其内容进行了收集与整理,以便大家通过今天的文章将不同桌面环境之间的比较结论一网打尽。当然,也欢迎尚未体验过Linux桌面系统的朋友将本文作为参考资料加以借鉴。

elementary OS的Pantheon

首先需要澄清一点,这篇评测报告针对的是Pantheon桌面环境而非elementary OS本身。

不过这套环境确实给我们的这位评测专家带来了惊喜。Pantheon凭借着自身简洁而利落的使用体验在竞争当中脱颖而出。举例来说,其应用程序启动器就让Bryan体会到了“实用”二字的真正含义:

“这款应用程序启动器并不打算充当音乐播放器,也不会为用户在Amazon.com上搜索个不停。它仅仅是做好自己的本职工作,帮助用户寻找并启动 所需要的应用程序,而后彻底消失在我们的视线当中。目前大多数桌面环境(包括Linux以及其它操作系统类型)都患有严重的功能膨胀综合症——这会导致系 统自身运行速度缓慢甚至出现一系列bug……我们可以将这类方案称为‘麻烦’的操作系统。然而Pantheon并没有这样的问题。在Pantheon环境 当中,其每一个设计环节都确切符合用户的使用预期……而且仅此而已,没有其它的冗余设定。这种优秀的特性涵盖其系统设置、文本编辑器以及视频播放器等等全 部默认应用程序。”

其应用程序启动器仅仅是整套环境下的一个缩影,但足以彰显Pantheon的突出风格。这款操作系统易于学习并使用,Bryan将它推荐给那些此前从未接触过Linux系统的新手用户或者虽然拥有长期使用经验、但却仅仅希望能够快捷高效实现明确操作目标的Linux专家。

Ubuntu Unity

在这一次的评测中,Bryan需要再次面对曾经迫使他转而寻求其它替代性解决方案的一套Linux桌面环境——Unity。这套环境在自定义方面作出诸多限制,特别是禁止用户将dock从屏幕左侧移动到其它位置,正是这一点迫使Bryan投入了其它系统环境的怀抱。

在重新回归Unity平台之后,Bryan发现它的可用性较印象中出现了可喜的提升,无论是运行速度还是运作可靠性方面皆是如此。尽管他仍坚持认为 Unity在运行速度方面感觉还无法与其它环境相媲美——例如Enlightenment以及MATE——但他承认这种速度差异并非不可忍受,也不至于让 他的使用过程屡屡遭遇崩溃状况。尤其值得一提的是,负责提供标签组以启动应用程序或者访问目标文件的Unity Dash功能确实极具实用性。

然而,自定义限制与糟糕的设计(至少与GNOME Shell与elementary OS相比)仍然深深困扰着Bryan。他并没有明确指出Unity算得上是款不错的环境,但却强调称Unity可能会给那些喜欢鼓捣自己Linux桌面环境的用户感到颇为受限。

配备Aura与ASH的ChromeOS

此次评测并不打算将Chromebook作为用户的首选PC设备——虽然Bryan之前曾经做出过此类尝试——而仅仅是要记录下他在ChromeOS之上运行Aura硬件加速显示系统以及Aura Shell(简称ASH)桌面环境时的实际感受。

由于允许用户对窗口进行管理并拥有针对应用程序访问操作的“非常传统”的导航栏设计,ASH被广泛视为一套出色的桌面系统标准。其导航栏位于屏幕右 手边,其中囊括了面向音量调节以及蓝牙开关等功能的状态标识,而且从功能简便性而言其堪称“极为明显而且直观”。以下内容为Bryan对该环境的整体使用 感受的评价:

“这正是ASH最为光彩照人的特性所在——便捷而又精致。它为用户提供了充足的功能选项以启动所需要的应用程序(或者打开网络页面),并在完成任务后‘事了拂衣去’。整个过程速度极快而且非常优雅。”

在谈到ChromeOS的适用群体时,Bryan表示它非常适合那些希望能在自己的桌面系统中轻松找到并启动目标应用程序的用户,而且系统引导机制 会在应用程序启动完成后彻底隐去身形。正是出于这个理由,Bryan表示他会考虑将该环境作为他所用过的最出色的操作系统之一。

其中惟一真正称得上缺点的部分在于,ASH无法处理运行在标准桌面环境下的Linux应用程序——例如Gimp以及LibreOffice。如果拥有这一能力,Bryan认为他很可能会将其作为日常使用的首选操作系统。

Android即桌面环境

在经过对ChromeOS为期一周的测试之后,Bryan迈入了Android即桌面这一全新领域。

在其默认设置当中,有一套选项既可以被视为重要的亮点、亦可能带来严重的拖累,具体取决于大家所使用的设备类型。Android采用的是一套单一窗 口界面,这意味着那些始终以全屏方式使用单一应用程序的用户能够借此提高工作效率,即保证他们不会由于多个窗口或者标签的存在而劳心分神。

然而如果大家需要同时使用两款应用程序,那么这种设置则会令人极为沮丧甚至暴跳如雷——举例来说,希望在阅读一份文档的同时向另一套电子表格中输入数据。Bryan还发现,每一次收到即时消息时他都需要启动一套全屏化通讯界面,这确实让人难以忍受。

总体而言,Bryan承认只要能够克服上述短板,用户们会发现“Android事实上是一套具备出色可用性、易于学习、操作灵活而且外观相对出色的桌面环境”。

LXDE

尽管这套桌面环境配得上“极速”这一评价而且“拥有极端轻量化设计”,但Bryan仍然认为它缺乏抓住客户眼球所必需的核心亮点。

这并不是说LXDE缺乏实用性——Bryan表示,其默认外观与使用感受确实“乏善可陈”; 其文件管理器在文件管理方面的表现堪称完美,但设计风格所有些过时; 其界面采用的是“通用型桌面环境的基本样式”。

总结来看,上述因素已经足够让LXDE成为一款实用的桌面环境,特别是对那些并不太重视设计效果的用户们而言。而且正如Bryan所言,LXDE可能“最适合与Raspberry Pi之类主要面向教育领域的轻量级资源设备进行配伍。”

Cinnamon

需要指出的是,Bryan曾经对Cinnamon系统作出过严厉的批判,称其完全是在“浪费时间”。不过这一次的评测却改变了Bryan的看法,他表示虽然“还是没有什么能让人喜出望外的亮点”,但这套桌面环境“确实相当出色”。

从传统用户体验方面来看,Cinnamon并没有什么足以在其它桌面环境的对比下脱颖而出的本钱——包括Linux与Windows。不过使用Cinnamon确实帮助Bryan充分发挥了自己的优势。

我发现在使用了大约一周之后……我开始喜欢上了这套系统环境。其外观与使用感受非常精致。在使用过程中我很少遇到错误(即使有也不算什么恶性 bug……大多属于无关痛痒的小毛病),而且其性能表现——即使说不上惊人——至少也称得上“非常充裕”。我从未发现自己需要在枯坐中等待 Cinnamon的响应。当我点击对象之后,其能够马上作出响应。很好,很强大。

该系统所提供的配置选项也相当广泛。其中几乎囊括了能够丰富各方面用户体验的一定自定义内容,包括在标题栏中提供关闭/缩小/其它等快捷按钮。这种出色的灵活性让我深深地沉醉于其中。

也最终赢得了我的赞许。

Bryan情不自禁地指出了其与MATE之间的相似之处,他认为二者在运行速度与轻量化特性方面可谓齐头并进。不过他仍然为Cinnamon开发团队的出色成绩而喝彩,称其创造出了一套“高质量且光彩照人”的桌面环境。

ratpoison

请大家直接阅读Bryan给出的评测意见,并自行判断他在与ratpoison相伴的一周内到底经历了怎样的心路历程:

通常来讲,我会在整个体验过程结束之后才发表文章向大家分享自己的心得体会。但这一次我实在是做不到。相信大家都看出来了……它真的让我心烦意乱。 不,“讨厌”这样的说法还不足以表达我的感受。我的小心脏中充斥着愤怒甚至是仇恨,就如同在一千个太阳下惨受烧灼。这款万恶的操作系统应该被送到海牙国际 法庭,以反人类罪名接受其应有的审判。

首先,习惯于传统键盘加鼠标操作方式的朋友肯定会受不了它的设计,因为ratpoison只支持键盘操控(因此才得到了ratpoison这个名 头,意为‘灭鼠药’)。Bryan发现单纯利用快捷键组合进行操作就像是一下子把人塞进了建筑工地上的工程机械里头,巨大的反差简直让人无从下手。而更恐 怖的还在于,这套系统环境并没有提供明确而详尽的快捷键操作指导。

因此,对于那些愿意在桌面环境下体会没有鼠标可用的艰苦生活的朋友来说,ratpoison还算值得一试。但如果大家没有这样的耐心跟它瞎耗,请听众Bryan的建议——跟它挥手道别。

KDE Plasma

作为一套资源密集型系统环境,KDE Plasma在运行速度与性能表现方面确实超出了Bryan的预料——但其糟糕的视觉设计却令人大失所望。

KDE Plasma 4.13版本在反应速度方面得到了极高评价,人们普遍认为其表现远优于原有版本——至少在8GB内存容量的笔记本电脑上是如此(根据Bryan的推测,其速度表现在内存容量较小的设备上可能会有所缩水)。

但设计中的某些默认机制仍然令人非常沮丧,从活动窗口默认采用的“闪光”效果到工具栏中意义不明的空白区域皆是如此。这套环境具备可定制能力,但以上设计层面的小问题让它彻底告别了“优秀使用体验”这一评价。

Awesome

Awesome似乎恰好是为Bryan量身打造的桌面系统——这是一套轻量化且易于使用的环境,且提供广泛的自定义选项。

不过正是这种定制化能力让我们的评测专家感到了一丝困惑。Awesome在其功能部件及主题当中使用的是Lua编程语言,这是一种能力强大的语言、 但需要配合大量工作才能打造出属于自己的定制化部件。Bryan同志在这一实验过程中屡遭坎坷,最终导致他彻底删除了全部存在问题的功能部件。

不过在将其删除之后,Bryan发现Awesome终于呈现出了自己极具实用性的一面。因此从本质上讲,Awesome完全能够成为那些有信心也有 能力玩转Lua编程语言的用户心中的出色桌面系统——甚至包括那些打算享受开箱即用便利的用户——但从外行生手的角度出发,其使用难度确实太高了。

Enlightenment (E17)

该系列评测报告中的第一篇就是针对E17所发,这也是Enlightenment家族中第二年轻的新版本。之所以选择E17版本,是因为就目前来看其稳定性较仍处于开发阶段的E18更为出色。

Bryan发现,E17系统的设计与布局方案“相当华丽”,并在评测中指出该系统能够在他使用触控屏设备时作出良好的响应。除此之外,E17还提供一套“外观最为抢眼的终端”方案,其水平可谓评测至今全部竞争对手中的绝对王者,而且在启动方面的性能表现也极为迅捷。

E17还承诺提供多种自定义功能,不过在这方面Bryan遇到了一些障碍。由于调整窗口尺寸需要通过“右下角一小块小得令人难以置信的区域内实现”而让他烦躁不已,他决定着手对主题进行修改。但事实证明,这项工作难度极高,他最终只能从其它可用主题当中直接选择了一套。

以上这些在评测工作中暴露出的问题看起来无关紧要,但对于那些有意愿对系统环境进行自定义的用户来说,这确实是个值得认真考量的重要因素。

来源:http://developer.51cto.com/art/201503/467300.htm

Linux:关于Apache Mesos的一些想法

我关注Apache Mesos很长时间了。Apache Mesos从研究论文开始,2010年成为Apache孵化项目,后来从ASF“毕业”,并于2013年建立商业实体Mesosphere

过去的几个月,发生了许多事,因此我想,这是个好机会来写写关于Mesos和其生态的文章。

关于Mesos和YARN已经有很多讨论了。我也看到过诸如“Mesos的资源请求模型非常落后”的评论,也注意到Mesos在过去几年变得更加流行。这里的关键因素之一也许是Docker天花乱坠般的宣传以及各自对于协作层的需要。在本篇的末尾,我们会再一次回到Mesos vs. YARN的话题。

我承认之前自己并没有完全理解Mesos的真正潜力,直到那天坐着读完Mesos研究论文,它包括设计哲学、资源分配、隔离保证和容错。

Mesos应对的核心挑战是,在不了解一个框架的前提下如何满足对框架的 约束(constraints),这也是资源分配中最难以理解的地方。Mesos处理资源的方式就像家长主持一个孩子的生日派对:好比你要为15个孩子 (==框架)提供食物(==资源),并且不可能知道他们的喜好(==安置倾向)。但你可以提供给他们一块披萨或者一碗芝麻菜,并且他们可以免费接受(现在 或一会之后)或者拒绝。而且,刚接一位客人下车的爸爸也许会告诉你,那人的小孩是素食主义者,那么提供牛肉汉堡(==过滤物)给那个小孩就说不通了。

Linux:关于Apache Mesos的一些想法
Linux:关于Apache Mesos的一些想法

有一个有趣的事实(虽然我认为这是公知的),Mesos和Spark有一个共同点:Matei Zaharia——来自一个靠近加拿大安大略的小镇——他是加州伯克利分校AMP实验室的学生,这个实验室为Mesos和Spark都做了巨大贡献。最近,他出任Databricks的CTO,Databricks是一家指导Spark的商业实体公司。

Linux:关于Apache Mesos的一些想法
Linux:关于Apache Mesos的一些想法

回到Mesos vs. YARN——幸运的是最近这不再是一个二选一的问题了:使用Myriad项目(由 eBay、Mesosphere和MapR的共同开发,现在交由ASF孵化),你可以让它们在集群中共存并调度它们。简而言之,是一个Mesos框架用来 动态扩展YARN集群,并支持运行Hadoop应用,如Spark和非Hadoop应用,如Node.js、Memcached、RoR等。激动人心的时刻!

这就是我个人对于Apache Mesos的看法,写于2015年二月中旬。我会继续关注Myriad,作为初学者的你如果还未尝试,或许你可以试试测试驱动Mesos

来源:http://dockerone.com/article/211

Linux:Linux有问必答:如何在Debian或Ubuntu上安装完整的内核源码

问题:我需要为我的Debian或Ubuntu下载并安装完整树结构的内核源码以供编译一个定制的内核。那么在Debian或Ubuntu上有什么可行的方法来下载完整的内核源码呢?

在给你的Linux安装完整内核源码之前,先问问自己是否真的需要这样做。如果你仅仅是尝试去编译一个内核模块或是为内核定制驱动,你并不需要完整的内核源码树。你只需要安装一些与内核对应的头文件,这样就足够了。

Linux:Linux有问必答:如何在Debian或Ubuntu上安装完整的内核源码
Linux:Linux有问必答:如何在Debian或Ubuntu上安装完整的内核源码

只有在你需要生成一个定制的内核,而且内核源码中的一些内核默认设置要被你调整了的情况下,你才需要完整的内核源码树。

这里将会解答如何在Debian或Ubuntu的库中下载并安装完整树结构的内核源码。你可以在https://www.kernel.org/pub/linux/kernel/下载官方的内核源码,不过使用发行版软件仓库可以允许你下载包含补丁的内核源码。

在Debian上安装完整的内核源码

在下载内核源码之前,先安装dpkg-dev,其中包含你在Debian上生成源代码时需要的开发工具套件。不仅如此,dpkg-dev中还包含在用来解压Debian源码包并自动打补丁的工具dpgk-source。

$ sudo apt-get install dpkg-dev

然后,运行以下命令下载完整的内核源码。

$ apt-get source linux-image-$(uname -r)

伴随着完整内核源码(linux_X.X.XX.orig.tar.xz)的还有一些可用的内核补丁(linux_X.X.X+XXX.debian.tar.xz)和源码控制文件(linux_XXXX.dsc),这些都将被下载并存储到当前目录。在.dsc文件中会指出如何给内核源码打补丁。

当下载完成,以上的命令将会自动调用工具dpkg-source将下载的内核源码解压到当前的目录中,与此同时根据.dsc文件来下补丁。

最终完整的内核源码树将会以”linux-X.X.XX”的形式呈现在当前目录中。

在Ubuntu上安装完整内核源码

如果你想安装完整内核源码的话,以上在Debian上的那一套做法在Ubuntu上仍然奏效。

在Ubuntu上还有另一套方法安装完整内核源码。事实上,你可以查一下由Canonical为Ubuntu不同发行版维护的内核源码树。

$ sudo apt-get install git
$ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-$(lsb_release --codename | cut -f2).git

举个例子,如果你使用的是Ubuntu 14.04,以上的命令将会查看Git的”ubuntu-trusty”仓库中的代码。

一旦在你对Git仓库的查询结束后,使用以下的命令来安装用来访问生成内核源码树所需依赖的重要开发包。

$ sudo apt-get build-dep linux-image-$(uname -r)

via: http://ask.xmodulo.com/install-full-kernel-source-debian-ubuntu.html

作者:Dan Nanni 译者:martin qi 校对:Caroline

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

来源:https://linux.cn/article-5015-1.html

Linux:Linux有问必答:怎样解决“XXX is not in the sudoers file”错误

问题:我想在我的Linux系统上使用sudo来运行一些特权命令,然而当我试图这么做时,我却得到了”[我的用户名] is not in the sudoers file. This incident will be reported.”的错误信息。我该怎么处理这种sudo错误呢?

sudo是一个允许特定的用户组用另一个用户(典型的是root)的特权来运行一个命令。sudo有详细的日志功能,并且提供了对用户可通过sudo来运行哪些命令的细粒度控制。

Sudo vs. Su

su命令也提供了同样的特权提升功能,两者不同的是它们认证过程和特权变化的粒度。su允许你从你的登录会话切换到另一个用户的会话,然后你可以随心所欲地用该用户的特权来运行任何程序,但是你需要知道目标用户的密码才能切换这个用户。而另一方面,sudo能在单个命令的基础上工作,允许你用root的特权来运行单个命令。用sudo你不必一定要知道root的密码,但是在提示输入sudo密码的时候要输入你的密码。

Linux:Linux有问必答:怎样解决“XXX is not in the sudoers file”错误
Linux:Linux有问必答:怎样解决“XXX is not in the sudoers file”错误

在Sudoers列表里添加用户

作为一个新用户的你如果试图运行sudo命令,你会碰到以下错误。意思是你不在这个包含经过认证就可以使用sudo特权的这么一个用户组的sudoers列表里。

[my-user-id] is not in the sudoers file.  This incident will be reported.

有两个方法可以把你加入到sudoers列表中去。

方法一

第一个方法是把你添加到名为sudo的Linux用户组里。这个特殊的Linux用户组是预配置来使用sudo的。因此,一旦你在这个组里面,那你就可以运行sudo命令了。

以下命令会把你加入到Linux的sudo组里,你需要在root用户下运行该命令。

# adduser <用户名> sudo

现在来确认你的组员资格有没有更新,使用groups命令来看看你当前属于哪个组的列表里。这个列表必定是包含sudo组的。

$ groups

alice adm cdrom sudo dip plugdev fuse lpadmin netdev sambashare davfs2 libvirtd docker promiscuous

组员资格变动(和sudo访问)会在你登出后重新登录后生效。

方法二

第二个能让你使用sudo的方法是直接把你自己添加到 /etc/sudoers 这个配置文件中去。

要修改 /etc/sudoers 文件,你可以使用一个名为visudo的特殊sudo编辑器命令。用root身份简单调用以下命令。

# visudo

这条命令能打开并编辑 /etc/sudoers 文件,将以下这行文字添加至文件末尾,并按Ctrl+X。提示出现时,保存修改退出。

 ALL=(ALL) ALL

这个修改会立即生效,你就能马上使用sudo了。

Linux:Linux有问必答:怎样解决“XXX is not in the sudoers file”错误
Linux:Linux有问必答:怎样解决“XXX is not in the sudoers file”错误

via: http://ask.xmodulo.com/fix-is-not-in-the-sudoers-file.html

译者:ZTinoZ 校对:wxy

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

来源:http://ask.xmodulo.com/fix-is-not-in-the-sudoers-file.html

Linux:介绍 Linux 的命名空间

背景

从Linux 2.6.24版的内核开始,Linux 就支持6种不同类型的命名空间。它们的出现,使用户创建的进程能够与系统分离得更加彻底,从而不需要使用更多的底层虚拟化技术。

  • CLONE_NEWIPC: 进程间通信(IPC)的命名空间,可以将 SystemV 的 IPC 和 POSIX 的消息队列独立出来。
  • CLONE_NEWPID: 进程命名空间。空间内的PID 是独立分配的,意思就是命名空间内的虚拟 PID 可能会与命名空间外的 PID 相冲突,于是命名空间内的 PID 映射到命名空间外时会使用另外一个 PID。比如说,命名空间内第一个 PID 为1,而在命名空间外就是该 PID 已被 init 进程所使用。
  • CLONE_NEWNET: 网络命名空间,用于隔离网络资源(/proc/net、IP 地址、网卡、路由等)。后台进程可以运行在不同命名空间内的相同端口上,用户还可以虚拟出一块网卡。
  • CLONE_NEWNS: 挂载命名空间,进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到 chroot 的功能,而在安全性方面比 chroot 更高。
  • CLONE_NEWUTS: UTS 命名空间,主要目的是独立出主机名和网络信息服务(NIS)。
  • CLONE_NEWUSER: 用户命名空间,同进程 ID 一样,用户 ID 和组 ID 在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的 ID。

下面我们介绍一下进程命名空间和网络命名空间。

Linux:介绍 Linux 的命名空间
Linux:介绍 Linux 的命名空间

(题图来自:fotothing.com)

进程命名空间

本文用 C 语言介绍上述概念,因为演示进程命名空间的时候需要用到 C 语言。下面的测试过程在 Debian 6 和 Debian 7 上执行。首先,在栈内分配一页内存空间,并将指针指向内存页的末尾。这里我们使用 alloca() 函数来分配内存,不要用 malloc() 函数,它会把内存分配在堆上。

void *mem = alloca(sysconf(_SC_PAGESIZE)) + sysconf(_SC_PAGESIZE);

然后使用 clone() 函数创建子进程,传入我们的子栈空间地址 “mem”,并指定命名空间的标记。同时我们还指定“callee”作为子进程运行的函数。

mypid = clone(callee, mem, SIGCHLD | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | CLONE_FILES, NULL);

clone 之后我们要在父进程中等待子进程先退出,否则的话,父进程会继续运行下去,并马上进程结束,留下子进程变成孤儿进程:

while (waitpid(mypid, &r, 0) < 0 && errno == EINTR)
{
    continue;
}

最后当子进程退出后,我们会回到 shell 界面,并返回子进程的退出码。

if (WIFEXITED(r))
{
    return WEXITSTATUS(r);
}
return EXIT_FAILURE;

上文介绍的 callee 函数功能如下:

static int callee()
{
    int ret;
    mount("proc", "/proc", "proc", 0, "");
    setgid(u);
    setgroups(0, NULL);
    setuid(u);
    ret = execl("/bin/bash", "/bin/bash", NULL);
    return ret;
}

程序挂载了 /proc 文件系统,设置用户 ID 和组 ID,值都为“u”,然后运行 /bin/bash 程序,LXC 是一个操作系统级的虚拟化工具,使用 cgroups 和命名空间来完成资源的分离。现在我们把所有代码放在一起,变量“u”的值设为65534,在 Debian 系统中,这是“nobody”和“nogroup”:

#define _GNU_SOURCE
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
static int callee();
const int u = 65534;
int main(int argc, char *argv[])
{
    int r;
    pid_t mypid;
    void *mem = alloca(sysconf(_SC_PAGESIZE)) + sysconf(_SC_PAGESIZE);
    mypid = clone(callee, mem, SIGCHLD | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNS | CLONE_FILES, NULL);
    while (waitpid(mypid, &r, 0) < 0 && errno == EINTR)
    {
        continue;
    }
    if (WIFEXITED(r))
    {
        return WEXITSTATUS(r);
    }
    return EXIT_FAILURE;
}
static int callee()
{
    int ret;
    mount("proc", "/proc", "proc", 0, "");
    setgid(u);
    setgroups(0, NULL);
    setuid(u);
    ret = execl("/bin/bash", "/bin/bash", NULL);
    return ret;
}

执行以下命令来运行上面的代码:

root@w:~/pen/tmp# gcc -O -o ns.c -Wall -Werror -ansi -c89 ns.c
root@w:~/pen/tmp# ./ns
nobody@w:~/pen/tmp$ id
uid=65534(nobody) gid=65534(nogroup)
nobody@w:~/pen/tmp$ ps auxw
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
nobody       1  0.0  0.0   4620  1816 pts/1    S    21:21   0:00 /bin/bash
nobody       5  0.0  0.0   2784  1064 pts/1    R+   21:21   0:00 ps auxw
nobody@w:~/pen/tmp$

注意上面的结果,UID 和 GID 被设置成 nobody 和 nogroup 了,特别是 ps 工具只输出两个进程,它们的 ID 分别是1和5(LCTT注:这就是上文介绍 CLONE_NEWPID 时提到的功能,在线程所在的命名空间内,进程 ID 可以为1,映射到命名空间外是另外一个 PID;而命名空间外的 ID 为1的进程一直是 init)。

网络命名空间

接下来轮到使用 ip netns 来设置网络的命名空间。第一步先确定当前系统没有命名空间:

root@w:~# ip netns list
Object "netns" is unknown, try "ip help".

如果报了上述错误,你需要更新你的系统内核,以及 ip 工具程序。这里假设你的内核版高于2.6.24,ip 工具版本也差不多,高于2.6.24(LCTT注:ip 工具由 iproute 安装包提供,此安装包版本与内核版本相近)。更新好后,ip netns list 在没有命名空间存在的情况下不会输出任务信息。加个名为“ns1”的命名空间看看:

root@w:~# ip netns add ns1
root@w:~# ip netns list
ns1

列出网卡:

root@w:~# ip link list
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0:  mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 1000
    link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff

创建新的虚拟网卡,并加到命名空间。虚拟网卡需要成对创建,互相关联——就像交叉电缆一样:

root@w:~# ip link add veth0 type veth peer name veth1
root@w:~# ip link list
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0:  mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 1000
    link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff
3: veth1:  mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether d2:e9:52:18:19:ab brd ff:ff:ff:ff:ff:ff
4: veth0:  mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether f2:f7:5e:e2:22:ac brd ff:ff:ff:ff:ff:ff

这个时候 ifconfig -a 命令也能显示新添加的 veth0 和 veth1 两块网卡。

很好,现在将这两份块网卡加到命名空间中去。注意一下,下面的 ip netns exec 命令用于将后面的命令在命名空间中执行(LCTT注:下面的结果显示了在 ns1 这个网络命名空间中,只存在 lo 和 veth1 两块网卡):

root@w:~# ip link set veth1 netns ns1
root@w:~# ip netns exec ns1 ip link list
1: lo:  mtu 65536 qdisc noop state DOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: veth1:  mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether d2:e9:52:18:19:ab brd ff:ff:ff:ff:ff:ff

这个时候 ifconfig -a 命令只能显示 veth0,不能显示 veth1,因为后者现在在 ns1 命名空间中。

如果想删除 veth0/veth1,可以执行下面的命令:

ip netns exec ns1 ip link del veth1

我们可以为 veth0 分配 IP 地址:

ifconfig veth0 192.168.5.5/24

在命名空间内为 veth1 分配 IP 地址:

ip netns exec ns1 ifconfig veth1 192.168.5.10/24 up

在命名空间内外执行 ip addr list 命令:

root@w:~# ip addr list
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.122/24 brd 192.168.3.255 scope global eth0
    inet6 fe80::20c:29ff:fe65:259e/64 scope link
       valid_lft forever preferred_lft forever
6: veth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 86:b2:c7:bd:c9:11 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.5/24 brd 192.168.5.255 scope global veth0
    inet6 fe80::84b2:c7ff:febd:c911/64 scope link
       valid_lft forever preferred_lft forever
root@w:~# ip netns exec ns1 ip addr list
1: lo:  mtu 65536 qdisc noop state DOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 12:bd:b6:76:a6:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.10/24 brd 192.168.5.255 scope global veth1
    inet6 fe80::10bd:b6ff:fe76:a6eb/64 scope link
       valid_lft forever preferred_lft forever

在命名空间内外查看路由表:

root@w:~# ip route list
default via 192.168.3.1 dev eth0  proto static
192.168.3.0/24 dev eth0  proto kernel  scope link  src 192.168.3.122
192.168.5.0/24 dev veth0  proto kernel  scope link  src 192.168.5.5
root@w:~# ip netns exec ns1 ip route list
192.168.5.0/24 dev veth1  proto kernel  scope link  src 192.168.5.10

最后,将虚拟网卡连到物理网卡上,我们需要用到桥接。这里做的是将 veth0 桥接到 eth0,而 ns1 命名空间内则使用 DHCP 自动获取 IP 地址:

root@w:~# brctl addbr br0
root@w:~# brctl addif br0 eth0
root@w:~# brctl addif br0 veth0
root@w:~# ifconfig eth0 0.0.0.0
root@w:~# ifconfig veth0 0.0.0.0
root@w:~# dhclient br0
root@w:~# ip addr list br0
7: br0:  mtu 1500 qdisc noqueue state UP
    link/ether 00:0c:29:65:25:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.122/24 brd 192.168.3.255 scope global br0
    inet6 fe80::20c:29ff:fe65:259e/64 scope link
       valid_lft forever preferred_lft forever

为网桥 br0 分配的 IP 地址为192.168.3.122/24。接下来为命名空间分配地址:

root@w:~# ip netns exec ns1 dhclient veth1
root@w:~# ip netns exec ns1 ip addr list
1: lo:  mtu 65536 qdisc noop state DOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 12:bd:b6:76:a6:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.248/24 brd 192.168.3.255 scope global veth1
    inet6 fe80::10bd:b6ff:fe76:a6eb/64 scope link
       valid_lft forever preferred_lft forever

现在, veth1 的 IP 被设置成 192.168.3.248/24 了。


via: http://www.howtoforge.com/linux-namespaces

作者:aziods 译者:bazz2 校对:wxy

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

来源:http://www.howtoforge.com/linux-namespaces

Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户

问题:我想要在MySQL服务器上创建一个新的用户帐号,并且赋予他适当的权限和资源限制。如何通过命令行的方式来创建并且设置一个MySQL用户呢?

要访问一个MySQL服务器,你需要使用一个用户帐号登录其中方可进行。每个MySQL用户帐号都有许多与之相关连的属性,例如用户名、密码以及权限和资源限制。”权限”定义了特定用户能够在MySQL服务器中做什么,而”资源限制”为用户设置了一系列服务器资源的使用许可。创建或更新一个用户涉及到了对用户帐号所有属性的管理。

Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户
Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户

下面展示了如何在Linux中创建和设置一个MySQL用户。

首先以root身份登录到MySQL服务器中。

$ mysql -u root -p

当验证提示出现的时候,输入MySQL的root帐号的密码。

Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户
Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户

创建一个MySQL用户

使用如下命令创建一个用户名和密码分别为”myuser”和”mypassword”的用户。

mysql> CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';

一旦用户被创建后,包括加密的密码、权限和资源限制在内的所有帐号细节都会被存储在一个名为user的表中,这个表则存在于mysql这个特殊的数据库里。

运行下列命令,验证帐号是否创建成功

mysql> SELECT host, user, password FROM mysql.user WHERE user='myuser';

赋予MySQL用户权限

一个新建的MySQL用户没有任何访问权限,这就意味着你不能在MySQL数据库中进行任何操作。你得赋予用户必要的权限。以下是一些可用的权限:

  • ALL: 所有可用的权限
  • CREATE: 创建库、表和索引
  • LOCK_TABLES: 锁定表
  • ALTER: 修改表
  • DELETE: 删除表
  • INSERT: 插入表或列
  • SELECT: 检索表或列的数据
  • CREATE_VIEW: 创建视图
  • SHOW_DATABASES: 列出数据库
  • DROP: 删除库、表和视图

运行以下命令赋予”myuser”用户特定权限。

mysql> GRANT  ON . TO 'myuser'@'localhost';

以上命令中, 代表着用逗号分隔的权限列表。如果你想要将权限赋予任意数据库(或表),那么使用星号(*)来代替数据库(或表)的名字。

例如,为所有数据库/表赋予 CREATE 和 INSERT 权限:

mysql> GRANT CREATE, INSERT ON *.* TO 'myuser'@'localhost';

验证给用户赋予的全权限:

mysql> SHOW GRANTS FOR 'myuser'@'localhost';
Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户
Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户

将全部的权限赋予所有数据库/表:

mysql> GRANT ALL ON *.* TO 'myuser'@'localhost';

你也可以将用户现有的权限删除。使用以下命令废除”myuser”帐号的现有权限:

mysql> REVOKE  ON .
FROM 'myuser'@'localhost';

为用户添加资源限制

在MySQL中,你可以为单独的用户设置MySQL的资源使用限制。可用的资源限制如下:

使用以下命令为”myuser”帐号增加一个资源限制:

mysql> GRANT USAGE ON .
TO 'myuser'@'localhost' WITH ;

中你可以指定多个使用空格分隔开的资源限制。

例如,增加 MAXQUERIESPERHOUR 和 MAXCONNECTIONSPERHOUR 资源限制:

mysql> GRANT USAGE ON *.* TO 'myuser'@'localhost' WITH MAX_QUERIES_PER_HOUR 30 MAX_CONNECTIONS_PER_HOUR 6;

验证用户的资源限制:

mysql> SHOW GRANTS FOR 'myuser'@'localhost;
Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户
Linux:Linux有问必答:如何通过命令行创建和设置一个MySQL用户

创建和设置一个MySQL用户最后的一个重要步骤:

mysql> FLUSH PRIVILEGES;

如此一来更改便生效了。现在MySQL用户帐号就可以使用了。


via: http://ask.xmodulo.com/create-configure-mysql-user-command-line.html

译者:Ping 校对:wxy

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

来源:https://linux.cn/article-5020-1.html

Linux:在 Linux 上配置一个 syslog 服务器

syslog服务器可以用作一个网络中的日志监控中心,所有能够通过网络来发送日志的设施(包含了Linux或Windows服务器,路由器,交换机以及其他主机)都可以把日志发送给它。 通过设置一个syslog服务器,可以将不同设施/主机发送的日志,过滤和合并到一个独立的位置,这样使得你更容易地查看和获取重要的日志消息。

rsyslog 作为标准的syslog守护进程,预装在了大多数的Linux发行版中。在客户端/服务器架构的配置下,rsyslog同时扮演了两种角色:1.作为一个syslog服务器,rsyslog可以收集来自其他设施的日志信息;2.作为一个syslog客户端,rsyslog可以将其内部的日志信息传输到远程的syslog服务器。

在此,我们演示了在linux上如何通过rsyslog来配置一个中心化syslog服务器。 在进入详解之前,先温习一下syslog标准。

Linux:在 Linux 上配置一个 syslog 服务器
Linux:在 Linux 上配置一个 syslog 服务器

syslog标准基础

当通过syslog机制来收集日志时,有3个必须要考虑到的重要事情:

  • 设施层级: 监听何种类型的进程
  • 严重性 (优先) 级别: 收集何种级别的日志消息
  • 目标: 发送或记录日志消息到何处

现在我们更加深入地了解一下配置是如何定义的。

设施层级定义了一种用来对内部系统进程进行分类的方法,linux中的一些常见的设施包括:

  • auth: 身份验证相关的消息(登录时)
  • cron: 进程或应用调度相关的消息
  • daemon: 守护进程相关的消息(内部服务器)
  • kernel: 内核相关的消息
  • mail: 内部邮件服务器相关的消息
  • syslog: syslog 守护进程本身相关的消息
  • lpr: 打印服务相关的消息
  • local0 – local7: 用户自定义的消息 (local7 通常被Cisco 和 Windows 服务器 使用)

严重性(优先)级别有固定的标准缩写和指代的值,其中的数字7具有最高的级别,这些级别包含了:

  • emerg: Emergency(紧急)- 0
  • alert: Alerts (报警)- 1
  • crit: Critical (关键)- 2
  • err: Errors (错误)- 3
  • warn: Warnings (警告)- 4
  • notice: Notification (通知)- 5
  • info: Information (消息)- 6
  • debug: Debugging (调试)- 7

最后,目标语句会让一个syslog客户端来执行以下三个任务之一:

  1. 保存日志消息到一个本地文件;
  2. 通过TCP/UDP将消息路由到远程的syslog服务器中;
  3. 将其发送到一个标准输出中,例如控制台。

在 rsyslog里, syslog的配置是基于以下模式进行结构化的。

[facility-level].[severity-level]  [destination]

在Linux中配置Rsyslog

在我们理解syslog之后,现在可以通过rsyslog来将一个Linux服务器配置为一个中心syslog服务器了,另外我们也将看到如何在一个Windows的系统上配置一个syslog客户端来发送内部日志到该syslog服务器中。

第1步: 初始化系统需求

要将linux主机设置为一个中央日志服务器, 我们需要创建一个分离的 /var 分区,并分配足够大的磁盘空间或者创建一个特殊的LVM卷组。这样就会使得syslog服务器能够承担在日积月累收集日志所带来的潜在增长。

第2步: 让rsyslog 后台进程生效

rsyslog守护进程来自于当前的linux发布版本的预装模块,但是默认并没有启动。为了能够让rsyslog守护进程能够接受外部的消息,需要编辑其配置文件/etc/rsyslog.conf.

打开文件进行编辑,查找到下面的两行所在的位置,通过删除其行首的#字符来取消注释。

$ModLoad imudp
$UDPServerRun 514

这会使得rsysolog守护进程能够在UDP端口514上接受日志消息了—UDP是一种比TCP速度快,但是并不具有TCP一样的数据流的可靠性。所以如果你需要使用可靠的传送机制,就可以通过取消以下行的注释。

$ModLoad imtcp
$InputTCPServerRun 514

需要注意的是,TCP和UDP可以被同时生效来监听TCP/UDP 连接。

第3步:创建日志接收模板

接下来的这步,需要我们来为远程消息创建模板,并告知rsyslog守护进程如何记录从其他客户端机器所接受到的消息。

使用文本编辑器来打开 /etc/rsyslog.conf,然后在GLOBAL DIRECTIVE块前追加以下的模板。

$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *
*.*  ?RemoteLogs
& ~

在此对该模板进行简单解释,$template RemoteLogs(这里“RemoteLogs” 字符串可以为任何其他的描述性的名称)指令使rsyslog后台进程将日志消息写到/var/log下的单独的本地日志文件中,其中日志文件的名称是基于远程日志发送机器的主机名以及生成该日志的应用程序名进行定义的。其中第二行暗示了我们将RemoteLogs模板应用到所有接收到的日志上。

符号”& ~”表示了一个重定向规则,被用来告知rsyslog守护进程停止对日志消息的进一步处理,并且不要在本地写入。如果没有使用该重定向规则,那么所有的远程消息都会在写入上述描述的日志文件之外同时被写入到本地日志文件,这就意味着日志消息实际上被写了两次。使用该规则的另外一个结果就是syslog服务器本身的日志消息只会被以该机器主机名命名的专有文件中。

如果你想要的话,也可以使用下面的模式对特定的设备或严重性级别使用新的模板直接来记录日志消息。

[facility-level].[severity-level]    ?RemoteLogs

例如:

将全部优先级别的所有内部用户验证消息指定为RemoteLogs模板:

authpriv.*   ?RemoteLogs

将所有系统进程中除开mail、用户验证和cron消息之外的进程产生的消息级别的日志指定为RemoteLogs模板:

*.info,mail.none,authpriv.none,cron.none    ?RemoteLogs

如果我们想要将所有从远程客户端接受到的消息写入到一个以它们的IP地址命名的单个文件中,可以使用以下的模板。在此我们为该模板赋予了“IpTemplate”名称。

$template IpTemplate,"/var/log/%FROMHOST-IP%.log"
*.*  ?IpTemplate
& ~

在我们启用rsyslog守护进程并编辑好配置文件之后,需要重启该守护进程。

在 Debian,Ubuntu 或 CentOS/RHEL 6中:

$ sudo service rsyslog restart

在 Fedora 或 CentOS/RHEL 7中:

$ sudo systemctl restart rsyslog

我们可以通过netstat命令来验证rsyslog守护进程是否正常工作。

 $ sudo netstat -tulpn | grep rsyslog

在UDP监听端口下工作的rsyslog守护进程会有类似下面的输出。

udp     0 0    0.0.0.0:514    0.0.0.0:*      551/rsyslogd
udp6    0 0    :::514         :::*           551/rsyslogd

如果rsyslog守护进程被设置在TCP连接端口,那么应该有类似下面所示的输出。

tcp     0 0     0.0.0.0:514   0.0.0.0:*     LISTEN    1891/rsyslogd
tcp6    0 0     :::514        :::*          LISTEN    1891/rsyslogd

发送Windows日志到一个远程的rsyslog服务器

要将一个Windows客户端的日志消息转发到我们的rsyslog服务器,需要一个安装 Windows syslog 代理。当然,有许多的syslog代理可以在windows上运行,在此我们可以使用一个自由软件程序 Datagram SyslogAgent.

在下载安装该syslog代理后,需要将其配置为作为服务运行。指定使用何种协议来发送数据,以及远程rsyslog服务器的IP地址和端口,最后指定应该传输的事件日志类型,如下所示。

Linux:在 Linux 上配置一个 syslog 服务器
Linux:在 Linux 上配置一个 syslog 服务器

在我们完成所有的这些配置之后,我们就可以启动该服务并且在中央rsyslog服务器中使用命令行工具tail -f来查看日志文件了。

总结

通过创建一个可以收集本地和远程主机的中央rsyslog服务器,我们可以更好地了解在这些系统内部究竟发生着什么,而且可以更加容易地调试它们的问题,是否在它们之间有任何延迟或崩溃存在。


via: http://xmodulo.com/configure-syslog-server-linux.html

作者:Caezsar M 译者:theo-l 校对:wxy

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

来源:https://linux.cn/article-5023-1.html