分类 技术 下的文章

rdiff-backup 是一个用于本地/远程增量备份的强大而易用的 Python 脚本,它适用于任何 POSIX 操作系统,如Linux、Mac OS X 或 Cygwin。它集合了镜像和增量备份的显著特性。

值得注意的是,它保留了子目录、dev 文件、硬链接,以及关键的文件属性,如权限、uid/gid 所有权、修改时间、扩展属性、acl 以及 resource fork。它可以通过管道以高效带宽的模式工作,这与流行的 rsync 备份工具类似。

rdiff-backup 通过使用 SSH 将单个目录备份到另一个目录,这意味着数据传输被加密并且是安全的。目标目录(在远程系统上)最终会得到源目录的完整副本,但是此外的反向差异会存储在目标目录的特殊子目录中,从而可以恢复前一段时间丢失的文件。

依赖

要在 Linux 中使用 rdiff-backup,你需要在系统上安装以下软件包:

  • Python v2.2 或更高版本
  • librsync v0.9.7 或更高版本
  • pylibacl 和 pyxattr Python 模块是可选的,但它们分别是 POSIX 访问控制列表(ACL)和扩展属性支持必需的。
  • rdiff-backup-statistics 需要 Python v2.4 或更高版本。

如何在 Linux 中安装 rdiff-backup

重要:如果你通过网络运行它,则必须在两个系统中都安装 rdiff-backup,两者最好是相同版本。

该脚本已经存在于主流 Linux 发行版的官方仓库中,只需运行以下命令来安装 rdiff-backup 及其依赖关系:

在 Debian/Ubuntu 中

$ sudo apt-get update
$ sudo apt-get install librsync-dev rdiff-backup

在 CentOS/RHEL 7 中

# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
# rpm -ivh epel-release-7-9.noarch.rpm
# yum install librsync rdiff-backup

在 CentOS/RHEL 6 中

# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install librsync rdiff-backup

在 Fedora 中

# yum install librsync rdiff-backup
# dnf install librsync rdiff-backup [Fedora 22+]

如何在 Linux 中使用 rdiff-backup

如前所述,rdiff-backup 使用 SSH 连接到网络上的远程计算机,SSH 的默认身份验证方式是用户名/密码,这通常需要人工交互。

但是,要自动执行诸如脚本等自动备份之类的任务,那么你需要配置使用 SSH 密钥无密码登录 SSH,因为 SSH 密钥增加了两台 Linux服务器之间的信任来简化文件同步或传输

在你设置了 SSH 无密码登录后,你可以使用下面的例子开始使用该脚本。

备份文件到不同分区

下面的例子会备份 /etc 文件夹到另外一个分区的 Backup 文件夹内:

$ sudo rdiff-backup /etc /media/aaronkilik/Data/Backup/mint_etc.backup

Backup Files to Different Partition

备份文件到不同分区

要排除一个特定文件夹和它的子目录,你可以如下使用 --exclude 选项:

$ sudo rdiff-backup --exclude /etc/cockpit --exclude /etc/bluetooth /media/aaronkilik/Data/Backup/mint_etc.backup

我们可以如下使用 --include-special-files 包含所有的设备文件、fifo 文件、socket 文件和链接文件:

$ sudo rdiff-backup --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup

还有另外两个重要标志来用于选择文件,--max-file-size 用来排除大于给定字节大小的文件,--min-file-size 用于排除小于给定字节大小的文件:

$ sudo rdiff-backup --max-file-size 5M --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup

在本地 Linux 服务器上备份远程文件

要这么做,我们使用:

Remote Server (tecmint)         : 192.168.56.102 
Local Backup Server (backup)    : 192.168.56.10

如前所述,你必须在两台机器上安装相同版本的 rdiff-backup,如下所示,请尝试在两台机器上检查版本:

$ rdiff-backup -V

Check rdiff Version on Servers

检查服务器中 rdiff 版本

在备份服务器中,像这样创建一个存储备份文件的目录:

# mkdir -p /backups

现在在备份服务器中,运行下面的命令来将远程 Linux 服务器 192.168.56.102 中的 /var/log//root 备份到 /backups 中:

# rdiff-backup [email protected]::/var/log/ /backups/192.168.56.102_logs.backup
# rdiff-backup [email protected]::/root/ /backups/192.168.56.102_rootfiles.backup

下面的截图展示了远程服务器 192.168.56.102 中的 root 文件夹以及 192.168.56.10 备份服务器中的已备份文件:

Backup Remote Directory on Local Server

在本地服务器备份远程目录

注意截图中 “backup” 目录中创建的 rdiff-backup-data 文件夹,它包含了备份过程和增量文件的重要数据。

rdiff-backup - Backup Process Files

rdiff-backup – 备份过程文件

现在,在 192.168.56.102 服务器中,如下所示 root 目录已经添加了额外的文件:

Verify Backup Directory

验证备份目录

让我们再次运行备份命令以获取更改的数据,我们可以使用 -v[0-9](其中数字指定详细程度级别,默认值为 3,这是静默模式)选项设置详细功能:

# rdiff-backup -v4 [email protected]::/root/ /backups/192.168.56.102_rootfiles.backup 

Incremental Backup with Summary

带有摘要的增量备份

要列出 /backups/192.168.56.102_rootfiles.backup 目录中包含的部分增量备份的数量和日期,我们可以运行:

# rdiff-backup -l /backups/192.168.56.102_rootfiles.backup/

使用 cron 自动进行 rdiff-back 备份

使用 --print-statistics 成功备份后,我们可以打印摘要统计信息。但是,如果我们不设置此选项,我们可以仍从会话统计中获得。在手册页的 “STATISTICS” 部分中阅读有关此选项的更多信息。

-remote-schema 选项使我们能够指定使用替代方法连接到远程计算机。

现在,我们开始在备份服务器 192.168.56.10 上创建一个 backup.sh 脚本,如下所示:

# cd ~/bin
# vi backup.sh

添加下面的行到脚本中。

#!/bin/bash
#This is a rdiff-backup utility backup script
#Backup command
rdiff-backup --print-statistics --remote-schema 'ssh -C %s "sudo /usr/bin/rdiff-backup --server --restrict-read-only  /"'  [email protected]::/var/logs  /backups/192.168.56.102_logs.back
#Checking rdiff-backup command success/error
status=$?
if [ $status != 0 ]; then
#append error message in ~/backup.log file
echo "rdiff-backup exit Code: $status - Command Unsuccessful" >>~/backup.log;
exit 1;
fi
#Remove incremental backup files older than one month
rdiff-backup --force --remove-older-than 1M /backups/192.168.56.102_logs.back

保存文件并退出,接着运行下面的命令在服务器 192.168.56.10 上的 crontab 中添加此脚本:

# crontab -e

添加此行在每天午夜运行你的备份脚本:

0   0  *  *  * /root/bin/backup.sh > /dev/null 2>&1

保存 crontab 并退出,现在我们已经成功自动化了备份过程。确保一切如希望那样工作。

阅读 rdiff-backup 的手册页获取更多信息、详尽的使用选项以及示例:

# man rdiff-backup

rdiff-backup 主页: http://www.nongnu.org/rdiff-backup/

就是这样了!在本教程中,我们向你展示了如何安装并基础地使用 rdiff-backup 这个易于使用的 Python 脚本,用于 Linux 中的本地/远程增量备份。 请通过下面的反馈栏与我们分享你的想法。

(题图:Pixabay,CC0)


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin 和 web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/rdiff-backup-remote-incremental-backup-for-linux/

作者:Aaron Kili 译者:geekpi 校对:wxy

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

在 Linux 系统上通过命令行切换文件夹时,为了回到父目录(长路径),我们通常会重复输入 cd 命令cd ../../..),直到进入感兴趣的目录。

对于经验丰富的 Linux 用户或需要进行各种不同任务的系统管理员而言,这可能非常乏味,因此希望在操作系统时有一个快捷方式来简化工作。

建议阅读: Autojump - 一个快速浏览 Linux 文件系统的高级 “cd” 命令

在本文中,我们将在 bd 工具的帮助下,用这个简单而有用的工具快速回到 Linux 中的父目录。

bd 是用于切换文件夹的便利工具,它可以使你快速返回到父目录,而不必重复键入 cd ../../.. 。 你可以可靠地将其与其他 Linux 命令组合以执行几个日常操作。

如何在 Linux 中安装 bd

运行下面的命令,使用 wget 命令下载并安装 bd 到 /usr/bin/ 中,添加执行权限,并在 ~/.bashrc 中创建需要的别名:

$ wget --no-check-certificate -O /usr/bin/bd https://raw.github.com/vigneshwaranr/bd/master/bd
$ chmod +rx /usr/bin/bd
$ echo 'alias bd=". bd -si"' >> ~/.bashrc
$ source ~/.bashrc

注意:如果要启用大小写敏感的目录名匹配,请在上面创建的别名中,设置 -s 标志而不是 -si 标志。

要启用自动补全支持,运行这些命令:

$ sudo wget -O /etc/bash_completion.d/bd https://raw.github.com/vigneshwaranr/bd/master/bash_completion.d/bd
$ sudo source /etc/bash_completion.d/bd

如何在 Linux 中使用 bd

假设你目前在这个路径的顶层目录:

/media/aaronkilik/Data/Computer Science/Documents/Books/LEARN/Linux/Books/server $ 

你想要快速进入 “Documents” 目录,只要输入:

$ bd Documents

接着直接进入到 Data 目录,你可以输入:

$ bd Data

Switch Between Directories Quickly

目录间快速切换

实际上,bd 让它变得更加直接,你要做的是输入 “bd <开头几个字母>”,比如:

$ bd Doc
$ bd Da

Quickly Switch Directories

快速切换目录

重要:如果层次结构中有不止一个具有相同名称的目录,bd 将会移动到最接近的目录,而不考虑最近的父目录,如下面的例子那样。

例如,在上面的路径中,有两个名称相同的目录 Books,如果你想移动到:

/media/aaronkilik/Data/ComputerScience/Documents/Books/LEARN/Linux/Books

输入 bd Books 会进入:

/media/aaronkilik/Data/ComputerScience/Documents/Books

Move to 'Books' Directory Quickly

快速进入 ‘Books’ 目录

另外,在反引号``中使用 bd 如 bd <开头几个字母> 会打印出路径而不更改当前目录,所以你可以与其他常见的 Linux 命令,如 [ls](http://www.tecmint.com/tag/linux-ls-command/),[echo](http://www.tecmint.com/echo-command-in-linux/) 等一起使用 bd <开头几个字母>`` 。

在下面的例子中,当前在 /var/www/html/internship/assets/filetree 目录中,要打印出绝对路径、详细列出内容、统计目录 html 中所有文件的大小,你不必进入它,只需要键入:

$ echo `bd ht`
$ ls -l `bd ht`
$ du -cs `bd ht`

Switch Directory with Listing

列出切换的目录

要在 Github 上了解更多关于 bd 的信息:https://github.com/vigneshwaranr/bd

就是这样了!在本文中,我们展示了使用 bd 程序在 Linux 中快速切换文件夹的便捷方法。

通过下面的反馈栏单发表你的看法。此外,你还知道其他类似的工具么,在评论中让我们知道。


作者简介:

Aaron Kili是一名 Linux 和 F.O.S.S 的爱好者,未来的 Linux 系统管理员、网站开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并乐于分享知识。


via: http://www.tecmint.com/bd-quickly-go-back-to-a-linux-parent-directory/

作者:Aaron Kili 译者:geekpi 校对:wxy

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

pm2 是一个 Node.js 应用的进程管理器,它可以让你的应用程序保持运行,还有一个内建的负载均衡器。它非常简单而且强大,你可以零间断重启或重新加载你的 node 应用,它也允许你为你的 node 应用创建集群。

在这篇博文中,我会向你展示如何安装和配置 pm2 用于这个简单的 'Express' 应用,然后配置 Nginx 作为运行在 pm2 下的 node 应用的反向代理。

前提:

  • Ubuntu 16.04 - 64bit
  • Root 权限

第一步 - 安装 Node.js LTS

在这篇指南中,我们会从零开始我们的实验。首先,我们需要在服务器上安装 Node.js。我会使用 Nodejs LTS 6.x 版本,它能从 nodesource 仓库中安装。

从 Ubuntu 仓库安装 python-software-properties 软件包并添加 “nodesource” Nodejs 仓库。

sudo apt-get install -y python-software-properties 
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

安装最新版本的 Nodejs LTS:

sudo apt-get install -y nodejs

安装完成后,查看 node 和 npm 版本。

node -v
npm -v

检查 node.js 版本

第二步 - 生成 Express 示例 App

我会使用 express-generator 软件包生成的简单 web 应用框架进行示例安装。express-generator 可以使用 npm 命令安装。

npm安装 express-generator

npm install express-generator -g
  • -g : 在系统内部安装软件包。

我会以普通用户运行应用程序,而不是 root 或者超级用户。我们首先需要创建一个新的用户。

创建一个名为 yume 的用户:

useradd -m -s /bin/bash yume
passwd yume

使用 su 命令登录到新用户:

su - yume

下一步,用 express 命令生成一个新的简单 web 应用程序:

express hakase-app

命令会创建新项目目录 hakase-app

用 express-generator 生成应用框架

进入到项目目录并安装应用需要的所有依赖。

cd hakase-app
npm install

然后用下面的命令测试并启动一个新的简单应用程序:

DEBUG=myapp:* npm start

默认情况下,我们的 express 应用会运行在 3000 端口。现在访问服务器的 IP 地址:192.168.33.10:3000 :

express nodejs 运行在 3000 端口

这个简单 web 应用框架现在以 'yume' 用户运行在 3000 端口。

第三步 - 安装 pm2

pm2 是一个 node 软件包,可以使用 npm 命令安装。(用 root 权限,如果你仍然以 yume 用户登录,那么运行命令 exit 再次成为 root 用户):

npm install pm2 -g

现在我们可以为我们的 web 应用使用 pm2 了。

进入应用目录 hakase-app

su - yume
cd ~/hakase-app/

这里你可以看到一个名为 package.json 的文件,用 cat 命令显示它的内容。

cat package.json

配置 express nodejs 服务

你可以看到 start 行有一个 nodejs 用于启动 express 应用的命令。我们会和 pm2 进程管理器一起使用这个命令。

像下面这样使用 pm2 命令运行 express 应用:

pm2 start ./bin/www

现在你可以看到像下面这样的结果:

使用 pm2 运行 nodejs app

我们的 express 应用正在 pm2 中运行,名称为 www,id 为 0。你可以用 show 选项 show nodeid|name 获取更多 pm2 下运行的应用的信息。

pm2 show www

pm2 服务状态

如果你想看我们应用的日志,你可以使用 logs 选项。它包括访问和错误日志,你还可以看到应用程序的 HTTP 状态。

pm2 logs www

pm2 服务日志

你可以看到我们的程序正在运行。现在,让我们来让它开机自启动。

pm2 startup systemd
  • systemd: Ubuntu 16 使用的是 systemd。

你会看到要用 root 用户运行命令的信息。使用 exit 命令回到 root 用户然后运行命令。

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u yume --hp /home/yume

它会为启动应用程序生成 systemd 配置文件。当你重启服务器的时候,应用程序就会自动运行。

pm2 添加服务到开机自启动

第四步 - 安装和配置 Nginx 作为反向代理

在这篇指南中,我们会使用 Nginx 作为 node 应用的反向代理。Ubuntu 仓库中有 Nginx,用 apt 命令安装它:

sudo apt-get install -y nginx

下一步,进入到 sites-available 目录并创建新的虚拟主机配置文件。

cd /etc/nginx/sites-available/
vim hakase-app

粘贴下面的配置:

upstream hakase-app {
    # Nodejs app upstream
    server 127.0.0.1:3000;
    keepalive 64;
}

# Server on port 80
server {
    listen 80;
    server_name hakase-node.co;
    root /home/yume/hakase-app;

    location / {
        # Proxy_pass configuration
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_max_temp_file_size 0;
        proxy_pass http://hakase-app/;
        proxy_redirect off;
        proxy_read_timeout 240s;
    }
}

保存文件并退出 vim。

在配置中:

  • node 应用使用域名 hakase-node.co 运行。
  • 所有来自 nginx 的流量都会被转发到运行在 3000 端口的 node app。

测试 Nginx 配置确保没有错误。

nginx -t

启用 Nginx 并使其开机自启动。

systemctl start nginx
systemctl enable nginx

第五步 - 测试

打开你的 web 浏览器并访问域名(我的是):http://hakase-app.co

你可以看到 express 应用正在 Nginx web 服务器中运行。

Nodejs app 在 pm2 和 Nginx 中运行

下一步,重启你的服务器,确保你的 node app 能开机自启动:

pm2 save
sudo reboot

如果你再次登录到了你的服务器,检查 node app 进程。以 yume 用户运行下面的命令。

su - yume
pm2 status www

nodejs 在 pm2 下开机自启动

Node 应用在 pm2 中运行并使用 Nginx 作为反向代理。

链接


via: https://www.howtoforge.com/tutorial/how-to-deploy-nodejs-applications-with-pm2-and-nginx-on-ubuntu/

作者:Muhammad Arul 译者:ictlyh 校对:wxy

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

Jenkins 是从 Hudson 项目衍生出来的自动化服务器。Jenkins 是一个基于服务器的应用程序,运行在 Java servlet 容器中,它支持包括 Git、SVN 以及 Mercurial 在内的多种 SCM( 源码控制工具 Source Control Management )。Jenkins 提供了上百种插件帮助你的项目实现自动化。Jenkins 由 Kohsuke Kawaguchi 开发,在 2011 年使用 MIT 协议发布了第一个发行版,它是个自由软件。

在这篇指南中,我会向你介绍如何在 Ubuntu 16.04 中安装最新版本的 Jenkins。我们会用自己的域名运行 Jenkins,在 apache web 服务器中安装和配置 Jenkins,而且支持反向代理。

前提

  • Ubuntu 16.04 服务器 - 64 位
  • Root 权限

第一步 - 安装 Java OpenJDK 7

Jenkins 基于 Java,因此我们需要在服务器上安装 Java OpenJDK 7。在这里,我们会从一个 PPA 仓库安装 Java 7,首先我们需要添加这个仓库。

默认情况下,Ubuntu 16.04 没有安装用于管理 PPA 仓库的 python-software-properties 软件包,因此我们首先需要安装这个软件。使用 apt 命令安装 python-software-properties。

apt-get install python-software-properties

下一步,添加 Java PPA 仓库到服务器中。

add-apt-repository ppa:openjdk-r/ppa

用 apt 命令更新 Ubuntu 仓库并安装 Java OpenJDK。

apt-get update
apt-get install openjdk-7-jdk

输入下面的命令验证安装:

java -version

你会看到安装到服务器上的 Java 版本。

在 Ubuntu 16.04 上安装 Java OpenJDK 7

第二步 - 安装 Jenkins

Jenkins 给软件安装包提供了一个 Ubuntu 仓库,我们会从这个仓库中安装 Jenkins。

用下面的命令添加 Jenkins 密钥和仓库到系统中。

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
echo 'deb https://pkg.jenkins.io/debian-stable binary/' | tee -a /etc/apt/sources.list

更新仓库并安装 Jenkins。

apt-get update
apt-get install jenkins

安装完成后,用下面的命令启动 Jenkins。

systemctl start jenkins

通过检查 Jenkins 默认使用的端口(端口 8080)验证 Jenkins 正在运行。我会像下面这样用 netstat 命令检测:

netstat -plntu

Jenkins 已经安装好了并运行在 8080 端口。

已经将 Jenkins 安装到 8080 端口

第三步 - 为 Jenkins 安装和配置 Apache 作为反向代理

在这篇指南中,我们会在一个 Apache web 服务器中运行 Jenkins,我们会为 Jenkins 配置 apache 作为反向代理。首先我会安装 apache 并启用一些需要的模块,然后我会为 Jenkins 用域名 my.jenkins.id 创建虚拟主机文件。请在这里使用你自己的域名并在所有配置文件中出现的地方替换。

从 Ubuntu 仓库安装 apache2 web 服务器。

apt-get install apache2

安装完成后,启用 proxy 和 proxy\_http 模块以便将 apache 配置为 Jenkins 的前端服务器/反向代理。

a2enmod proxy
a2enmod proxy_http

下一步,在 sites-available 目录创建新的虚拟主机文件。

cd /etc/apache2/sites-available/
vim jenkins.conf

粘贴下面的虚拟主机配置。

<Virtualhost *:80>
    ServerName        my.jenkins.id
    ProxyRequests     Off
    ProxyPreserveHost On
    AllowEncodedSlashes NoDecode

    <Proxy http://localhost:8080/*>
      Order deny,allow
      Allow from all
    </Proxy>

    ProxyPass         /  http://localhost:8080/ nocanon
    ProxyPassReverse  /  http://localhost:8080/
    ProxyPassReverse  /  http://my.jenkins.id/
</Virtualhost>

保存文件。然后用 a2ensite 命令激活 Jenkins 虚拟主机。

a2ensite jenkins

重启 Apache 和 Jenkins。

systemctl restart apache2
systemctl restart jenkins

检查 Jenkins 和 Apache 正在使用 80 和 8080 端口。

netstat -plntu

检查 Apache 和 Jenkins 是否在运行

第四步 - 配置 Jenkins

Jenkins 用域名 'my.jenkins.id' 运行。打开你的 web 浏览器然后输入 URL。你会看到要求你输入初始管理员密码的页面。Jenkins 已经生成了一个密码,因此我们只需要显示并把结果复制到密码框。

cat 命令显示 Jenkins 初始管理员密码。

cat /var/lib/jenkins/secrets/initialAdminPassword
a1789d1561bf413c938122c599cf65c9

获取 Jenkins 管理员密码

将结果粘贴到密码框然后点击 Continue。

安装和配置 Jenkins

现在为了后面能比较好的使用,我们需要在 Jenkins 中安装一些插件。选择 Install Suggested Plugin,点击它。

安装 Jenkins 插件

Jenkins 插件安装过程:

Jenkins 安装完插件

安装完插件后,我们需要创建一个新的管理员密码。输入你的管理员用户名、密码、电子邮件等,然后点击 ‘Save and Finish’。

创建 Jenkins 管理员账户

点击 start 开始使用 Jenkins。你会被重定向到 Jenkins 管理员面板。

重定向到管理员面板

成功完成 Jenkins 安装和配置。

Jenkins 管理员面板

第五步 - Jenkins 安全

在 Jenkins 管理员面板,我们需要为 Jenkins 配置标准的安全,点击 ‘Manage Jenkins’ 和 ‘Configure Global Security’。

Jenkins 全局安全设置

Jenkins 在 ‘Access Control’ 部分提供了多种认证方法。为了能够控制所有的用户权限,我选择了 ‘Matrix-based Security’。在复选框 ‘User/Group’ 中启用 admin 用户。通过勾选所有选项给 admin 所有权限,给 anonymous 只读权限。现在点击 ‘Save’。

配置 Jenkins 权限

你会被重定向到面板,如果出现了登录选项,只需输入你的管理员账户和密码。

第六步 - 测试一个简单的自动化任务

在这一部分,我想为 Jenkins 服务测试一个简单的任务。为了测试 Jenkins 我会创建一个简单的任务,并用 top 命令查看服务器的负载。

在 Jenkins 管理员面板上,点击 ‘Create New Job’。

在 Jenkins 中创建新的任务

输入任务的名称,在这里我输入 ‘Checking System’,选择 Freestyle Project 然后点击 OK。

配置 Jenkins 任务

进入 Build 标签页。在 Add build step,选择选项 Execute shell。

在输入框输入下面的命令。

top -b -n 1 | head -n 5

点击 Save。

启动 Jenkins 任务

现在你是在任务 ‘Project checking system’ 的任务页。点击 Build Now 执行任务 ‘checking system’。

任务执行完成后,你会看到 Build History,点击第一个任务查看结果。

下面是 Jenkins 任务执行的结果。

构建和运行 Jenkins 任务

到这里就介绍完了在 Ubuntu 16.04 中用 Apache web 服务器安装 Jenkins 的内容。


via: https://www.howtoforge.com/tutorial/how-to-install-jenkins-with-apache-on-ubuntu-16-04/

作者:Muhammad Arul 译者:ictlyh 校对:wxy

本文由 LCTT 组织编译,Linux中国 荣誉推出

在上篇文章中我们向您展示了如何在 Linux 上创建一个共享目录。这次,我们会为您介绍如何将 Linux 上指定目录的读写权限赋予用户。

有两种方法可以实现这个目标:第一种是 使用 ACL (访问控制列表) ,第二种是创建用户组来管理文件权限,下面会一一介绍。

为了完成这个教程,我们将使用以下设置。

  • 操作系统:CentOS 7
  • 测试目录:/shares/project1/reports
  • 测试用户:tecmint
  • 文件系统类型:ext4

请确认所有的命令都是使用 root 用户执行的,或者使用 sudo 命令 来享受与之同样的权限。

让我们开始吧!下面,先使用 mkdir 命令来创建一个名为 reports 的目录。

# mkdir -p /shares/project1/reports                 

使用 ACL 来为用户赋予目录的读写权限

重要提示:打算使用此方法的话,您需要确认您的 Linux 文件系统类型(如 ext3 和 ext4, NTFS, BTRFS)支持 ACL。

1、 首先, 依照以下命令在您的系统中检查当前文件系统类型,并且查看内核是否支持 ACL:

# df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
# grep -i acl /boot/config*

从下方的截屏可以看到,文件系统类型是 ext4,并且从 CONFIG_EXT4_FS_POSIX_ACL=y 选项可以发现内核是支持 POSIX ACL 的。

Check Filesystem Type and Kernel ACL Support

查看文件系统类型和内核的 ACL 支持。

2、 接下来,查看文件系统(分区)挂载时是否使用了 ACL 选项。

# tune2fs -l /dev/sda1 | grep acl

Check Partition ACL Support

查看分区是否支持 ACL

通过上边的输出可以发现,默认的挂载项目中已经对 ACL 进行了支持。如果发现结果不如所愿,你可以通过以下命令对指定分区(此例中使用 /dev/sda3)开启 ACL 的支持。

# mount -o remount,acl /
# tune2fs -o acl /dev/sda3

3、 现在是时候指定目录 reports 的读写权限分配给名为 tecmint 的用户了,依照以下命令执行即可。

# getfacl /shares/project1/reports                # Check the default ACL settings for the directory 
# setfacl -m user:tecmint:rw /shares/project1/reports     # Give rw access to user tecmint 
# getfacl /shares/project1/reports                # Check new ACL settings for the directory

Give Read/Write Access to Directory Using ACL

通过 ACL 对指定目录赋予读写权限

在上方的截屏中,通过输出结果的第二行 getfacl 命令可以发现,用户 tecmint 已经成功的被赋予了 /shares/project1/reports 目录的读写权限。

如果想要获取 ACL 列表的更多信息。可以在下方查看我们的其他指南。

  1. 如何使用访问控制列表(ACL)为用户/组设置磁盘配额
  2. 如何使用访问控制列表(ACL)挂载网络共享

现在我们来看看如何使用第二种方法来为目录赋予读写权限。

使用用户组来为用户赋予指定目录的读写权限

1、 如果用户已经拥有了默认的用户组(通常组名与用户名相同),就可以简单的通过变更文件夹的所属用户组来完成。

# chgrp tecmint /shares/project1/reports

另外,我们也可以通过以下方法为多个用户(需要赋予指定目录读写权限的)新建一个用户组。如此一来,也就创建了一个共享目录

# groupadd projects

2、 接下来将用户 tecmint 添加到 projects 组中:

# usermod -aG projects tecmint      # add user to projects
# groups tecmint                # check users groups

3、 将目录的所属用户组变更为 projects:

# chgrp projects /shares/project1/reports

4、 现在,给组成员设置读写权限。

# chmod -R 0760 /shares/projects/reports
# ls  -l /shares/projects/      #check new permissions

好了!这篇教程中,我们向您展示了如何在 Linux 中将指定目录的读写权限赋予用户。若有疑问,请在留言区中提问。

(题图:Pixabay,CC0)


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,未来的 Linux 系统管理员和网络开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/give-read-write-access-to-directory-in-linux/

作者:Aaron Kili 译者:Mr-Ping 校对:jasminepeng

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

有些时候我们想从 DQYDJ 网站的数据中分析点有用的东西出来,在过去,我们要用 R 语言提取固定宽度的数据,然后通过数学建模来分析美国的最低收入补贴,当然也包括其他优秀的方法。

今天我将向你展示对大数据的一点探索,不过有点变化,使用的是全世界最流行的微型电脑————树莓派,如果手头没有,那就看下一篇吧(可能是已经处理好的数据),对于其他用户,请继续阅读吧,今天我们要建立一个树莓派 Hadoop集群!

I. 为什么要建立一个树莓派的 Hadoop 集群?

由三个树莓派节点组成的 Hadoop 集群

我们对 DQYDJ 的数据做了大量的处理工作,但这些还不能称得上是大数据。

和许许多多有争议的话题一样,数据的大小之别被解释成这样一个笑话:

如果能被内存所存储,那么它就不是大数据。 ————佚名

似乎这儿有两种解决问题的方法:

  1. 我们可以找到一个足够大的数据集合,任何家用电脑的物理或虚拟内存都存不下。
  2. 我们可以买一些不用特别定制,我们现有数据就能淹没它的电脑:
    —— 上手树莓派 2B

这个由设计师和工程师制作出来的精致小玩意儿拥有 1GB 的内存, MicroSD 卡充当它的硬盘,此外,每一台的价格都低于 50 美元,这意味着你可以花不到 250 美元的价格搭建一个 Hadoop 集群。

或许天下没有比这更便宜的入场券来带你进入大数据的大门。

II. 制作一个树莓派集群

我最喜欢制作的原材料。

这里我将给出我原来为了制作树莓派集群购买原材料的链接,如果以后要在亚马逊购买的话你可先这些链接收藏起来,也是对本站的一点支持。(谢谢)

开始制作

  1. 首先,装好三个树莓派,每一个用螺丝钉固定在亚克力面板上。(看下图)
  2. 接下来,安装以太网交换机,用双面胶贴在其中一个在亚克力面板上。
  3. 用双面胶贴将 USB 转接器贴在一个在亚克力面板使之成为最顶层。
  4. 接着就是一层一层都拼好——这里我选择将树莓派放在交换机和USB转接器的底下(可以看看完整安装好的两张截图)

想办法把线路放在需要的地方——如果你和我一样购买力 USB 线和网线,我可以将它们卷起来放在亚克力板子的每一层

现在不要急着上电,需要将系统烧录到 SD 卡上才能继续。

烧录 Raspbian

按照这个教程将 Raspbian 烧录到三张 SD 卡上,我使用的是 Win7 下的 Win32DiskImager

将其中一张烧录好的 SD 卡插在你想作为主节点的树莓派上,连接 USB 线并启动它。

启动主节点

这里有一篇非常棒的“Because We Can Geek”的教程,讲如何安装 Hadoop 2.7.1,此处就不再熬述。

在启动过程中有一些要注意的地方,我将带着你一起设置直到最后一步,记住我现在使用的 IP 段为 192.168.1.50 – 192.168.1.52,主节点是 .50,从节点是 .51 和 .52,你的网络可能会有所不同,如果你想设置静态 IP 的话可以在评论区看看或讨论。

一旦你完成了这些步骤,接下来要做的就是启用交换文件,Spark on YARN 将分割出一块非常接近内存大小的交换文件,当你内存快用完时便会使用这个交换分区。

(如果你以前没有做过有关交换分区的操作的话,可以看看这篇教程,让 swappiness 保持较低水准,因为 MicroSD 卡的性能扛不住)

现在我准备介绍有关我的和“Because We Can Geek”关于启动设置一些微妙的区别。

对于初学者,确保你给你的树莓派起了一个正式的名字——在 /etc/hostname 设置,我的主节点设置为 ‘RaspberryPiHadoopMaster’ ,从节点设置为 ‘RaspberryPiHadoopSlave#’

主节点的 /etc/hosts 配置如下:

#/etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

192.168.1.50    RaspberryPiHadoopMaster
192.168.1.51    RaspberryPiHadoopSlave1
192.168.1.52    RaspberryPiHadoopSlave2

如果你想让 Hadoop、YARN 和 Spark 运行正常的话,你也需要修改这些配置文件(不妨现在就编辑)。

这是 hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>  
  <name>fs.default.name</name>
  <value>hdfs://RaspberryPiHadoopMaster:54310</value>
</property>  
<property>  
  <name>hadoop.tmp.dir</name>
  <value>/hdfs/tmp</value>
</property>  
</configuration>

这是 yarn-site.xml (注意内存方面的改变):

<?xml version="1.0"?>
<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>4</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>128</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-vcores</name>
    <value>1</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-vcores</name>
    <value>4</value>
  </property>
<property>
   <name>yarn.nodemanager.vmem-check-enabled</name>
   <value>false</value>
   <description>Whether virtual memory limits will be enforced for containers</description>
</property>
<property>
   <name>yarn.nodemanager.vmem-pmem-ratio</name>
   <value>4</value>
   <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
</property>
<property>  
<name>yarn.resourcemanager.resource-tracker.address</name>  
<value>RaspberryPiHadoopMaster:8025</value>  
</property>  
<property>  
<name>yarn.resourcemanager.scheduler.address</name>  
<value>RaspberryPiHadoopMaster:8030</value>  
</property>  
<property>  
<name>yarn.resourcemanager.address</name>  
<value>RaspberryPiHadoopMaster:8040</value>  
</property> 
</configuration>

slaves

RaspberryPiHadoopMaster
RaspberryPiHadoopSlave1
RaspberryPiHadoopSlave2

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>  
  <name>fs.default.name</name>
  <value>hdfs://RaspberryPiHadoopMaster:54310</value>
</property>  
<property>  
  <name>hadoop.tmp.dir</name>
  <value>/hdfs/tmp</value>
</property>  
</configuration>

设置两个从节点:

接下来按照 “Because We Can Geek”上的教程,你需要对上面的文件作出小小的改动。 在 yarn-site.xml 中主节点没有改变,所以从节点中不必含有这个 slaves 文件。

III. 在我们的树莓派集群中测试 YARN

如果所有设备都正常工作,在主节点上你应该执行如下命令:

start-dfs.sh
start-yarn.sh

当设备启动后,以 Hadoop 用户执行,如果你遵循教程,用户应该是 hduser

接下来执行 hdfs dfsadmin -report 查看三个节点是否都正确启动,确认你看到一行粗体文字 ‘Live datanodes (3)’:

Configured Capacity: 93855559680 (87.41 GB)
Raspberry Pi Hadoop Cluster picture Straight On
Present Capacity: 65321992192 (60.84 GB)
DFS Remaining: 62206627840 (57.93 GB)
DFS Used: 3115364352 (2.90 GB)
DFS Used%: 4.77%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
————————————————-
Live datanodes (3):
Name: 192.168.1.51:50010 (RaspberryPiHadoopSlave1)
Hostname: RaspberryPiHadoopSlave1
Decommission Status : Normal

你现在可以做一些简单的诸如 ‘Hello, World!’ 的测试,或者直接进行下一步。

IV. 安装 SPARK ON YARN

YARN 的意思是另一种非常好用的资源调度器(Yet Another Resource Negotiator),已经作为一个易用的资源管理器集成在 Hadoop 基础安装包中。

Apache Spark 是 Hadoop 生态圈中的另一款软件包,它是一个毁誉参半的执行引擎和捆绑的 MapReduce。在一般情况下,相对于基于磁盘存储的 MapReduce,Spark 更适合基于内存的存储,某些运行任务能够得到 10-100 倍提升——安装完成集群后你可以试试 Spark 和 MapReduce 有什么不同。

我个人对 Spark 还是留下非常深刻的印象,因为它提供了两种数据工程师和科学家都比较擅长的语言—— Python 和 R。

安装 Apache Spark 非常简单,在你家目录下,wget "为 Hadoop 2.7 构建的 Apache Spark”来自这个页面),然后运行 tar -xzf “tgz 文件”,最后把解压出来的文件移动至 /opt,并清除刚才下载的文件,以上这些就是安装步骤。

我又创建了只有两行的文件 spark-env.sh,其中包含 Spark 的配置文件目录。

SPARK_MASTER_IP=192.168.1.50
SPARK_WORKER_MEMORY=512m

(在 YARN 跑起来之前我不确定这些是否有必要。)

V. 你好,世界! 为 Apache Spark 寻找有趣的数据集!

在 Hadoop 世界里面的 ‘Hello, World!’ 就是做单词计数。

我决定让我们的作品做一些内省式……为什么不统计本站最常用的单词呢?也许统计一些关于本站的大数据会更有用。

如果你有一个正在运行的 WordPress 博客,可以通过简单的两步来导出和净化。

  1. 我使用 Export to Text 插件导出文章的内容到纯文本文件中
  2. 我使用一些压缩库编写了一个 Python 脚本来剔除 HTML
import bleach

# Change this next line to your 'import' filename, whatever you would like to strip
# HTML tags from.
ascii_string = open('dqydj_with_tags.txt', 'r').read()


new_string = bleach.clean(ascii_string, tags=[], attributes={}, styles=[], strip=True)
new_string = new_string.encode('utf-8').strip()

# Change this next line to your 'export' filename
f = open('dqydj_stripped.txt', 'w')
f.write(new_string)
f.close()

现在我们有了一个更小的、适合复制到树莓派所搭建的 HDFS 集群上的文件。

如果你不能树莓派主节点上完成上面的操作,找个办法将它传输上去(scp、 rsync 等等),然后用下列命令行复制到 HDFS 上。

hdfs dfs -copyFromLocal dqydj_stripped.txt /dqydj_stripped.txt

现在准备进行最后一步 - 向 Apache Spark 写入一些代码。

VI. 点亮 Apache Spark

Cloudera 有个极棒的程序可以作为我们的超级单词计数程序的基础,你可以在这里找到。我们接下来为我们的内省式单词计数程序修改它。

在主节点上安装‘stop-words’这个 python 第三方包,虽然有趣(我在 DQYDJ 上使用了 23,295 次 the 这个单词),你可能不想看到这些语法单词占据着单词计数的前列,另外,在下列代码用你自己的数据集替换所有有关指向 dqydj 文件的地方。

import sys

from stop_words import get_stop_words
from pyspark import SparkContext, SparkConf

if __name__ == "__main__":

  # create Spark context with Spark configuration
  conf = SparkConf().setAppName("Spark Count")
  sc = SparkContext(conf=conf)

  # get threshold
  try:
    threshold = int(sys.argv[2])
  except:
    threshold = 5

  # read in text file and split each document into words
  tokenized = sc.textFile(sys.argv[1]).flatMap(lambda line: line.split(" "))

  # count the occurrence of each word
  wordCounts = tokenized.map(lambda word: (word.lower().strip(), 1)).reduceByKey(lambda v1,v2:v1 +v2)

  # filter out words with fewer than threshold occurrences
  filtered = wordCounts.filter(lambda pair:pair[1] >= threshold)

  print "*" * 80
  print "Printing top words used"
  print "-" * 80
  filtered_sorted = sorted(filtered.collect(), key=lambda x: x[1], reverse = True)
  for (word, count) in filtered_sorted: print "%s : %d" % (word.encode('utf-8').strip(), count)


  # Remove stop words
  print "\n\n"
  print "*" * 80
  print "Printing top non-stop words used"
  print "-" * 80
  # Change this to your language code (see the stop-words documentation)
  stop_words = set(get_stop_words('en'))
  no_stop_words = filter(lambda x: x[0] not in stop_words, filtered_sorted)
  for (word, count) in no_stop_words: print "%s : %d" % (word.encode('utf-8').strip(), count)

保存好 wordCount.py,确保上面的路径都是正确无误的。

现在,准备念出咒语,让运行在 YARN 上的 Spark 跑起来,你可以看到我在 DQYDJ 使用最多的单词是哪一个。

/opt/spark-2.0.0-bin-hadoop2.7/bin/spark-submit –master yarn –executor-memory 512m –name wordcount –executor-cores 8 wordCount.py /dqydj_stripped.txt

VII. 我在 DQYDJ 使用最多的单词

可能入列的单词有哪一些呢?“can, will, it’s, one, even, like, people, money, don’t, also“.

嘿,不错,“money”悄悄挤进了前十。在一个致力于金融、投资和经济的网站上谈论这似乎是件好事,对吧?

下面是的前 50 个最常用的词汇,请用它们刻画出有关我的文章的水平的结论。

我希望你能喜欢这篇关于 Hadoop、YARN 和 Apache Spark 的教程,现在你可以在 Spark 运行和编写其他的应用了。

你的下一步是任务是开始阅读 pyspark 文档(以及用于其他语言的该库),去学习一些可用的功能。根据你的兴趣和你实际存储的数据,你将会深入学习到更多——有流数据、SQL,甚至机器学习的软件包!

你怎么看?你要建立一个树莓派 Hadoop 集群吗?想要在其中挖掘一些什么吗?你在上面看到最令你惊奇的单词是什么?为什么 'S&P' 也能上榜?

(题图:Pixabay,CC0)


via: https://dqydj.com/raspberry-pi-hadoop-cluster-apache-spark-yarn/

作者:PK 译者:popy32 校对:wxy

本文由 LCTT 组织编译,Linux中国 荣誉推出