Linux 体 系 结 构 与 程 序 设 计 写 的 : PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/ usr/sbin:/usr/bin:/root/bin; export PATH 这 是 用 来 设 定 环 境 变 量 PATH 的, 所 以 在 at 里 输 入 的 命 令 就 不 需 要 写 绝 对 路 径, 写 一 个 命 令 名 即 可 不 过 crontab 只 会 设 定 /usr/bin 和 /bin 这 两 个 路 径 为 PATH 变 量 的 值 所 以 在 此 强 烈 建 议, 编 辑 的 时 候 最 好 在 最 前 面 加 上 这 样 一 行 : PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/ usr/sbin:/usr/bin 这 样 就 会 省 很 多 事 在 任 务 文 件 中 把 所 有 需 要 写 的 命 令 都 写 完 后, 就 可 以 保 存 退 出 了 在 设 置 好 任 务 后, 如 果 想 查 看, 可 以 用 crontab l, 刚 才 编 辑 的 任 务 文 件 就 会 被 输 出 到 屏 幕 上 如 果 想 添 加 或 删 除 某 个 任 务, 再 次 执 行 crontab e, 在 编 辑 框 中 编 辑 任 务 即 可 如 果 想 要 删 除 所 有 的 任 务, 则 执 行 crontab r 本 章 小 结 2 本 章 是 学 习 Linux 过 程 中 非 常 重 要 的 一 部 分, 将 直 接 影 响 以 后 的 各 种 操 作 这 是 修 炼 Linux 必 备 的 基 本 功, 使 用 命 令 的 熟 练 度 会 显 示 出 是 否 是 一 个 优 秀 的 Linux 人 员 另 外 需 要 注 意 的 是, 因 为 编 辑 器 在 Linux 下 很 常 用, 修 改 配 置 文 件 时 需 要 用 到, 写 脚 本 时 需 要 用 到, 并 且 大 部 分 软 件 都 有 集 成 Vim 或 Emacs 的 键 绑 定 (Key Binding), 所 以 至 少 需 要 掌 握 其 中 一 种 编 辑 器, 这 样 才 会 得 心 应 手 42
第 3 章 LAMP 的 基 本 安 装 与 配 置 3 LAMP 的 基 本 安 装 与 配 置 知 识 点 Apache 的 安 装 与 配 置 MySQL 的 安 装 与 配 置 PHP 的 安 装 与 配 置 LAMP 是 Linux + Apache + MySQL + PHP 的 首 字 母 缩 写 LAMP 作 为 Linux 下 的 经 典 组 合 被 广 泛 用 于 各 种 网 络 应 用, 例 如 著 名 的 Facebook ( 一 个 SNS, 社 会 化 网 络 站 点 ) 因 此 学 会 搭 建 LAMP 平 台 是 很 有 必 要 的 本 章 详 细 介 绍 Apache MySQL PHP 的 安 装 过 程, 并 进 行 了 基 本 配 置, 可 以 满 足 普 通 的 应 用 3.1 安 装 前 的 注 意 事 项 请 遵 照 一 定 的 顺 序 安 装,PHP 必 须 最 后 安 装 请 一 定 注 意 文 中 shell 提 示 符 前 面 的 路 径, 必 须 保 证 每 次 执 行 命 令 时 都 在 正 确 的 路 径 下, 否 则 可 能 会 出 错 当 然, 这 也 没 有 那 么 死 板, 如 果 清 楚 其 中 的 原 理, 也 可 以 自 行 调 整 本 章 内 容 是 在 CentOS 5.1 上 测 试 的, 所 以 文 中 额 外 安 装 的 一 些 软 件 源 中 的 包 可 能 会 与 其 他 发 行 版 中 的 包 名 不 同, 请 自 行 修 改 提 示 Linux 下 的 软 件 安 装 方 式 主 要 有 3 种 : 直 接 编 译 软 件 源 码 安 装 RPM/DEB 包 下 载 安 装 通 过 Linux 发 行 版 自 带 的 软 件 源 安 装 (CentOS 相 关 配 置 文 件 为 /etc/yum.repos.d/centos Base.repo) 不 同 的 Linux 发 行 版 软 件 源 中 的 包 名 可 能 不 同 本 章 主 要 采 用 编 译 安 装, 其 中 还 需 要 通 过 软 件 源 安 装 一 些 依 赖 软 件 本 章 主 要 采 用 编 译 安 装 方 式, 可 以 自 定 义 软 件 的 模 块 及 功 能, 例 如 可 以 通 过 configure 命 令 的 prefix 参 数 设 置 软 件 安 装 路 径 等 目 的 是 让 读 者 熟 悉 Linux 下 特 有 的 几 种 安 装 方 式, 方 便 读 者 了 解
Linux 体 系 结 构 与 程 序 设 计 Linux 下 的 各 种 应 用 3.2 Apache Apache 是 一 款 提 供 HTTP 服 务 的 Web 服 务 器 软 件 ( 全 称 是 Apache HTTP Server), 最 初 由 Robert McCool 创 造 现 在 的 Apache 是 由 Apache 软 件 基 金 会 (Apache Software Foundation) 资 助 的 开 放 社 区 进 行 维 护 和 开 发 Apache 同 时 也 是 在 Apache License 保 护 下 的 开 源 软 件, 支 持 多 种 操 作 系 统, 包 括 UNIX Linux Mac OS X FreeBSD Windows 等, 但 大 多 数 还 是 应 用 在 Linux 系 统 上 Apache 已 经 成 为 了 世 界 上 最 流 行 的 HTTP Server, 截 至 2009 年 3 月 的 统 计, 超 过 46% 的 网 站 使 用 Apache Apache HTTP Server 的 网 址 是 http://httpd.apache.org/ 3.2.1 Apache 的 安 装 3 先 到 http://httpd.apache.org/download.cgi 下 载 相 应 版 本 的 Apache HTTP Server, 这 里 使 用 的 是 2.2.11, 下 面 就 以 该 版 本 为 例 进 行 讲 解 1. 解 压 安 装 文 件 [root@localhost ~]# tar zxvf httpd 2.2.11.tar.gz 2. 编 译 并 安 装 enable so 选 项 是 打 开 Apache 的 DSO (Dynamic Shared Object) 功 能, 为 以 后 动 态 添 加 moudle 做 准 备 这 里 修 改 了 默 认 安 装 路 径 [root@localhost ~]# cd httpd 2.2.11 [root@localhost httpd 2.2.11]#./configure enable so prefix=/usr/local/apache2 [root@localhost httpd 2.2.11]# make [root@localhost httpd 2.2.11]# make install 这 样 就 安 装 成 功 了 上 面 第 二 行 的 configure 命 令 是 检 查 安 装 环 境, 检 查 通 过 后 会 生 成 一 个 Makefile 文 件, 然 后 使 用 make 命 令 会 根 据 这 个 Makefile 文 件 进 行 编 译, 编 译 完 成 后 执 行 make install 命 令 即 可 安 装 make 命 令 涉 及 了 Linux 编 程 的 知 识, 第 5 章 会 有 介 绍 3.2.2 Apache 的 配 置 默 认 情 况 下 Apache 服 务 是 以 daemon 系 统 用 户 组 的 身 份 运 行 的, 所 以 要 先 将 当 前 用 户 加 入 到 daemon 组 中, 这 样 才 有 权 限 去 使 用 HTTP 服 务 [root@localhost ~]# usermod a G daemon `whoami` 然 后 就 是 Apache 最 重 要 的 配 置 文 件 httpd.conf, 这 个 文 件 默 认 保 存 在 /usr/local/apache2/ conf 下 其 中 的 DocumentRoot 项 为 默 认 网 站 主 目 录, 可 以 通 过 它 修 改 网 站 主 目 录 修 改 后 还 需 要 同 时 替 换 下 面 Directory 项 中 的 /usr/local/apache2/htdocs 为 修 改 后 的 主 目 录, 使 得 Apache 具 有 权 限 去 访 问 该 目 录 ServerName 项 为 服 务 器 名 称 以 及 端 口 号, 如 localhost:80, 可 以 通 过 它 修 改 服 务 器 名 称 默 认 ServerName 项 被 注 释 掉 了, 需 要 把 注 释 去 掉, 否 则 启 动 Apache 时 会 有 警 告 提 示 最 后 通 过 以 下 命 令 启 动 Apache 服 务, 若 将 下 面 命 令 中 的 start 替 换 为 stop, 则 可 以 停 止 运 行 Apache; 替 换 为 restart, 则 可 以 重 启 Apache: 44
LAMP 的 基 本 安 装 与 配 置 第 3 章 [root@localhost ~]# /usr/local/apache2/bin/apachectl start 3.3 MySQL MySQL 代 表 My Structured Query Language, 是 一 种 关 系 型 数 据 库 管 理 系 统 (Relational DataBase Management System,RDBMS), 最 初 由 瑞 典 的 MySQL AB 公 司 开 发,2008 年 MySQL AB 公 司 被 Sun 公 司 收 购, 成 为 Sun 的 子 公 司,Sun 也 因 此 拥 有 了 MySQL 大 部 分 代 码 库 的 版 权 MySQL 的 源 代 码 在 GPLv2 License 的 保 护 下 开 放, 分 为 Community Server 和 Enterprise Server 两 种 版 本,Enterprist Server 会 收 取 一 定 的 费 用 同 Apache 一 样,MySQL 也 是 跨 平 台 的, 甚 至 比 Apache 支 持 的 系 统 还 多, 如 Symbian MySQL 被 许 多 知 名 的 大 网 站 使 用, 如 Google Facebook Flickr Wikipedia YouTube 等, 同 时 由 于 PHP 同 MySQL 的 紧 密 联 系,MySQL + PHP 几 乎 成 为 了 标 准 配 置 3.3.1 MySQL 的 安 装 MySQL 的 安 装 过 程 是 LAMP 中 最 艰 辛 的, 不 仅 步 骤 繁 杂, 而 且 编 译 时 间 长 若 第 一 次 编 译 失 败, 可 以 试 着 再 编 译 一 次, 可 能 就 会 成 功 (1) 下 载 MySQL:http://dev.mysql.com/downloads/, 这 里 用 的 是 5.1.31 版 本 MySQL 的 编 译 稍 微 复 杂 一 些, 而 且 还 需 要 在 编 译 前 先 安 装 一 些 依 赖 的 软 件, 这 里 用 的 是 CentOS 源 里 的 软 件 (2) 通 过 软 件 源 安 装 依 赖 软 件 [root@localhost ~]# yum install gcc c++ libtool ncurses devel 值 得 注 意 的 是,libtool 在 MySQL 官 方 文 档 中 要 求 的 版 本 为 不 低 于 1.5.24, 所 以 安 装 之 前 务 必 先 检 查 一 下 软 件 源 中 的 版 本 是 否 符 合, 命 令 如 下 : [root@localhost ~]# yum info libtool less (3) 建 立 mysql 用 户 (user) 和 组 (group), 专 门 用 于 操 纵 MySQL [root@localhost ~]# groupadd mysql [root@localhost ~]# useradd g mysql mysql (4) 具 体 编 译 安 装 过 程 3 [root@localhost ~]# tar zxvf mysql 5.1.31.tar.gz [root@localhost ~]# cd mysql 5.1.31 [root@localhost mysql 5.1.31]# CFLAGS=" O3" CXX=gcc CXXFLAGS=" O3 \ > felide constructors fno exceptions fno rtti" \ >./configure prefix=/usr/local/mysql \ > enable assembler with mysqld ldflags= all static \ > with charset=utf8 提 示 \ 符 号 使 得 回 车 不 会 执 行 命 令, 而 让 用 户 在 新 的 一 行 继 续 输 入 余 下 的 命 令 别 被 这 行 吓 着, 仔 细 看 一 下 就 会 发 现 就 是 平 时 的./configure 的 加 强 版, 添 加 了 一 些 优 化 编 译 的 参 数 和 对 MySQL 本 身 的 设 置./configure 是 关 键 的 一 步, 如 果 成 功 就 会 看 到 以 下 提 示 : 45
Linux 体 系 结 构 与 程 序 设 计 MySQL has a Web site at http://www.mysql.com/ which carries details on the latest release, upcoming features, and other information to make your work or play with MySQL more productive. There you can also find information about mailing lists for MySQL discussion. Remember to check the platform specific part of the reference manual for hints about installing MySQL on your platform. Also have a look at the files in the Docs directory. Thank you for choosing MySQL! 现 在 可 以 放 心 地 安 装 了 : [root@localhost mysql 5.1.31]# make [root@localhost mysql 5.1.31]# make install 这 样 就 算 安 装 完 毕 了 3.3.2 MySQL 的 配 置 3 在 MySQL 源 码 中 的 support files 子 目 录 中 选 定 一 个 适 合 自 己 运 行 环 境 的 配 置 文 件 作 为 MySQL 配 置 文 件 的 基 础 : [root@localhost mysql 5.1.31]# cp support files/my medium.cnf /etc/my.cnf 现 在 需 要 修 改 MySQL 安 装 目 录 中 的 一 些 权 限 设 置, 将 /usr/local/mysql 目 录 中 所 有 文 件 的 owner 和 group 都 修 改 为 专 门 用 于 操 纵 MySQL 的 用 户 和 组 : 一 行 [root@localhost mysql 5.1.31]# cd /usr/local/mysql [root@localhost mysql]# chown R mysql. [root@localhost mysql]# chgrp R mysql. 然 后 修 改 刚 才 的 配 置 文 件 my.cnf, 注 释 skip federated 这 行, 在 [mysqld] 组 中 添 加 user = mysql 现 在 又 到 了 一 个 关 键 步 骤 初 始 化 MySQL 数 据 库 之 所 以 关 键, 因 为 和 前 面 执 行 configure 命 令 的 步 骤 一 样, 都 是 属 于 会 频 繁 出 错 的 地 方 [root@localhost mysql]# bin/mysql_install_db basedir=/usr/local/mysql user=mysql 很 可 能 会 得 到 找 不 到 某 个 文 件 的 错 误 提 示, 解 决 的 办 法 就 是 重 新 安 装 一 次 如 果 初 始 化 成 功, 则 会 看 到 下 面 的 文 字 : Installing MySQL system tables... OK Filling help tables... OK To start mysqld at boot time you have to copy support files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER! To do so, start the server, then issue the following commands: /usr/local/mysql/bin/mysqladmin u root password 'new password' /usr/local/mysql/bin/mysqladmin u root h HOSTNAME password 'new password' Alternatively you can run: /usr/local/mysql/bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. 46
LAMP 的 基 本 安 装 与 配 置 第 3 章 See the manual for more instructions. You can start the MySQL daemon with: cd /usr/local/mysql ; /usr/local/mysql/bin/mysqld_safe & You can test the MySQL daemon with mysql test run.pl cd /usr/local/mysql/mysql test ; perl mysql test run.pl Please report any problems with the /usr/local/mysql/scripts/mysqlbug script! The latest information about MySQL is available at http://www.mysql.com/ Support MySQL by buying support/licenses from http://shop.mysql.com/ 为 了 安 全 性 的 考 虑, 再 修 改 一 次 权 限 : [root@localhost mysql]# chown R root. [root@localhost mysql]# chown R mysql var 现 在 需 要 验 证 一 下 MySQL 是 否 可 以 正 常 使 用, 先 启 动 MySQL 服 务 器, 再 查 看 它 的 版 本 [root@localhost mysql]# bin/mysqld_safe & [root@localhost mysql]# bin/mysqladmin version 如 果 得 到 类 似 下 面 的 输 出, 则 MySQL 已 经 可 以 正 常 使 用 了 bin/mysqladmin Ver 8.42 Distrib 5.1.31, for pc linux gnu on i686 Copyright 2000 2008 MySQL AB, 2008 Sun Microsystems, Inc. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license Server version 5.1.31 log Protocol version 10 Connection Localhost via UNIX socket UNIX socket /tmp/mysql.sock Uptime: 1 min 22 sec Threads: 1 Questions: 1 Slow queries: 0 Opens: 14 Flush tables: 1 Open tables: 8 Queries per second avg: 0.12 现 在 需 要 提 高 一 下 MySQL 的 安 全 性,MySQL 自 带 了 一 个 很 好 用 的 小 工 具, 可 以 通 过 向 导 的 形 式 来 进 行 安 全 的 初 始 化, 只 需 要 回 答 Yes 或 No 即 可, 很 方 便 注 意, 在 进 行 此 操 作 前 必 须 先 启 动 MySQL 启 动 该 工 具 的 命 令 如 下 : [root@localhost mysql]# bin/mysql_secure_installation 除 了 用 刚 才 的 方 法 启 动 MySQL 以 外, 还 有 一 种 方 法 : [root@localhost mysql]# share/mysql/mysql.server start 推 荐 用 这 种 方 法 来 启 动, 这 样 就 和 Apache 的 启 动 方 式 很 相 似 了, 用 起 来 比 较 统 一 3 3.4 PHP PHP 是 一 种 用 来 编 写 动 态 网 页 的 脚 本 语 言, 由 PHP Group 开 发 PHP 是 在 PHP License 保 护 下 发 布 的 自 由 软 件, 同 样 也 是 跨 平 台 软 件 现 在 将 要 安 装 的 是 供 HTTP Server 解 析 PHP 代 码 用 的 3.4.1 PHP 的 安 装 先 下 载 PHP:http://www.php.net/downloads.php, 这 里 用 的 是 5.2.9 版 本 PHP 安 装 较 简 单, 只 是 依 赖 有 点 多 先 安 装 依 赖 软 件 flex libxml2 devel zlib devel autoconf [root@localhost ~]# yum install flex libxml2 devel zlib devel autoconf 其 中 flex 需 要 不 低 于 2.5.4 的 版 本 还 有 一 个 依 赖 是 bison,php 官 方 文 档 里 写 的 版 本 需 求 是 47
Linux 体 系 结 构 与 程 序 设 计 3 1.28(preferred),1.35,or 1.75, 于 是 笔 者 决 定 编 译 1.28 版 下 载 Bison 源 码 :http://www.gnu.org/ software/ bison/ 安 装 过 程 很 简 单 : [root@localhost ~]# tar zxvf bison 1.28.tar.gz [root@localhost ~]# cd bison 1.28 [root@localhost bison 1.28]#./configure prefix=/usr/local [root@localhost bison 1.28]# make [root@localhost bison 1.28]# make install 下 面 是 PHP 的 安 装 : [root@localhost ~]# tar jxvf php 5.2.9.tar.bz2 [root@localhost ~]# cd php 5.2.9 [root@localhost php 5.2.9]#./configure with apxs2=/usr/local/apache2/bin/apxs \ > with mysql=/usr/local/mysql 执 行 configure 成 功 后 会 显 示 : + + License: This software is subject to the PHP License, available in this distribution in the file LICENSE. By continuing this installation process, you are bound by the terms of this license agreement. If you do not agree with the terms of this license, you must abort the installation process at this point. + + Thank you for using PHP. 接 着 是 编 译 : [root@localhost php 5.2.9]# make 成 功 会 显 示 : Build complete. Don't forget to run 'make test'. 然 后 是 安 装 : [root@localhost php 5.2.9]# make install 这 样 就 完 成 了 PHP 的 安 装 3.4.2 PHP 的 配 置 和 MySQL 一 样, 先 把 默 认 的 配 置 文 件 拷 贝 过 去 : [root@localhost php 5.2.9]# cp php.ini dist /usr/local/lib/php.ini 然 后 来 看 Apache 的 配 置 文 件 httpd.conf 检 查 其 中 是 否 有 LoadModule php5_module modules/libphp5.so 这 一 行, 若 没 有, 则 需 要 手 动 添 加, 否 则 不 能 解 析 PHP 文 件 然 后 在 <IfModule mime_module> 语 句 块 中 添 加 以 下 配 置 : AddType application/x httpd php.php.phtml AddType application/x httpd php source.phps 3.5 安 装 测 试 上 述 安 装 操 作 完 成 后, 需 要 进 行 一 个 完 整 的 测 试, 以 检 测 各 个 软 件 是 否 已 经 可 以 正 常 工 作 48
LAMP 的 基 本 安 装 与 配 置 第 3 章 这 个 测 试 的 主 要 内 容 是 写 一 个 可 以 访 问 MySQL 数 据 库 的 PHP 程 序, 将 它 架 设 在 Apache 服 务 器 上 面 ( 即 将 写 好 的 PHP 文 件 放 到 网 站 根 目 录 中 ), 具 体 操 作 如 下 : (1) 新 建 一 个 叫 做 foo.php 的 文 件, 写 入 以 下 内 容 : <?php $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) { } die('could not connect: '. mysql_error()); echo 'Connected successfully'; mysql_close($link);?> 注 意 将 上 面 代 码 中 的 mysql_user 和 mysql_password 改 成 MySQL 的 实 际 用 户 名 和 对 应 的 密 码 (2) 把 这 个 PHP 文 件 放 到 Apache 默 认 的 网 站 根 目 录 下 : [root@localhost tmp]# mv foo.php /var/www 如 果 以 前 修 改 过 网 站 根 目 录 的 路 径 ( 通 过 Apache 配 置 文 件 修 改 ), 请 相 应 调 整 (3) 打 开 Apache 和 MySQL 的 服 务 器 : [root@localhost tmp]# /usr/local/apache2/bin/apachectl start [root@localhost tmp]# /usr/local/mysql/share/mysql/mysql.server start 现 在 来 实 际 测 试 一 下 刚 才 那 个 PHP 文 件 是 否 可 以 正 常 执 行, 打 开 浏 览 器, 在 地 址 栏 中 输 入 localhost/foo.php, 如 果 安 装 成 功, 并 且 按 照 本 书 所 述 操 作, 浏 览 器 页 面 上 将 会 显 示 如 下 信 息 : Connected successfully 本 章 小 结 LAMP 的 基 本 安 装 与 配 置 就 算 告 一 段 落 了, 不 过 由 于 知 识 有 限, 上 面 的 方 法 也 不 一 定 适 用 于 所 有 环 境, 最 好 还 是 先 看 一 下 官 方 安 装 文 档 和./configure help, 然 后 根 据 自 己 的 环 境 修 改 相 应 的 参 数 3 49
第 4 章 远 程 定 期 自 动 增 量 备 份 4 远 程 定 期 自 动 增 量 备 份 知 识 点 数 据 备 份 shell 脚 本 语 法 基 础 常 用 的 备 份 命 令 一 个 远 程 定 期 自 动 增 量 备 份 的 实 例 对 于 一 个 企 业 来 说, 数 据 就 是 它 的 财 产 而 硬 件 的 损 坏 人 为 的 误 操 作 和 黑 客 侵 入 等 都 会 造 成 数 据 丢 失 或 损 坏, 这 都 是 每 个 企 业 所 需 要 避 免 的, 其 中 最 常 用 的 方 法 就 是 进 行 数 据 备 份 数 据 备 份 一 般 分 为 两 类 : 完 全 备 份 和 部 分 备 份 部 分 备 份 通 常 又 分 为 差 异 备 份 和 增 量 备 份 本 章 首 先 介 绍 shell 脚 本 的 基 本 语 法, 以 便 读 者 理 解 本 章 介 绍 的 自 动 增 量 备 份 实 例 本 章 旨 在 通 过 一 个 适 合 中 小 型 企 业 的 自 动 增 量 备 份 案 例, 让 读 者 了 解 Linux 下 shell 脚 本 的 基 本 语 法 及 其 作 用 因 此 无 论 数 据 备 份 还 是 shell 脚 本 使 用 的 相 关 知 识 都 只 是 浅 尝 辄 止, 若 读 者 想 要 深 入 学 习, 请 参 考 相 关 资 料 4.1 shell 脚 本 的 基 本 语 法 这 里 讲 解 的 只 是 下 面 的 综 合 实 例 中 需 要 用 到 的 一 些 简 单 语 法, 具 体 的 shell 脚 本 编 程 请 参 阅 Mendel Cooper 的 Advanced Bash Scripting Guide 一 书, 该 书 可 以 在 网 址 : http://www.tldp.org/ldp/abs/ html/index.html 上 免 费 阅 读 首 先,shell 脚 本 是 一 个 纯 文 本 文 件, 以 sh 作 为 文 件 的 扩 展 名, 所 以 可 以 在 任 何 编 辑 器 下 完 成 脚 本 的 编 写, 读 者 可 以 通 过 Linux 自 带 的 gedit 或 Vim 编 辑 器 来 编 写 shell 脚 本 提 示 gedit 与 Windows 下 的 记 事 本 操 作 类 似, 而 Vim 的 操 作 将 在 5.2 节 介 绍
远 程 定 期 自 动 增 量 备 份 第 4 章 通 常 shell 脚 本 首 行 代 码 如 下 : #!/bin/bash 这 表 明 了 使 用 哪 个 程 序 来 解 释 这 个 脚 本 可 以 省 略 这 一 行, 但 脚 本 的 运 行 方 式 将 不 同, 下 面 将 会 解 释 如 果 一 行 代 码 的 开 头 是 #, 则 代 表 这 行 是 注 释 在 shell 脚 本 里 可 以 调 用 Linux 下 的 命 令 进 行 批 处 理, 还 可 以 加 上 一 些 变 量 定 义 选 择 或 循 环 结 构 等, 有 了 这 些, 脚 本 程 序 就 会 变 得 很 实 用 可 以 用 等 号 为 一 个 变 量 赋 值,shell 脚 本 里 没 有 变 量 类 型, 所 以 直 接 写 上 变 量 名 即 可, 如 下 面 脚 本 中 的 : filename=`date "+%F"` 这 行 代 码 表 示 将 等 号 右 边 的 值 赋 给 filename 变 量 再 来 看 刚 才 那 句 等 号 的 右 边,date 命 令 两 边 有 ` 这 样 的 符 号 ( 注 意 这 个 符 号 的 按 键 是 在 键 盘 上 Esc 键 的 下 面, 数 字 1 左 边 ) 既 然 是 给 变 量 赋 值, 自 然 等 号 右 边 就 需 要 一 个 值, 这 个 符 号 则 是 执 行 包 含 在 它 中 间 的 命 令 并 将 命 令 的 输 出 作 为 值 的 意 思, " 内 的 内 容 则 表 示 date 命 令 的 参 数, 代 表 date 显 示 的 格 式 整 行 命 令 就 是 执 行 date 命 令 再 赋 值 的 意 思, 至 于 date 执 行 后 的 结 果, 可 参 见 man page 现 在 已 经 给 变 量 赋 了 值 在 变 量 名 前 面 加 上 $ 符 号 就 可 以 调 用 变 量 了, 如 : echo $filename 但 有 时 还 会 遇 到 变 量 与 常 量 组 合 使 用 的 情 况, 如 下 面 一 行 脚 本 : tar T backup_list zcvf ${filename}.bak.tar.gz 变 量 名 最 外 面 需 要 加 花 括 号, 如 果 不 加, 就 会 是 这 样 : tar T backup_list zcvf $filename.bak.tar.gz 这 样 就 会 将 新 建 的 压 缩 文 件 命 名 为 变 量 filename.bak.tar.gz 的 值, 而 显 然 这 里 不 存 在 filename.bak.tar.gz 这 个 变 量, 这 不 是 原 本 想 要 的 结 果 于 是, 为 了 区 分 哪 部 分 是 变 量 名, 哪 部 分 是 常 量 名, 就 需 要 用 花 括 号 将 正 确 的 变 量 名 括 起 来 编 写 完 shell 脚 本 后, 习 惯 添 加 下 面 一 行 命 令 在 最 后, 标 识 脚 本 程 序 退 出 的 状 态 : exit 0 当 然, 这 一 行 不 是 必 需 的 但 就 像 C 语 言 中 习 惯 在 main 函 数 的 最 后 加 上 return 0; 一 样, 写 上 这 样 一 行 是 一 个 很 好 的 习 惯, 同 时 也 可 以 作 为 与 其 他 脚 本 配 合 使 用 的 接 口 全 部 写 完 之 后 就 需 要 执 行 脚 本 了, 这 里 有 两 种 执 行 方 式, 一 种 是 使 用 sh 命 令, 如 果 在 首 行 没 有 添 加 #!/bin/bash 则 使 用 这 种 方 式, 如 : [root@localhost /tmp]# sh auto_backup.sh 另 一 种 方 式 是 先 用 chmod 命 令 给 脚 本 文 件 加 上 可 执 行 权 限, 再 直 接 运 行, 如 : [root@localhost /tmp]# chmod +x auto_backup.sh [root@localhost /tmp]#./auto_backup.sh 4 4.2 数 据 备 份 简 介 作 为 一 个 合 格 的 系 统 管 理 员, 最 基 本 的 工 作 就 是 定 期 备 份 数 据 备 份 可 以 带 来 很 多 好 处, 最 明 51
Linux 体 系 结 构 与 程 序 设 计 显 的 就 是 在 系 统 发 生 某 种 灾 难 之 后 可 以 用 最 低 的 成 本 恢 复 到 以 前 的 状 态 所 以 养 成 定 期 备 份 是 一 个 很 好 的 习 惯 4.2.1 数 据 备 份 设 备 要 了 解 数 据 备 份, 首 先 要 了 解 数 据 备 份 的 存 储 介 质 常 见 的 数 据 备 份 设 备 可 以 是 个 人 计 算 机 常 用 的 可 擦 写 式 光 盘, 也 可 以 是 中 小 型 企 业 很 常 用 的 磁 带 机, 以 及 本 章 将 要 介 绍 的 基 于 FTP 服 务 器 的 远 程 备 份 系 统 4.2.2 数 据 备 份 方 案 4 数 据 备 份 一 般 分 为 两 类 : 完 全 备 份 和 部 分 备 份 部 分 备 份 通 常 又 分 为 差 异 备 份 和 增 量 备 份 对 于 Linux 来 说, 完 全 备 份 就 是 将 根 目 录 / 里 所 有 的 数 据 都 备 份 下 来, 包 括 操 作 系 统 和 所 有 应 用 程 序 生 成 的 数 据 这 适 用 于 刚 刚 开 发 完 成 的 系 统, 因 为 这 时 备 份 的 数 据 是 最 原 始 的, 也 是 最 干 净 的 但 不 能 经 常 执 行, 因 为 如 果 每 天 进 行 这 种 完 全 备 份, 则 在 备 份 数 据 中 会 有 大 量 内 容 是 完 全 重 复 的, 这 些 重 复 的 数 据 占 用 了 大 量 的 空 间, 对 于 中 小 型 系 统 太 耗 资 源, 对 于 用 户 来 说 就 意 味 着 增 加 成 本 增 量 备 份 是 指 每 次 备 份 的 数 据 只 是 相 当 于 上 一 次 备 份 后 增 加 的 和 修 改 过 的 数 据, 注 意 是 相 对 上 一 次 备 份 而 增 加 或 修 改 过 的 数 据 这 种 备 份 的 优 点 很 明 显 : 没 有 重 复 的 备 份 数 据, 节 省 了 资 源, 又 缩 短 了 备 份 时 间 它 的 缺 点 在 于 当 发 生 灾 难 时, 恢 复 数 据 比 较 麻 烦 举 例 来 说, 如 果 系 统 在 星 期 四 的 早 晨 发 生 故 障, 那 么 现 在 就 需 要 将 系 统 恢 复 到 星 期 三 晚 上 的 状 态 这 时, 管 理 员 需 要 找 出 星 期 一 的 完 全 备 份 进 行 系 统 恢 复, 然 后 再 找 出 星 期 二 的 备 份 来 恢 复 星 期 二 的 数 据, 最 后 再 找 出 星 期 三 的 备 份 来 恢 复 星 期 三 的 数 据 很 明 显, 这 比 完 全 备 份 要 麻 烦 得 多 另 外, 在 这 种 备 份 下, 各 个 备 份 单 元 间 的 关 系 就 像 链 子 一 样, 一 环 套 一 环, 其 中 任 何 一 个 单 元 出 了 问 题, 都 会 导 致 整 条 链 子 脱 节 差 异 备 份 是 指 每 次 备 份 的 数 据 是 相 对 于 上 一 次 完 全 备 份 之 后 新 增 加 的 和 修 改 过 的 数 据, 注 意 这 是 相 对 上 一 次 完 全 备 份 之 后 新 增 加 或 修 改 过 的 数 据, 而 并 不 一 定 是 相 对 上 一 次 备 份 管 理 员 先 在 星 期 一 进 行 一 次 系 统 完 全 备 份 ; 然 后 在 接 下 来 的 几 天 里, 再 将 当 天 所 有 与 星 期 一 不 同 的 数 据 ( 增 加 的 或 修 改 的 ) 备 份 到 服 务 器 上 差 异 备 份 无 需 每 天 都 做 系 统 完 全 备 份, 因 此 备 份 所 需 时 间 短, 并 节 省 空 间, 它 的 灾 难 恢 复 也 很 方 便, 系 统 管 理 员 只 需 两 个 备 份, 即 系 统 完 全 备 份 和 发 生 灾 难 前 一 天 的 备 份, 就 可 以 将 系 统 完 全 恢 复 上 述 几 种 备 份 方 案 各 有 优 点, 可 以 根 据 需 要 选 择 合 适 的 方 案 配 合 使 用 4.3 远 程 定 期 自 动 增 量 备 份 在 了 解 了 备 份 的 重 要 性 之 后, 作 为 一 个 合 格 的 系 统 管 理 员, 需 要 学 会 使 用 一 些 聪 明 的 办 法 来 完 成 工 作 那 就 是 系 统 管 理 员 的 另 一 个 利 器 shell 脚 本 本 节 将 会 全 面 讲 解 如 何 实 现 远 程 定 期 自 动 增 量 备 份, 包 括 实 现 定 期 功 能 的 crontab 命 令 实 现 增 量 功 能 的 find 命 令 实 现 压 缩 功 能 的 tar 命 令 和 实 现 远 程 备 份 功 能 的 ftp 命 令 在 本 节 的 最 后, 还 会 实 现 一 个 备 份 脚 本 的 实 例, 以 便 大 家 理 解 52
远 程 定 期 自 动 增 量 备 份 第 4 章 4.3.1 定 期 功 能 crontab 实 现 定 期 功 能 的 原 理 很 简 单, 就 是 调 用 crontab 命 令, 给 系 统 添 加 一 个 需 要 定 期 执 行 的 任 务 而 这 个 任 务 就 可 以 是 执 行 备 份 的 shell 脚 本 完 整 的 命 令 用 法 请 到 2.7.4 节 中 查 看 4.3.2 增 量 功 能 find 增 量 备 份 需 要 先 找 出 最 近 修 改 过 的 文 件, 然 后 只 备 份 这 些 文 件 即 可 这 样 花 在 备 份 上 的 时 间 就 会 缩 短 很 多 目 的 既 然 需 要 查 找 操 作, 那 么 就 需 要 调 用 find 命 令 这 里 可 以 结 合 find 的 一 些 参 数 来 达 到 筛 选 的 [root@localhost /]# find / mtime 0! type d > /tmp/backup_list 2> /dev/null 上 面 的 语 法 很 简 单, mtime 0 找 出 在 当 天 修 改 过 的 所 有 文 件,! type d 指 定 要 找 的 是 非 目 录 文 件, 最 后 把 查 找 结 果 重 定 向 到 /tmp/backup_list 这 个 文 件 中 去 还 可 以 根 据 实 际 情 况 再 进 行 一 些 其 他 处 理 4.3.3 压 缩 功 能 tar 由 于 现 实 的 种 种 因 素, 可 能 不 会 有 足 够 多 的 存 储 空 间 来 存 放 备 份 数 据, 这 时 选 择 压 缩 备 份 会 是 一 个 好 办 法 如 果 备 份 数 据 还 要 通 过 网 络 传 输, 压 缩 就 更 有 必 要 了, 还 可 以 节 约 传 输 时 间 压 缩 的 另 一 个 好 处 是 把 所 有 东 西 都 打 包 到 一 个 文 件 中, 这 样 比 较 便 于 管 理 对 于 tar 的 语 法, 第 2 章 已 经 讲 解 得 很 详 细 了,tar 的 使 用 也 比 较 简 单, 可 以 参 考 本 节 最 后 的 实 例 4.3.4 远 程 备 份 ftp 当 完 成 了 前 面 几 个 步 骤 以 后, 就 已 经 得 到 一 个 打 包 且 压 缩 好 的 文 件, 这 时 需 要 把 这 个 文 件 放 到 远 程 的 某 个 FTP 服 务 器 上 去, 可 以 通 过 ftp 来 完 成 这 个 工 作 使 用 ftp 的 第 一 步 是 登 录, 在 终 端 下 输 入 ftp n 命 令,bash 默 认 的 提 示 符 会 变 为 ftp>, 等 待 用 户 输 入 命 令, 如 下 : 4 [root@localhost tmp]# ftp n ftp> 这 里 的 n 选 项 的 作 用 是 不 从.netrc 文 件 读 取 ftp 的 相 关 配 置,.netrc 文 件 是 用 来 自 动 配 置 ftp 选 项 的, 比 如 需 要 经 常 登 录 到 同 一 个 服 务 器, 使 用 同 一 个 用 户 名 和 密 码, 则 可 以 把 相 应 选 项 写 到.netrc 文 件 里, 这 样 下 次 输 入 ftp 命 令 的 时 候 就 会 自 动 读 取 这 个 配 置 文 件 的 内 容 这 里 为 了 避 免 干 扰, 加 上 了 n 选 项 使 用 open 命 令 来 登 录 远 程 服 务 器, 命 令 名 后 跟 上 服 务 器 的 IP 地 址, 如 果 不 需 要 指 定 端 口 号 保 持 默 认 即 可 ; 如 果 需 要 指 定 端 口 号, 可 以 加 在 后 面, 如 下 : ftp> open 192.168.6.121 6789 这 时 应 该 会 提 示 输 入 用 户 名 和 密 码, 输 入 完 以 后 又 会 回 到 刚 才 的 提 示 符, 可 以 输 入 help 命 令 查 看 可 用 的 命 令 : 53
Linux 体 系 结 构 与 程 序 设 计 ftp> help help 后 面 跟 特 定 的 命 令 来 查 看 该 命 令 的 功 能 : ftp> help ls 输 入 bye 即 退 出 ftp 上 面 简 单 介 绍 了 使 用 ftp 命 令 的 过 程, 但 现 在 需 要 实 现 的 是 自 动 上 传, 则 必 须 把 上 面 的 操 作 指 令 写 到 脚 本 里 面 具 体 操 作 需 要 涉 及 shell 语 法 中 的 Here Documents( 详 情 可 参 见 man bash 的 Here Documents 部 分 ),Here Documents 属 于 第 2 章 讲 过 的 重 定 向 中 的 一 种, 格 式 如 下 : << [delimiter]... [delimiter] 将 上 面 的 [delimiter] 替 换 成 任 何 觉 得 好 听 好 记 的 名 字, 如 GFW FUNNYSHELL 等 上 下 两 个 [delimiter] 必 须 一 致, 作 为 Here Documents 的 边 界 限 定 符, 一 般 使 用 大 写, 这 样 可 以 和 输 入 的 命 令 进 行 区 分 中 间 的 省 略 号 可 以 是 任 何 需 要 实 现 的 操 作, 这 里 需 要 把 刚 才 用 在 ftp 下 的 命 令 都 写 进 去, 这 样 就 可 以 实 现 批 处 理 例 如 : ftp n<< ALIST open 192.168.6.121 6789 user xiaolan 123456 ls bye ALIST 4.3.5 远 程 定 期 自 动 增 量 备 份 综 合 实 例 # 这 里 分 别 是 用 户 名 和 密 码 有 了 前 面 的 基 础, 这 里 就 把 它 们 都 整 合 起 来, 通 过 一 个 shell 脚 本 文 件 来 完 成 #!/bin/bash # 一 个 远 程 定 期 自 动 增 量 备 份 的 综 合 实 例 4 # 找 出 需 要 备 份 的 文 件 find / mtime 0! type d > /tmp/backup_list 2> /dev/null # 压 缩 存 储 备 份 文 件 # 这 里 使 用 date 命 令 来 以 当 天 的 日 期 作 为 压 缩 好 的 文 件 的 文 件 名 cd /tmp # 进 入 备 份 存 储 目 录 filename=`data "+%F"` # 得 到 当 天 日 期 并 赋 值 给 变 量 tar T backup_list zcvf ${filename}.bak.tar.gz # 将 备 份 文 件 传 送 到 远 程 服 务 器 上 存 储 ftp n<< ALIST open 192.168.6.121 6789 user xiaolan 123456 binary # 设 定 以 二 进 制 方 式 传 送 文 件 cd /home/xiaolan/backup # 进 入 远 程 服 务 器 的 备 份 目 录 lcd /tmp # 进 入 当 前 计 算 机 中 存 储 备 份 文 件 的 目 录 put *.bak.tar.gz # 上 传 到 远 程 服 务 器 bye ALIST 54
远 程 定 期 自 动 增 量 备 份 第 4 章 # 删 除 备 份 文 件 rm f ${filename}.bak.tar.gz exit 0 把 这 个 脚 本 取 名 为 auto_backup.sh, 加 上 可 执 行 权 限, 放 到 /usr/local/bin 目 录 中, 然 后 使 用 crontab 命 令 让 系 统 每 周 的 星 期 天 定 期 执 行 auto_backup.sh 使 用 crontab 命 令 后, 在 Vim 中 添 加 如 下 指 令 : # m h dom mon dow command * * * * 0 /usr/local/bin/auto_backup.sh 现 在 只 要 到 了 每 周 的 星 期 天, 系 统 就 会 自 动 运 行 这 个 备 份 脚 本, 将 增 量 备 份 的 文 件 上 传 到 远 程 服 务 器 中 本 章 小 结 crontab 可 以 用 来 定 期 执 行 某 个 命 令,find 可 以 查 找 满 足 相 应 条 件 的 文 件,tar 可 以 将 多 个 文 件 打 包 并 压 缩 到 一 个 文 件 中,ftp 作 为 一 个 客 户 端 可 以 与 服 务 器 间 进 行 FTP 的 通 信 这 里 只 是 简 单 介 绍 了 实 现 备 份 的 一 个 过 程, 其 中 肯 定 会 有 很 多 需 要 根 据 实 际 情 况 修 改 的 地 方, 关 键 就 在 于 对 于 shell 脚 本 的 融 会 贯 通 希 望 读 者 通 过 这 一 shell 入 门 章 节, 对 shell 脚 本 有 一 个 初 步 的 认 识 本 章 对 shell 语 法 只 是 浅 尝 辄 止,shell 脚 本 还 有 很 多 强 大 的 功 能 没 有 介 绍, 希 望 读 者 能 够 在 书 外 深 入 了 解 4 55