【解决】浏览器自动跳转到网址 http://10.198.1.1/rd.htm 等类似地址

这些天上网烦死了, 每次打开网页总要跳转到http://10.198.1.1/rd.htm之类的地址, 还让不让人上网了, 每次要多点一点, 今天终于受不了了,  5分钟通过Redirector插件把这个问题完美解决.

解决自动跳转到http://10.198.1.1/rd.htm之类地址

其实解决方法很简单, 就是加个重定向规则, 搞IT的很容易理解,当然下面的操作非IT人员也能操作, 不用担心你是非IT工作者.

Chrome 解决方法

添加 Redirector 插件就可以了.

插件使用方法在插件介绍页有说明, 如下图:

chrome-redirector 要对付我们的问题, 只需要添加下面的规则即可:

10.198.1.1-redirector当然你跳转的地址可能不是10.198.1.1 开头的, 改一下这几个数字即可.

^http://10\.198\.1\.1/.*&ld=(.*)://(.*) $1://$2

规则就不解释了, 越解释越绕.

 

 

 

Teracopy 与 Directory Opus 整合

本文将深度整合 Teracopy 和 Directory Opus ,实现Directory Opus 里面的所有剪切、复制、粘贴操作均使用 Teracopy 来完成。

一、程序简介

1. Teracopy 简介

Teracopy 是一个专用于文件的复制粘贴功能的小软件,这个小软件可以加速复制粘贴。

2. Directory Opus 简介

Directory Opus 则是一款比肩 Total Commander 的文件管理器。 双窗口操作。

二、整合 Teracopy 和 Directory Opus

下面的操作均在 Teracopy 和 Directory Opus 都已安装好的前提下进行,且全部操作在 Directory Opus 中完成。

1. 在Directory Opus工具栏中添加 Teracopy 的 移动 和 复制 按钮

PS:工具栏按钮添加方法如下:在工具栏点击右键 —— 自定义(U)…  —— 复制按钮代码 —— 在工具栏点击右键 —— 粘贴。

1)复制按钮的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<usercommand backcol="none" textcol="none">
<label>TeraCopy_CopyFile</label>
<tip>Copy files with TeraCopy</tip>
<icon1>C:\Program Files\TeraCopy\TeraCopy.exe,1</icon1>
<function type="normal">
<instruction>&quot;C:\Program Files\TeraCopy\TeraCopy.exe&quot; Copy *{allfilepath|filem} {destpath}</instruction>
</function>
</usercommand>

2)移动按钮的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<usercommand backcol="none" textcol="none">
<label>TeraCopy_MoveFile</label>
<tip>Move files with TeraCopy</tip>
<icon1>C:\Program Files\TeraCopy\TeraCopy.exe,2</icon1>
<function type="normal">
<instruction>&quot;C:\Program Files\TeraCopy\TeraCopy.exe&quot; Move *{allfilepath|filem} {destpath}</instruction>
</function>
</usercommand>

2. 设置拖动中的复制和移动

1)拖动 对应操作 复制

进入到 设置 —— 文件类型(F)… 选择 “所有文件与文件夹” —— 编辑 —— 事件 —— 拖放 —— 编辑 ,在文本框中填入以下内容:

"C:\Program Files\TeraCopy\TeraCopy.exe" Copy *{allfilepath$|filem} {destpath}

然后一路确定返回就行了。

2)shift + 拖动 对应操作 移动

进入到 设置 —— 文件类型(F)… 选择 “所有文件与文件夹” —— 编辑 —— 事件 —— shift + 拖放 —— 编辑 ,在文本框中填入以下内容:

"C:\Program Files\TeraCopy\TeraCopy.exe" Move *{allfilepath$|filem} {destpath}

然后一路确定返回就行了。

此如还可以将命令交换一下,那就会变成 拖动对应移动操作,shift+拖动对应复制操作。

3. 快捷键修改

1) 复制快捷键

在1中我们建立了按钮,现在进行以下两个操作:

a)在工具栏点击右键 —— 自定义(U)… 在 Teracopy的复制按钮上点击右键 —— 编辑 —— 快捷键 —— Ctrl+C —— 确定 ,这时会提示冲突,点覆盖(记不太清了,反正是这个意思)。

b)进入到 设置 —— 自定义工具栏(C)… —— 快捷键 —— 取消勾选 Ctrl+C 快捷键 —— 确定。

2) 移动快捷键

在1中我们建立了按钮,现在进行以下两个操作:

a)在工具栏点击右键 —— 自定义(U)… 在 Teracopy的移动按钮上点击右键 —— 编辑 —— 快捷键 —— Ctrl+X —— 确定 ,这时会提示冲突,点覆盖(记不太清了,反正是这个意思)。

b)进入到 设置 —— 自定义工具栏(C)… —— 快捷键 —— 取消勾选 Ctrl+X 快捷键 —— 确定。

OK,这样就可以了。

三、参考资料

虚拟化技术概览

本篇文章所有资料均收集自网上,本文仅做了一下梳理和汇总。本文首先介绍了虚拟化技术:全虚拟化和半虚拟化,然后介绍了KVM、Xen、Hyper-V、VMWARE EXSI的原理和架构,接着重点对KVM和Xen做了比较,并对两者的未来发展提供了一些业界人士的观点,最后对Google、Amazon、IBM、Microsoft的云计算产品进行了介绍。

一、虚拟化技术:全虚拟化、半虚拟化

1. 全虚拟化(Full Virtualization)

全虚拟化也成为原始虚拟化技术,该模型使用虚拟机协调guest操作系统和原始硬件,VMM在guest操作系统和裸硬件之间用于工作协调,一些受保护指令必须由Hypervisor(虚拟机管理程序)来捕获处理。


全虚拟化模型

全虚拟化模型

全虚拟化的运行速度要快于硬件模拟,但是性能方面不如裸机,因为Hypervisor需要占用一些资源

2. 半虚拟化(Para Virtualization)

半虚拟化是另一种类似于全虚拟化的技术,它使用Hypervisor分享存取底层的硬件,但是它的guest操作系统集成了虚拟化方面的代码。该方法无需重新编译或引起陷阱,因为操作系统自身能够与虚拟进程进行很好的协作。


半虚拟化模型

半虚拟化模型

半虚拟化需要guest操作系统做一些修改,使guest操作系统意识到自己是处于虚拟化环境的,但是半虚拟化提供了与原操作系统相近的性能。

二、KVM、Xen、Hyper-V、VMware EXSI原理和架构

1. KVM

KVM全称是Kernel-based Virtual Machine,即基于内核的虚拟机。

KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。

KVM虚拟化平台架构

KVM虚拟化平台架构

KVM 是一个独特的管理程序,通过将 KVM 作为一个内核模块实现,在虚拟环境下 Linux 内核集成管理程序将其作为一个可加载的模块可以简化管理和提升性能。在这种模式下,每个虚拟机都是一个常规的 Linux 进程,通过 Linux 调度程序进行调度。

2. Xen

Xen 是第一类运行再裸机上的虚拟化管理程序(Hypervisor)。它支持全虚拟化和半虚拟化,Xen支持hypervisor和虚拟机互相通 讯,而且提供在所有Linux版本上的免费产品,包括Red Hat Enterprise Linux和SUSE Linux Enterprise Server。Xen最重要的优势在于半虚拟化,此外未经修改的操作系统也可以直接在xen上运行(如Windows),能让虚拟机有效运行而不需要仿 真,因此虚拟机能感知到hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。

1)XEN 的发展与现状

XEN 最初是作为剑桥大学的一个项目,目前 XEN.ORG 社区在负责它的开发及维护,它已经在开源社区中得到了极大的发展。XEN 是一种直接运行在硬件上一层软件,它可以让电脑硬件上同时跑多个用户的操作系统。由于对 x86, x86-64, Itanium, Power PC, 和 ARM 这些处理器的支持,所以 XEN 管理工具可以支持的操作系统有 Linux, NetBSD,FreeBSD,Solaris, Windows 和其他一些运行在 XEN 上的正常的操作系统。如下图所示 XEN 在系统中的位置:

图 1. XEN 在系统的位置

XEN 在系统的位置

Xen 目前具有以下几种产品:

  • Xen Hypervisor —— 后面会详细讲解,在此不作赘述。会导致转换有问题;
  • XCI —— 种嵌入式管理工具,基于 Xen Hypervisor 的基础之上修改而来,相对于标准的 Xen Hypervisor,它使用的库更小,目前主要用在笔记本以及一些移动设备上,可以使用 Intel 或者 AMD 的架构;
  • Xen Cloud Platform —— 目前它为 ISVs 和服务提供商提供了一套基于强大的管理栈的云架构平台,这个栈是基于开放的标准 API;
  • 还有一些 Xen.org 上的项目,再此就不一一列举了。

2)XEN 体系结构

图 3. XEN 体系结构图

XEN 体系结构图

一个 XEN 虚拟机环境主要由以下几部分组成:

  • XEN Hypervisor;
  • Domain 0 —— Domain Management and Control(XEN DM&C);
  • Domain U Guest(Dom U)
    1. PV Guest
    2. HVM Guest

下图显示除了各部分之间的关系:

图 4. Xen 三部分组成之间关系图

Xen 三部分组成之间关系图

  • XEN Hypervisor :

XEN Hypervisor 是介于操作系统和硬件之间的一个软件描述层。它负责在各个虚拟机之间进行 CPU 调度和内存分配。XEN Hypervisor 不仅抽象出虚拟机的硬件,同时还控制着各个虚拟机的执行。XEN Hypervisor 不会处理网络、存储设备、视频以及其他 I/O.

  • Domain 0:

Domain 0 是一个修改过的 Linux kernel,是唯一运行在 Xen Hypervisor 之上的虚拟机,它拥有访问物理 I/O 资源的权限,同时和系统上运行的其他虚拟机进行交互。Domain 0 需要在其它 Domain 启动之前启动。

  • Domain U:

运 行在 Xen Hypervisor 上的所有半虚拟化(paravirtualized)虚拟机被称为“Domain U PV Guests”,其上运行着被修改过内核的操作系统,如 Linux、Solaris、FreeBSD 等其它 UNIX 操作系统。所有的全虚拟化虚拟机被称为“Domain U HVM Guests”,其上运行着不用修改内核的操作系统,如 Windows 等。

3)XEN 工作原理

上面我们针对 Xen 的体系结构进行了简单的描述,我们知道 Xen 主要由 Xen Hypervisor,Domain0,DomainU 三部分组成。下面通过 Domain 0 与 Domain U 的通信以及这三部分的交互来探讨一下 Xen 的工作原理。

  • 之前我们已经提到过 Domain U 分为 PV 客户系统和 HVM 客户系统两种,我们首先讨论一下 PV 客户系统,也就是半虚拟化操作系统工作原理。

首 先我们需要知道在 Domain 0 中有两个驱动 Network Backend Driver 和 Block Backend Driver,它们分别用来处理来自 Domain U 的网络和本地磁盘请求。由于 Xen Hypervisor 不会支持网络和磁盘请求的,因此一个 PV(半虚拟化)客户系统必须通过和 Xen Hypervisor、Domain 0 通信,从而来实现网络和磁盘请求。由于 Xen 文档中已经探讨过 PV 客户系统如何将一个数据写到本地硬盘,下面我们就来讨论一下 PV 客户系统如何将一个数据发送到网络中去。在这之前我们首先要了解到一点,那就是 Domain U PV Guest 中也包括两个驱动“PV Network Driver”和“PV Block Driver”,它们分别也是用来处理发送网络和本地磁盘请求用的,这与 Domain 0 中的两个驱动是相对应的。

当一个 PV 客户系统的网络设备驱动程序接收到一个发送数据请求的时候,并且通过 Xen Hypervisor 发送数据到本地网络设备(网卡之类的设备)中,这个网络设备是和 Domain 0 共享的。在 Domain 0 和 Domain U 之间存在一个事件通道(event channel),通过该通道二者进行异步的域间中断通信。Domain 0 会接收到一个来自 Xen Hypervisor 的中断,触发 PV Network Backend Driver 访问上述网络设备,读取来自 PV 客户系统的数据,然后将这些数据发送出去。

下图中事件通道表示为连接 Domain 0 与 Domain U 的一个区域,这是系统工作流的一个简化。事实上事件通道运行在 Xen Hypervisor 中,通过 Xenstored(Xenstored 维护一个信息档案,包括内存和建立在 Domain 0 与 Domain U 之间的事件通道。Domain 0 通过改变这个档案来设置和其他虚拟机的设备通道)中的特定中断实现,提供 Domain 0 与 Domain U 之间的快速共享网络设备,见下图。

图 8. Domain 0 与 Domain U PV Guest 通信示意图

Domain 0 与 Domain U PV Guest 通信示意图

  • 上面我们已经分析了 PV 客户系统的工作原理,下面我们再简要的介绍一下 HVM 客户系统的工作原理。

由 于一个 HVM Guests 虚拟机中没有上面提到得 PV driver,所以 Xen 在 Domain 0 中为每一个 HVM Guest 都启动一个守护进程 Qemu-dm 处理来自客户系统的网络和磁盘请求,所以当一个 HVM Guest 有相应的网络和 I/O 请求的时候,它就会直接与 Domain0 中和它相对应的 Qemu-dm 来进行交互,通过 Domain 0 最终达到访问网络设备或者磁盘的目的。见下图:

图 9. Domain 0 与 Domain U HVM Guest 通信示意图

Domain 0 与 Domain U HVM Guest 通信示意图

Xen 虚拟机安装后在查看虚拟机时会发现有一个Domain-0的虚拟机。

#查看虚拟机
# xm list

23

3. Hyper-V

图 5. Hyper-V 体系结构图

Hyper-V 体系结构图

Hyper-V 是微软提出的一种系统管理程序虚拟化技术,采用微内核的架构,兼顾了安全性和性能的要求。Hyper-V 底层的 Hypervisor 运行在最高的特权级别下,微软将其称为 ring -1(而 Intel 则将其称为 root mode),而虚机的 OS 内核和驱动运行在 ring 0,应用程序运行在 ring 3 下,这种架构就不需要采用复杂的 BT(二进制特权指令翻译)技术,可以进一步提高安全性。从架构上讲 Hyper-V 只有“硬件-Hyper-V-虚拟机”三层,本身非常小巧,代码简单,且不包含任何第三方驱动,所以安全可靠、执行效率高,能充分利用硬件资源,使虚拟机 系统性能更接近真实系统性能。

Hyper-V 支持分区层面的隔离。分区是逻辑隔离单位,受虚拟机监控程序支持,并且操作系统在其中执行。Microsoft 虚拟机监控程序必须至少有一个父 / 根分区,用于运行 64 位版本的 Windows Server 2008 操作系统。虚拟化堆栈在父分区中运行,并且可以直接访问硬件设备。随后,根分区会创建子分区用于承载来宾操作系统。根分区使用虚拟化调用应用程序编程接口 (API) 来创建子分区。

分区对物理处理器没有访问权限,也不能处理处理器中断。相反,它们具有处理器的虚拟视图,并运行于每个来宾分 区专用的虚拟内存地址区域。虚拟机监控程序负责处理处理器中断,并将其重定向到相应的分区。Hyper-V 还可以通过输入输出内存管理单元 (IOMMU) 利用硬件加速来加快各个来宾虚拟地址空间相互之间的地址转换。IOMMU 独立于 CPU 使用的内存管理硬件运行,并用于将物理内存地址重新映射到子分区使用的地址。从系统的结构图,我们可以看出来 Hyper-V 与 Xen 的架构很相似。

4. Vmware ESXI

图 6. Vmware ESXI 体系结构图

Vmware ESXI 体系结构图

由上图我们可以看出来管理工具也是直接嵌入到了 ESXi vmKernel 中,没有再分化出单独的管理工具,这一点与 Xen 是相区别的。

5. QEMU

QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由kqemu这个开源的加速器,QEMU能模拟至接近真实电脑的速度。

6. KVM和QEMU的关系

准 确来说,KVM是Linux kernel的一个模块。可以用命令modprobe去加载KVM模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有KVM模块是 远远不够的,因为用户无法直接控制内核模块去作事情,你还必须有一个运行在用户空间的工具才行。这个用户空间的工具,kvm开发者选择了已经成型的开源虚 拟化软件 QEMU。说起来QEMU也是一个虚拟化软件。它的特点是可虚拟不同的CPU。比如说在x86的CPU上可虚拟一个Power的CPU,并可利用它编译出 可运行在Power上的程序。KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了。所以你会看到,官方提供的KVM下载有两 大部分(qemu和kvm)三个文件(KVM模块、QEMU工具以及二者的合集)。也就是说,你可以只升级KVM模块,也可以只升级QEMU工具。这就是 KVM和QEMU 的关系。
Xen虚拟化平台架构

KVM和QEMU关系

三、KVM 和 Xen 技术对比

1. Linux虚拟化技术Xen和KVM的优势特点对比

项目 Xen KVM
问世时间 2003年 2007年
支持企业 Citrix、Novell、Oracle、Sun、Ret Hat(RHEL5)和Virtual Iron Redhat、Ubuntu等
支持的虚拟化技术 全虚拟化、半虚拟化 全虚拟化
支持架构 x86、IA64和AMD、Fujitsu、IBM、Sun等公司的ARM,以及x86/64 CPU商家和Intel嵌入式的支持 支持虚拟化的CPU
支持操作系统 UNIX、Linux和Microsoft  Windows UNIX、Linux和Microsoft  Windows
动态迁移 支持 支持(以前不支持)
内核支持 需要对内核打补丁 内置在内核中

 

上面这个表有个关键的项目未列出,那就是性能,文章中并没有基准测试,因此并无准确的对比。

下面是 Linux虚拟化技术Xen和KVM的优势特点对比 文章内容:

Linux虚拟化技术的用户目前有两种免费的开源管理程序可以选择:Xen和KVM。

作为较早出现的虚拟化技术,Xen是“第一类”运行在裸机上的虚拟化管理程序(Hypervisor),也是当前相当一部分商业化运作公司的基础技术,其中包括Citrix系统公司的XenServerOracle的虚拟机。Xen技术的倡导者们声称Xen的性能强劲,并且拥有一个广泛的管理工具和能够交付卓越性能,以及其它诸多优点。

但是最近有一些Linux厂商——包括Red Hat和Canonical把基于内核的虚拟机(KVM:Kernel-based Virtual Machine)技术内置在RHEL和Ubuntu中。KVM是一个轻量级的虚拟化管理程序模块,该模块主要来自于Linux内核。虽然只是后来者,但是由于其性能和实施的简易性,以及对Linux重量级的持续支持,所以还是有必要认真对待KVM技术的。

在本期中,两位IT专家将会对Xen和KVM做出比较,并给出各自的理由。

Andi Mann:Xen比KVM优越的六大原因

Sander van Vugt:KVM比Xen能够带来更好的Linux集成

  Xen比KVM优越的六大原因

投稿人:Andi Mann

作为开源的虚拟化技术,对比Xen和KVM可以看到,Xen以6个无与伦比的优势领先:更好的可用资源、平台支持、可管理性、实施、动态迁移和性能基准。

  • 可用资源:Xen的问世要比KVM早4年之久(两者分别是2003年和2007年)。随着Citrix、 Novell、Oracle、Sun、Ret Hat和Virtual Iron等公司在市场领域的实施,就比较容易找到精通Xen的IT技术人员,更容易让这些技术人员接受Xen相关的培训、更容易得到Xen的咨询帮助以及 获得Xen证书。企业管理协会(EMA:Enterprise Management Associates)2008年这对虚拟化和管理趋势的研究报告表明,这些关键因素占到那些抱怨缺少必要虚拟化技术资源和技术企业的60%。
  • 平台支持:Xen在新版本中支持更多的主机和客体工作环境,包括泛虚拟化技术、硬件辅助支持以及修改过或未修改过的客体操作系统;对UNIX、Linux和Microsoft  Windows的特定支持;包括芯片组,如x86、IA64和AMD、Fujitsu、IBM、Sun等公司的ARM,以及x86/64 CPU商家和Intel嵌入式的支持等。
  • 可管理性:EMA在2009年度针对虚拟系统管理的研究结果表明:对于83%的企业来讲,在选择虚拟化技术过 程中,管理是一项非常关键或者重要的因素。在对比Xen和KVM时,就可以看到Xen具有一个更加宽泛的第三方配给、备份、存储管理、P2V、容量规划、 性能监控、进程自动化、安全和其它管理规则的社区,比如Citrix、IBM、CA、Novell或者Platespin、Enomaly、 Microsoft以及HP等。
  • 实施:无论KVM是“第一类”还是“第二类”,这都是语义上的概念。Xen的运行和管理都是在较低级别的(Ring 0)。甚至对于新虚拟机创建,客体机器并不需要像KVM那样共享内存块、CPU指令或者任何底层的Linux操作系统(虽然偶尔也会越权)。
  • KVM不支持动态迁移:过去在证明VMware ESX比Microsoft Hyper-V优越的最重要的一个观点也同样适用于Xen和KVM的比较,但是这是一个很大的问题。与KVM不同,Xen支持非中断的动态迁移,可以允许 动态工作负载平衡和例行维护而几乎没有任何宕机时间。KVM的固有属性决定了其肯定有宕机时间。
  • 性能:大多数Xen和KVM性能基准的对比都表明Xen具有更好的处理性能(接近于本地处理),只有在磁盘 I/O方面略逊于KVM。进一步来讲,独立测试表明随着工作负载的增加KVM的性能逐渐下降。通常情况下,在试图支持四个以上的客体虚拟机时就会崩溃。 Xen支持一个客体虚拟机的数量呈线性增长,可以支持30个以上工作负载同时运行。

更加深入广泛的Xen与 KVM对比也将会表明Xen在虚拟网络支持、虚拟存储支持、安全增强、高可用性、容错处理、电源管理、HPC或者实时支持、虚拟CPU可扩展性、跨平台兼 容性。虚拟机可移植性、虚拟应用设备市场以及已经建立起来的云服务社区等诸多方面都要比KVM优越。因此KVM只是在技术上比较与众不同,并且拥有几个不 错的应用场景。但是作为企业级的服务器虚拟化技术,和Xen比起来,KVM尚有较大差距。

  Andi Mann是企业管理协会(EMA:Enterprise Management Associates)IT分析部门中研究系统管理和存储管理的副总裁。Mann在技术和管理领域有20多年的IT经验,对主机、中型机、服务器和台式机 上企业形态和软件方面都有深刻理解。Mann是EMA系统管理研究项目的主要负责人,他主要关注数据中心自动化和虚拟化。访问EMA的主页了解更多有关 Mann的信息。

  KVM在Linux整合中优于Xen

投稿人:Sander van Vugt

即使没有实施广泛的Xen和KVM性能基准研究,仍然有很多理由足以说明Linux领导者(诸如Red Hat和Ubuntu)对待KVM态度的原因。其中最明显并且最重要的因素就是KVM是Linux内核的一部分,Xen只是一个安装在Linux内核下层 的一个产品而已。

为什么这一点如此重要呢?其之所以重要是因为在过去Xen工作环境的补丁包不能够和Linux内核兼容。但是如果实施KVM的话,这个问题就可以很容易地得到解决。另外一个选择KVM的原因是KVM在Linux内核内部部署,这样可以很容易控制虚拟化进程。

Xen的拥护者们声称KVM不如Xen技术成熟,并且缺少某些关键特性,如动态迁移和泛虚拟化支持。确实如此,Xen工作环境中的泛虚拟化技术可以使虚拟机的操作更加高效,因为泛虚拟化技术直接和硬件进行交互。然而使用泛虚拟化技术需要修改操作系统,默认Windows的安装并不支持泛虚拟化工作环境。至于动态迁移,KVM也可以做到,只是需要安装正确的KVM版本而已。KVM过去在动态迁移方面确实存在一个问题,但是现在已经解决了。

从另外一个角度来讲,KVM更加灵活。由于操作系统直接和整合到Linux内核中的虚拟化管理程序交互,所以在任何场景下都可以直接和硬件进行交 互,而不需要修改虚拟化的操作系统。这一点非常重要,因为对虚拟机运行来讲KVM可以是一个更快的解决方案。KVM需要Pacifica(AMD)或者 Vanderpool(Intel)虚拟化CPU这一事实现在已经不能成为KVM发展的限制条件,因为当前大多数服务器CPU都有这些处理器。

支持不选择KVM虚拟化技术的一个可信原因是Xen相对来讲历史更久一点,产品更加成熟些。但是长远来看,Xen将会使Linux内核的负担越来越重,因为Xen缺少很好的整合(并且以后也不会解决这个问题),尽管Xen的开发者们正在积极地解决这个整合问题。

最后一点是KVM是Linux内核的一部分,而Xen做到最好也无非是整合到Linux中。随着时间的推移,Ret Hat(目前掌握KVM技术),作为Linux企业市场中份额最大的企业,将会使虚拟化技术的后来者——KVM同Xen一样功能齐全。我相信未来虚拟化市 场必定是KVM的。

转自:http://www.searchvirtual.com.cn/showcontent_33947.htm

补充:目前国内的企业大都是采用Xen技术运营,特别是几乎所有的云主机服务商,包括阿里云,盛大云,万网云等。

2. 虚拟化Xen和虚拟化KVM在Linux下的区别

KVM和Xen的核心差别在哪里呢?

1)关于XEN和KVM

KVM是一个全虚拟化的解决方案。可以在x86架构的计算机上实现虚拟化功能。但KVM需要CPU中虚拟化功能的支持,只可在具有虚拟化支持的CPU上运行,即具有VT功能的Intel CPU和具有AMD-V功能的AMD CPU。

Xen 也是Linux下的一个虚拟化解决方案,也将很快被编入内核中。Xen的实现方法是运行支持Xen功能的kernel,这个kernel是工作在 Xen的控制之下,叫做Domain0,使用这个kernel启动机器后,你可以在这个机器上使用qemu软件,虚拟出多个系统。

2)Xen和KVM对比

Xen的缺点是如果你需要更新Xen的版本,你需要重新编译整个内核,而且,稍有设置不慎,系统就无法启动。
相比较,KVM就简化的多了。它不需要重新编译内核,也不需要对当前kernel做任何修改,它只是几个可以动态加载的.ko模块。它结构更加精简、代码量更小。所以,出错的可能性更小。并且在某些方面,性能比Xen更胜一筹。

KVM由以色列公司Qumranet开发,已经被Linux核心组织放入Linux的内核里面,其使用的x86处理器至少需要包含其中一项硬件辅助虚拟化技术(Intel-VT或AMD-V)。

而 Xen是一个外部的Hypervisor程序(虚拟机管理程序);它能够控制虚拟机和给多个客户机分配资源,在KVM被写入Linux内核后,估计Xen 很难再被写入内核;另一方面,KVM是Linux的一部分, 可使用通常的Linux调度器和内存管理. 这意味着KVM更小更易使用。

此外,Xen同时支持全虚拟化和准虚拟化(需要修改客户机操作系统,而修改过的客户机操作系统能有更好的性能),KVM当前不支持准虚拟化。

3. VPS 选择

找到VPS OPENVZ平台和KVM、Xen、VMware平台区别,就知道如何选择VPS了。

购 买VPS时经常看到有很多不同的平台,像OPENVZ、KVM、Xen、VMware,近年来又有了云主机云VPS。对于初次接触VPS的人来说,如何 挑选VPS平台成了一件令人头疼的事。正因为有这样的困惑,很多VPS商干脆不再提及VPS究竟使用了什么平台。但是仍然有很多的VPS商提供了多种不同 的VPS平台供用户选择,价格不一配置不一。那么这些不同的VPS平台区别和共同点是什么呢?

今天看到一篇英文文章,简要的描述了这些平台的区别,这里拿过来作为VPS平台学习笔记和常识来给自己扫下盲,也给被这些平台搞的手足无措的朋友参个考。

OPENVZ: 这个平台是最便宜的VPS平台,在各个vps商哪里都是价格最低的。OPENVZ本身运行在linux之上,它通过自己的虚拟化技术把一个 服务器虚拟化成多个可以分别安装操作系统的实例,这样的每一个实体就是一个VPS,从客户的角度来看这就是一个虚拟的服务器,可以等同看做一台独立的服务 器。OPENVZ虚拟化出来的VPS只能安装linux操作系统,不能安装windows系统,比如Centos、Fedora、 Gentoo、Debian等。不能安装windows操作系统是openvz的第一个缺点,需要使用windows平台的用户不能使用OPENVZ VPS。OPENVZ的第二个缺点是OPENVZ不是完全的虚拟化,每个VPS账户共用母机内核,不能单独修改内核。好在绝大多少用户根本不需要修改内 核,所以这个缺点对多数人可以忽略不计。而这一点也正是openvz的优点,这一共用内核特性使得openvz的效率最高,超过KVM、Xen、 VMware等平台。在不超售的情况下,openvz是最快速效率最高的VPS平台。

KVM、Xen、VMware:这几个VPS平台可以 归为一类,它们在虚拟化母机时,是完全的虚拟化,各个VPS示例之间不共用母机内核,各自都是独立 的,几乎所有的操作系统都可以安装到这些被虚拟化出来的VPS上。完全的虚拟化使得这些平台的VPS效率上要低于OPENVZ。但由于其完全的虚拟化,同 一母机上的各个VPS之间几乎没有相互干扰,而OPENVZ则取决于VPS是否超售,如果openvz VPS被超售,则性能会受到影响。如果位于同一母机上的openvz VPS有滥用资源行为,将会影响到其它VPS的性能。OPENVZ的这一特点和虚拟主机很类似。虚拟主机就是完全共用虚拟主机母机的资源,虚拟主机的性能 受到同一母机上其它虚拟主机的影响最大。OPENVZ则比虚拟主机要好很多。KVM、Xen、VMware平台的VPS则几乎完全不受其它VPS账户的影 响。

从以上分析可以看出,在不超售的情况OPENVZ的性价比最高:价格低、效率高。但容易受其它同一母机的VPS影响。当然如果可以接 受虚拟主机的话用 openvz VPS也就可以接受,因为虚拟主机之间的影响那才叫大。而像KVM、Xen、VMware这样的平台是今后VPS的发展方向,因其各个VPS之间独立性好 过OPENVZ,所以有很多主机商不再提供OPENVZ VPS。但是因为OPENVZ价格低廉效率好速度快,OPENVZ仍是最受欢迎的低价VPS首选。

这里再说说什么是云VPS。云的概念到现 在仍不统一,最被认可的解释是:比传统VPS使用了更多的数据存储硬件和技术的VPS,比如在数据备份、硬件冗余 等方面使用更大的磁盘阵列、服务器的冗余备份、失败自动倒换等。云VPS可以在数据安全性和业务稳定性方面较有保证一些。对于大多数网站而言。传统的 VPS已经足够可以应付。

VPS OPENVZ平台和KVM、Xen、VMware平台区别讲述完毕。通过自己的笔记感觉自己对这些平台优缺点有了个大概的了解,在选择VPS时就有了大致的方向。

四、KVM or XEN?

下面这些观点来自于KVM or XEN ? 哪个更好?

  • Xen 现阶段在稳定和功能上略胜一筹。KVM获得的社区支持更多。
  • 昨天在Ubuntu上想安装Xen,发现原来的那些链接和很多安装方法改变了,看来被商业公司收购之后,Xen会在各方面有所改变。虽然KVM现在还无法和Xen相比,但是其植入Linux内核,以及被社区支持,让我更看好它的未来。
  • 开源社区抛弃xen,就像抛弃openoffice一样。Xen如果要发展可能来自citrix oracle的支持。在开源社区xen的式微是不可避免。redhat,suse,ubuntu已经处于转换中。。。
  • 我看到的方向也是 KVM。
  • IBM丢弃Xen用KVM,Ubuntu丢弃Xen用KVM。Redhat就更不用说了,当然支持自家的KVM。 KVM完全开源,而Xen只有核才开源。Citrix 指望Xen及外围工具挣钱呢。
  • KVM 最大的优势是:随着kernel的更新
    Xen:最大的弊端是恰好是Dom0 不能用最新的kernel,kernel 3.0之后估计会好很多
  • 还是要多看看应用场景,IO问题是不是关键,XEN和KVM的混合设计可根据业务场景的技术层面关注点来设计,简单来看还是KVM更好,但毕竟市场份额现有的还是XEN的高,有点类似于.NET刚出来时vs JavaEE的感觉,还是需要一定的应用历程才能发展起来的
  • 未来趋势,应该是KVM,但是现在最成熟,还是Xen。

五、Google、Amazon、IBM、Microsoft 等厂商云计算产品介绍

六、参考资料

IO中同步、异步与阻塞、非阻塞的区别

本文转载自 IO中同步、异步与阻塞、非阻塞的区别

一、同步与异步
同步/异步, 它们是消息的通知机制

1. 概念解释
A. 同步
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等)。
但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。
最常见的例子就是 SendMessage。
该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。
当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。

B. 异步
异步的概念和同步相对。
当一个异步过程调用发出后,调用者不会立刻得到结果。
实际处理这个调用的部件是在调用发出后,
通过状态、通知来通知调用者,或通过回调函数处理这个调用。

以 Socket为例,
当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程不用等待结果,可立刻继续向下运行。
当连接真正建立起来以后,socket底层会发送一个消息通知该对象。

C. 三种返回结果途径
执行部件和调用者可以通过三种途径返回结果:
a.   状态、
b.   通知、
c.   回调函数。

可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。

a. 如果执行部件用状态来通知,
那么调用者就需要每隔一定时间检查一次,效率就很低
有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误。

b. 如果是使用通知的方式,
效率则很高,因为执行部件几乎不需要做额外的操作。

c. 至于回调函数,
和通知没太多区别。

2. 举例说明
理解这两个概念,可以用去银行办理业务(可以取钱,也可以存钱)来比喻:
当到银行后,
.可以去ATM机前排队等候                                – (排队等候)就是同步等待消息
.可以去大厅拿号,等到排到我的号时,
柜台的人会通知我轮到我去办理业务.              – (等待别人通知)就是异步等待消息.

在异步消息通知机制中,
等待消息者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,
在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码)
找到等待该事件的人.

在select/poll 等IO 多路复用机制中就是fd,
当消息被触发时,触发机制通过fd 找到处理该fd的处理函数.

3. 在实际的程序中,
同步消息通知机制:就好比简单的read/write 操作,它们需要等待这两个操作成功才能返回;
同步, 是由处理消息者自己去等待消息是否被触发;
异步消息通知机制:类似于select/poll 之类的多路复用IO 操作,
当所关注的消息被触发时,由消息触发机制通知触发对消息的处理.
异步, 由触发机制来通知处理消息者;

还是回到上面的例子,
轮到你办理业务, 这个就是你关注的消息,
而办理什么业务, 就是对这个消息的处理,
两者是有区别的.

而在真实的IO 操作时: 所关注的消息就是     该fd是否可读写,
而对消息的处理是     对这个fd 进行读写.

同步/异步仅仅关注的是如何通知消息,它们对如何处理消息并不关心,
好比说,银行的人仅仅通知你轮到你办理业务了,
而办理业务什么业务(存钱还是取钱)他们是不知道的.

二、阻塞与非阻塞
阻塞/非阻塞, 它们是程序在等待消息(无所谓同步或者异步)时的状态.

1. 概念解释
A. 阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。
对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

socket接收数据函数recv是一个阻塞调用的例子。
当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

B. 非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

C. 对象的阻塞模式和阻塞函数调用
对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。

阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,
在适当的时候调用阻塞函数,就可以避免阻塞。
而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。函数select就是这样的一个例子。

2. 举例说明
继续上面的那个例子,
不论是排队等待,还是使用号码等待通知,
如果在这个等待的过程中,
. 等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的,
表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行.
. 相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,
因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待.

三、易混淆的点
很多人也会把异步和非阻塞混淆,
因为异步操作一般都不会在真正的IO 操作处被阻塞,
比如如果用select 函数,当select 返回可读时再去read 一般都不会被阻塞
就好比当你的号码排到时一般都是在你之前已经没有人了,所以你再去柜台办理业务就不会被阻塞.
可见,同步/异步与阻塞/非阻塞是两组不同的概念,它们可以共存组合,

而很多人之所以把同步和阻塞混淆,我想也是因为没有区分这两个概念,
比如阻塞的read/write 操作中,其实是把消息通知和处理消息结合在了一起,
在这里所关注的消息就是fd 是否可读/写,而处理消息则是对fd 读/写.
当我们将这个fd 设置为非阻塞的时候,read/write 操作就不会在等待消息通知这里阻塞,
如果fd 不可读/写则操作立即返回.

四、同步/异步与阻塞/非阻塞的组合分析
_______阻塞____________________非阻塞_____
同步 | 同步阻塞              同步非阻塞
异步 | 异步阻塞              异步非阻塞

同步阻塞形式:
效率是最低的,
拿上面的例子来说,就是你专心排队,什么别的事都不做。

实际程序中
就是未对fd 设置O_NONBLOCK 标志位的read/write 操作,

异步阻塞形式:
如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发,也就是领了一张小纸条,
假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;

异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息被触发时被阻塞.
比如select 函数,
假如传入的最后一个timeout 参数为NULL,那么如果所关注的事件没有一个被触发,
程序就会一直阻塞在这个select 调用处.

同步非阻塞形式:
实际上是效率低下的,
想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,
如果把打电话和观察排队的位置看成是程序的两个操作的话,
这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;

很多人会写阻塞的read/write 操作,
但是别忘了可以对fd 设置O_NONBLOCK 标志位,这样就可以将同步操作变成非阻塞的了;

异步非阻塞形式:
效率更高,
因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,
程序没有在两种不同的操作中来回切换.

比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,
于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下(注册一个回调函数),
那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了.

如果使用异步非阻塞的情况,
比如aio_*组的操作,当发起一个aio_read 操作时,函数会马上返回不会被阻塞,
当所关注的事件被触发时会调用之前注册的回调函数进行处理,

下面再转载知乎中“怎样理解阻塞非阻塞与同步异步的区别?”这个问题的答案

  • 卢伊爱好者

    “阻塞”与”非阻塞”与”同步”与“异步”不能简单的从字面理解,提供一个从分布式系统角度的回答。
    1.同步与异步
    同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
    所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
    换句话说,就是由*调用者*主动等待这个*调用*的结果。而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。

    典型的异步编程模型比如Node.js

    举个通俗的例子:
    你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果。
    而异步通信机制,书店老板直接告诉你我查一下啊(返回值),查好了打电话给你,然后直接挂电话了。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

    2. 阻塞与非阻塞
    阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

    阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
    非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

    还是上面的例子,
    你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
    在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

    如果是关心blocking IO/ asynchronous IO, 参考 Unix Network Programming View Book

  • 看看steven大叔的这篇文章。http://english.tebyan.net/newindex.aspx?pid=31159&BookID=23760&PageIndex=92&Language=3
    同步和异步仅仅是关于所关注的消息如何通知的机制。同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者
    阻塞和非阻塞应该是发生在消息的处理的时刻。阻塞其实就是等待,发出通知,等待结果完成。非阻塞属于发出通知,立即返回结果,没有等待过程。

FreeBSD 常用技巧

总结了一下 FreeBSD 下的常用技巧,包括源加速等内容。

1. FreeBSD 添加源

MASTER_SITE_BACKUP?= \ 
    http://mirrors.ustc.edu.cn/freebsd/distfiles/${DIST_SUBDIR}/\
    ftp://ftp.cn.FreeBSD.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
    ftp://ftp.hk.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
    ftp://ftp.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
    ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}

2. packages使用方法

setenv PACKAGESITE http://mirrors.ustc.edu.cn/freebsd/releases/amd64/9.2-RELEASE/packages/Latest/
pkg_add -r package #package为要安装的软件名

 

LDAP 入门 for CentOS 6.2_x64

本文转自LDAP基本安裝及整合登入認證機制的架設 on CentOS 6.2_x64,写得非常好的文档,原文中只发现了一个错误(这个错误在这里纠正过来了),同时加了一点皮毛到此文中,希望大家喜欢。

LDAP前身是重量級的目錄服務為X.500,但是因為東西太多且太大,後來才有輕量型目錄服務LDAP (Lightweight Directory Access Protocol),因此讓管理者有另種選擇,一般能存取通訊錄、使用者授權機制及APP的整合等等,而LDAP模型的基礎元素有Object(資料結構物件的代表)、Entrise(真實的資訊)、樹狀結構(DN[Distinguish Name(絕對路徑)]與RDN[Relative Distinguish Name(相對路徑)])與有各種屬性之級別式的架構(Schema),用ASN.1 的語法來定義屬性,其中常見的屬性介紹如下:

objectClassentry typeposixAccount

Attribute Description Example
cn common name(人名部門) Mui Chen
sn surname(Last name) Chen
dc domain component com
o organization ACME Inc.
ou Organization unit Sales
c country tw

 

以上為LDAP的簡介,所以接下來直接來實作LDAP基本安裝及整合登入認證機制的架設共兩個部分,分別如下:

  1. LDAP基本安裝與驗證入門
  2. LDAP整合登入認證機制的架設
  3. 其它LDAP参考资料

1.LDAP基本安裝與驗證入門

1) 安裝OpenLDAP伺服與客戶端的套件,並確認安裝版本

#yum -y install openldap-servers openldap-clients
openldap-2.4.23-20.el6.x86_64
openldap-devel-2.4.23-20.el6.x86_64
openldap-servers-2.4.23-20.el6.x86_64
openldap-clients-2.4.23-20.el6.x86_64

2) 規劃整個LDAP組織圖(類似關聯性資料庫的概念)

      labs.com
        / \
  login     company
   / \        / \
user group unit customer
          /  |  \
      mis account hr

3) 從範例複製一份slapd.conf與DB_CONFIG到對應目錄下(DB_CONFIG檔案設定了Index的快取數量,可調整效能的表現)

#cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
#cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf

4) 產生LDAP管理的密碼並在slapd.conf設定Root

New password:輸入管理密碼
Re-enter new password:輸入管理密碼
{SSHA}???????????????????????????????
#suffix:就是用來定義你LDAP根的尾碼
#rootdn:指LDAP的root,可做新增、刪除、修改等動作
#rootpw:管理者加密過的密碼
database        bdb
suffix          "dc=labs,dc=com"
checkpoint      1024 15
rootdn          "cn=Manager,dc=labs,dc=com"
rootpw          {SSHA}????????????????????????????????

5) 建立root-unit.ldif來定義整個樹狀結構(LDIF:LDAP Data Interchange Format,類似XML 格式,語法嚴謹,其中要注意冒號後都必須多空一格,每個Section設定結束多空一列表該項設定結束,檔頭不能有任意空行)

#mkdir -p /etc/openldap/data
#root node
dn: dc=labs,dc=com
dc: labs
objectClass: dcObject
objectClass: organizationalUnit
ou: labs Dot com

#login top
dn: ou=login,dc=labs,dc=com
ou: login
objectClass: organizationalUnit

#user, uid, password
dn: ou=user,ou=login,dc=labs,dc=com
ou: user
objectClass: organizationalUnit

#group
dn: ou=group,ou=login,dc=labs,dc=com
ou: group
objectClass: organizationalUnit

##for company organization top
dn: ou=company,dc=labs,dc=com
ou: company
objectClass: organizationalUnit

#for company organization (unit)
dn: ou=unit,ou=company,dc=labs,dc=com
ou: unit
objectClass: organizationalUnit

#human resource (under unit)
dn: ou=hr,ou=unit,ou=company,dc=labs,dc=com
ou: hr
objectClass: organizationalUnit

#MIS (under unit)
dn: ou=mis,ou=unit,ou=company,dc=labs,dc=com
ou: mis
objectClass: organizationalUnit

#Account (under unit)
dn: ou=account,ou=unit,ou=company,dc=labs,dc=com
ou: account
objectClass: organizationalUnit

# for customers information
dn: ou=customer,ou=company,dc=labs,dc=com
ou: customer
objectClass: organizationalUnit

6) 將剛定義的root-unit.ldif加入到LDAP的資料庫內並刪除舊的資料

#rm -rf /etc/openldap/slapd.d/*
The first database does not allow slapadd; using the first available one (2)
added: "dc=labs,dc=com" (00000001)
added: "ou=login,dc=labs,dc=com" (00000002)
added: "ou=user,ou=login,dc=labs,dc=com" (00000003)
added: "ou=group,ou=login,dc=labs,dc=com" (00000004)
added: "ou=company,dc=labs,dc=com" (00000005)
added: "ou=unit,ou=company,dc=labs,dc=com" (00000006)
added: "ou=hr,ou=unit,ou=company,dc=labs,dc=com" (00000007)
added: "ou=mis,ou=unit,ou=company,dc=labs,dc=com" (00000008)
added: "ou=account,ou=unit,ou=company,dc=labs,dc=com" (00000009)
added: "ou=customer,ou=company,dc=labs,dc=com" (0000000a)
_#################### 100.00% eta   none elapsed            none fast!
Closing DB...

7) 將LDAP新的資料庫內容產生檔案到slapd.d的目錄內並改變擁有權

config file testing succeeded
total 8
drwxr-x---. 3 root root 4096 Jun 16 15:17 cn=config
-rw-------. 1 root root  986 Jun 16 15:17 cn=config.ldif
#chown -R ldap:ldap /var/lib/ldap
#chown -R ldap:ldap /etc/openldap/slapd.d

◎若之後欲並變更slapd.conf的內容,處理方式如下:

#rm -rf /etc/openldap/slapd.d/*
#slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
#chown -R ldap:ldap /etc/openldap/slapd.d
#service slapd restart

8) 啟動LDAP Server並確認與設定開機時是否要啟動該服務

#service slapd start
#chkconfig --list slapd
#chkconfig --level 345 slapd on

9) 透過ldapsearch確認是否已經完成LDAP樹狀結構(-x:Use simple authentication instead of SASL/-b:searchbase)

# extended LDIF
#
# LDAPv3
# base <dc=labs,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# labs.com
dn: dc=labs,dc=com
dc: labs
objectClass: dcObject
objectClass: organizationalUnit
ou: labs Dot com

# login, labs.com
dn: ou=login,dc=labs,dc=com
ou: login
objectClass: organizationalUnit

# user, login, labs.com
dn: ou=user,ou=login,dc=labs,dc=com
ou: user
objectClass: organizationalUnit

# group, login, labs.com
dn: ou=group,ou=login,dc=labs,dc=com
ou: group
objectClass: organizationalUnit

# company, labs.com
dn: ou=company,dc=labs,dc=com
ou: company
objectClass: organizationalUnit

# unit, company, labs.com
dn: ou=unit,ou=company,dc=labs,dc=com
ou: unit
objectClass: organizationalUnit

# hr, unit, company, labs.com
dn: ou=hr,ou=unit,ou=company,dc=labs,dc=com
ou: hr
objectClass: organizationalUnit

# mis, unit, company, labs.com
dn: ou=mis,ou=unit,ou=company,dc=labs,dc=com
ou: mis
objectClass: organizationalUnit

# account, unit, company, labs.com
dn: ou=account,ou=unit,ou=company,dc=labs,dc=com
ou: account
objectClass: organizationalUnit

# customer, company, labs.com
dn: ou=customer,ou=company,dc=labs,dc=com
ou: customer
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 11
# numEntries: 10

10) 用users.ldif建立人員名冊(與機關設計原理一樣,注意語法)

#Evan McNabb
dn: cn=Evan McNabb,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Evan McNabb
sn: McNabb
objectclass: person
objectclass: inetOrgPerson
givenName: Evan McNabb
mail: c293831287@labs.com
telephoneNumber: 02-29587572
title: Employee

#Jenny Smith
dn: cn=Jenny Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Jenny Smith
sn: Smith
objectclass: person
objectclass: inetOrgPerson
givenName: Jenny Smith
mail: d197700415@labs.com
telephoneNumber: 02-29587572
title: Manager

#Dax Kelson
dn: cn=Dax Kelson,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Dax Kelson
sn: Kelson
objectclass: person
objectclass: inetOrgPerson
givenName: Dax Kelson
mail: d295723341@labs.com
telephoneNumber: 02-29587572
title: employee

#Bryan Croft
dn: cn=Bryan Croft,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Bryan Croft
sn: Croft
objectclass: person
objectclass: inetOrgPerson
givenName: Bryan Croft
mail: c297303122@labs.com
telephoneNumber: 02-29587572
title: employee

#Fred Smith
dn: cn=Fred Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Fred Smith
sn: Smith
objectclass: person
objectclass: inetOrgPerson
givenName: Fred Smith
mail: d191627793@labs.com
telephoneNumber: 02-29587572
title: employee

#Nancy Smith
dn: cn=Nancy Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Nancy Smith
sn: Smith
objectclass: person
objectclass: inetOrgPerson
givenName: Nancy Smith
mail: b192927969@labs.com
telephoneNumber: 02-29587572
title: employee

#Lamont Peterson
dn: cn=Lamont Peterson,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Lamont Peterson
sn: Peterson
objectclass: person
objectclass: inetOrgPerson
givenName: Lamont Peterson
mail: c293190610@labs.com
telephoneNumber: 02-29587572
title: employee

#Cameron Christensen
dn: cn=Cameron Christensen,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Cameron Christensen
sn: Christensen
objectclass: person
objectclass: inetOrgPerson
givenName: Cameron Christensen
mail: h191497299@labs.com
telephoneNumber: 02-29587572
title: Manager

#Jane Smith
dn: cn=Jane Smith,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Jane Smith
sn: Smith
objectclass: person
objectclass: inetOrgPerson
givenName: Jane Smith
mail: b299479351@labs.com
telephoneNumber: 02-29587572
title: engineer

#Derek Carter
dn: cn=Derek Carter,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Derek Carter
sn: Carter
objectclass: person
objectclass: inetOrgPerson
givenName: Derek Carter
mail: c291677874@labs.com
telephoneNumber: 02-29587572
title: engineer

#Stuart Jansen
dn: cn=Stuart Jansen,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Stuart Jansen
sn: Jansen
objectclass: person
objectclass: inetOrgPerson
givenName: Stuart Jansen
mail: b297933030@labs.com
telephoneNumber: 02-29587572
title: engineer

#Sally Jansen
dn: cn=Sally Jansen,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Sally Jansen
sn: Jansen
objectclass: person
objectclass: inetOrgPerson
givenName: Sally Jansen
mail: f296974826@labs.com
telephoneNumber: 02-29587572
title: engineer

#Jan Johnson
dn: cn=Jan Johnson,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: Jan Johnson
sn: Johnson
objectclass: person
objectclass: inetOrgPerson
givenName: Jan Johnson
mail: b299136575@labs.com
telephoneNumber: 02-29587572
title: Manager

#John Smith
dn: cn=John Smith,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: John Smith
sn: Smith
objectclass: person
objectclass: inetOrgPerson
givenName: John Smith
mail: e295689078@labs.com
telephoneNumber: 02-29587572
title: accountant

#Tim Peterson
dn: cn=Tim Peterson,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: Tim Peterson
sn: Peterson
objectclass: person
objectclass: inetOrgPerson
givenName: Tim Peterson
mail: a293893990@labs.com
telephoneNumber: 02-29587572
title: accountant

#Joan Jett
dn: cn=Joan Jett,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: Joan Jett
sn: Jett
objectclass: person
objectclass: inetOrgPerson
givenName: Joan Jett
mail: f192426229@labs.com
telephoneNumber: 02-29587572
title: accountant

#Cindy Jackson
dn: cn=Cindy Jackson,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: Cindy Jackson
sn: Jackson
objectclass: person
objectclass: inetOrgPerson
givenName: Cindy Jackson
mail: d295380453@labs.com
telephoneNumber: 02-29587572
title: accountant

11) 將人員名冊加入到LDAP的資料庫內

adding new entry "cn=Evan McNabb,ou=hr,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Jenny Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Dax Kelson,ou=hr,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Bryan Croft,ou=hr,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Fred Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Nancy Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Lamont Peterson,ou=hr,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Cameron Christensen,ou=mis,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Jane Smith,ou=mis,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Derek Carter,ou=mis,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Stuart Jansen,ou=mis,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Sally Jansen,ou=mis,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Jan Johnson,ou=account,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=John Smith,ou=account,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Tim Peterson,ou=account,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Joan Jett,ou=account,ou=unit,ou=company,dc=labs,dc=com"
adding new entry "cn=Cindy Jackson,ou=account,ou=unit,ou=company,dc=labs,dc=com"

12) 舉幾個查詢例子來驗證人員名冊已經加到LDAP資料庫內

# extended LDIF
#
# LDAPv3
# base <ou=unit,ou=company,dc=labs,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# unit, company, labs.com
dn: ou=unit,ou=company,dc=labs,dc=com
ou: unit
objectClass: organizationalUnit

# hr, unit, company, labs.com
dn: ou=hr,ou=unit,ou=company,dc=labs,dc=com
ou: hr
objectClass: organizationalUnit

# mis, unit, company, labs.com
dn: ou=mis,ou=unit,ou=company,dc=labs,dc=com
ou: mis
objectClass: organizationalUnit

# account, unit, company, labs.com
dn: ou=account,ou=unit,ou=company,dc=labs,dc=com
ou: account
objectClass: organizationalUnit

# Evan McNabb, hr, unit, company, labs.com
dn: cn=Evan McNabb,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Evan McNabb
sn: McNabb
objectClass: person
objectClass: inetOrgPerson
givenName: Evan McNabb
mail: c293831287@labs.com
telephoneNumber: 02-29587572
title: Employee

# Jenny Smith, hr, unit, company, labs.com
dn: cn=Jenny Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Jenny Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Jenny Smith
mail: d197700415@labs.com
telephoneNumber: 02-29587572
title: Manager

# Dax Kelson, hr, unit, company, labs.com
dn: cn=Dax Kelson,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Dax Kelson
sn: Kelson
objectClass: person
objectClass: inetOrgPerson
givenName: Dax Kelson
mail: d295723341@labs.com
telephoneNumber: 02-29587572
title: employee

# Bryan Croft, hr, unit, company, labs.com
dn: cn=Bryan Croft,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Bryan Croft
sn: Croft
objectClass: person
objectClass: inetOrgPerson
givenName: Bryan Croft
mail: c297303122@labs.com
telephoneNumber: 02-29587572
title: employee

# Fred Smith, hr, unit, company, labs.com
dn: cn=Fred Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Fred Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Fred Smith
mail: d191627793@labs.com
telephoneNumber: 02-29587572
title: employee

# Nancy Smith, hr, unit, company, labs.com
dn: cn=Nancy Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Nancy Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Nancy Smith
mail: b192927969@labs.com
telephoneNumber: 02-29587572
title: employee

# Lamont Peterson, hr, unit, company, labs.com
dn: cn=Lamont Peterson,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Lamont Peterson
sn: Peterson
objectClass: person
objectClass: inetOrgPerson
givenName: Lamont Peterson
mail: c293190610@labs.com
telephoneNumber: 02-29587572
title: employee

# Cameron Christensen, mis, unit, company, labs.com
dn: cn=Cameron Christensen,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Cameron Christensen
sn: Christensen
objectClass: person
objectClass: inetOrgPerson
givenName: Cameron Christensen
mail: h191497299@labs.com
telephoneNumber: 02-29587572
title: Manager

# Jane Smith, mis, unit, company, labs.com
dn: cn=Jane Smith,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Jane Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Jane Smith
mail: b299479351@labs.com
telephoneNumber: 02-29587572
title: engineer

# Derek Carter, mis, unit, company, labs.com
dn: cn=Derek Carter,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Derek Carter
sn: Carter
objectClass: person
objectClass: inetOrgPerson
givenName: Derek Carter
mail: c291677874@labs.com
telephoneNumber: 02-29587572
title: engineer

# Stuart Jansen, mis, unit, company, labs.com
dn: cn=Stuart Jansen,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Stuart Jansen
sn: Jansen
objectClass: person
objectClass: inetOrgPerson
givenName: Stuart Jansen
mail: b297933030@labs.com
telephoneNumber: 02-29587572
title: engineer

# Sally Jansen, mis, unit, company, labs.com
dn: cn=Sally Jansen,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Sally Jansen
sn: Jansen
objectClass: person
objectClass: inetOrgPerson
givenName: Sally Jansen
mail: f296974826@labs.com
telephoneNumber: 02-29587572
title: engineer

# Jan Johnson, account, unit, company, labs.com
dn: cn=Jan Johnson,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: Jan Johnson
sn: Johnson
objectClass: person
objectClass: inetOrgPerson
givenName: Jan Johnson
mail: b299136575@labs.com
telephoneNumber: 02-29587572
title: Manager

# John Smith, account, unit, company, labs.com
dn: cn=John Smith,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: John Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: John Smith
mail: e295689078@labs.com
telephoneNumber: 02-29587572
title: accountant

# Tim Peterson, account, unit, company, labs.com
dn: cn=Tim Peterson,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: Tim Peterson
sn: Peterson
objectClass: person
objectClass: inetOrgPerson
givenName: Tim Peterson
mail: a293893990@labs.com
telephoneNumber: 02-29587572
title: accountant

# Joan Jett, account, unit, company, labs.com
dn: cn=Joan Jett,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: Joan Jett
sn: Jett
objectClass: person
objectClass: inetOrgPerson
givenName: Joan Jett
mail: f192426229@labs.com
telephoneNumber: 02-29587572
title: accountant

# Cindy Jackson, account, unit, company, labs.com
dn: cn=Cindy Jackson,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: Cindy Jackson
sn: Jackson
objectClass: person
objectClass: inetOrgPerson
givenName: Cindy Jackson
mail: d295380453@labs.com
telephoneNumber: 02-29587572
title: accountant

# search result
search: 2
result: 0 Success

# numResponses: 22
# numEntries: 21
# extended LDIF
#
# LDAPv3
# base <ou=unit,ou=company,dc=labs,dc=com> with scope subtree
# filter: (sn=Smith)
# requesting: ALL
#

# Jenny Smith, hr, unit, company, labs.com
dn: cn=Jenny Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Jenny Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Jenny Smith
mail: d197700415@labs.com
telephoneNumber: 02-29587572
title: Manager

# Fred Smith, hr, unit, company, labs.com
dn: cn=Fred Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Fred Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Fred Smith
mail: d191627793@labs.com
telephoneNumber: 02-29587572
title: employee

# Nancy Smith, hr, unit, company, labs.com
dn: cn=Nancy Smith,ou=hr,ou=unit,ou=company,dc=labs,dc=com
cn: Nancy Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Nancy Smith
mail: b192927969@labs.com
telephoneNumber: 02-29587572
title: employee

# Jane Smith, mis, unit, company, labs.com
dn: cn=Jane Smith,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Jane Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Jane Smith
mail: b299479351@labs.com
telephoneNumber: 02-29587572
title: engineer

# John Smith, account, unit, company, labs.com
dn: cn=John Smith,ou=account,ou=unit,ou=company,dc=labs,dc=com
cn: John Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: John Smith
mail: e295689078@labs.com
telephoneNumber: 02-29587572
title: accountant

# search result
search: 2
result: 0 Success

# numResponses: 6
# numEntries: 5
# extended LDIF
#
# LDAPv3
# base <ou=unit,ou=company,dc=labs,dc=com> with scope subtree
# filter: (&(sn=Smith)(title=engineer))
# requesting: ALL
#

# Jane Smith, mis, unit, company, labs.com
dn: cn=Jane Smith,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Jane Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Jane Smith
mail: b299479351@labs.com
telephoneNumber: 02-29587572
title: engineer

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

13) 啟用OpenLDAP的加密傳輸(刪除舊的並重建)

#cd /etc/pki/tls/certs
#rm slapd.pem
umask 77 ; \
        PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
        PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
        /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 -set_serial 0 ; 

\
        cat $PEM1 >  slapd.pem ; \
        echo ""    >> slapd.pem ; \
        cat $PEM2 >> slapd.pem ; \
        rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
..........+++
....................................................+++
writing new private key to '/tmp/openssl.Znr5LE'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:TW
State or Province Name (full name) []:Taiwan
Locality Name (eg, city) [Default City]:Taipei County
Organization Name (eg, company) [Default Company Ltd]:Labs Corp.
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:ldap.labs.com
Email Address []:iori@labs.com
#chmod 640 slapd.pem
#chown :ldap slapd.pem
#ln -s /etc/pki/tls/certs/slapd.pem /etc/openldap/cacerts/slapd.pem
SLAPD_LDAPS=yes
#取消註解以下內容
TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
TLSCertificateFile /etc/pki/tls/certs/slapd.pem
TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT never
#rm -rf /etc/openldap/slapd.d/*
config file testing succeeded
#chown -R ldap:ldap /etc/openldap/slapd.d
#service slapd restart

14) 檢查是否有開啟LDAP的通訊埠(Port 389[TSL]與636[SASL])

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1227/rpcbind
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      5053/sshd
tcp        0      0 0.0.0.0:34742               0.0.0.0:*                   LISTEN      1245/rpc.statd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      5131/master
tcp        0      0 0.0.0.0:636                 0.0.0.0:*                   LISTEN      4916/slapd
tcp        0      0 0.0.0.0:389                 0.0.0.0:*                   LISTEN      4916/slapd
tcp        0      0 0.0.0.0:5672                0.0.0.0:*                   LISTEN      5174/qpidd
tcp        0      0 :::111                      :::*                        LISTEN      1227/rpcbind
tcp        0      0 :::22                       :::*                        LISTEN      5053/sshd
tcp        0      0 :::44376                    :::*                        LISTEN      1245/rpc.statd
tcp        0      0 ::1:25                      :::*                        LISTEN      5131/master
tcp        0      0 :::636                      :::*                        LISTEN      4916/slapd
tcp        0      0 :::389                      :::*                        LISTEN      4916/slapd
udp        0      0 0.0.0.0:52246               0.0.0.0:*                               4945/avahi-daemon
udp        0      0 0.0.0.0:52894               0.0.0.0:*                               1245/rpc.statd
udp        0      0 0.0.0.0:978                 0.0.0.0:*                               1227/rpcbind
udp        0      0 0.0.0.0:997                 0.0.0.0:*                               1245/rpc.statd
udp        0      0 0.0.0.0:5353                0.0.0.0:*                               4945/avahi-daemon
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1227/rpcbind
udp        0      0 :::978                      :::*                                    1227/rpcbind
udp        0      0 :::57707                    :::*                                    1245/rpc.statd
udp        0      0 :::111                      :::*                                    1227/rpcbind

◎最後記得要去確認是否防火牆允許讓LDAP的服務通行

15) LDAP客戶端的安裝與設定(若為Client連到Server的情況)

#yum -y install openldap-clients
#第一行為LDAP Server本地端才需要設,Client不需要
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT never

16) 下面是以TLS/SASL的方式查詢做LDAP資料的查詢

#ldapsearch -x -ZZ -x -H ldaps://LDAP_Server_IP -b "ou=unit,ou=company,dc=labs,dc=com" "(&(sn="Smith")(title="engineer"))"
# extended LDIF
#
# LDAPv3
# base <ou=unit,ou=company,dc=labs,dc=com> with scope subtree
# filter: (&(sn=Smith)(title=engineer))
# requesting: ALL
#

# Jane Smith, mis, unit, company, labs.com
dn: cn=Jane Smith,ou=mis,ou=unit,ou=company,dc=labs,dc=com
cn: Jane Smith
sn: Smith
objectClass: person
objectClass: inetOrgPerson
givenName: Jane Smith
mail: b299479351@labs.com
telephoneNumber: 02-29587572
title: engineer

# search result
search: 3
result: 0 Success

# numResponses: 2
# numEntries: 1

2.LDAP整合登入認證機制的架設

自從Sun推出了Sun Yellow Pages(也就是目前在Unix/Linux世界常聽到有漏洞的Network Information Service[NIS]之後,Unix/Linux的帳號管理因此就有了完整的統一方案,所以趕緊來實作如何使用LDAP來統一帳號密碼的管理,如下:

1) 設定slapd.conf的Schema與Attribute(確認有下列該行)

include         /etc/openldap/schema/nis.schema

2) 規劃user-login.ldif的架構與原本的對照

管過系統的都知道/etc/passwd是用來存放個人的帳號資料、/etc/shadow是存放個人的密碼資訊與/etc/group是存放群組資訊,而/etc/passwd的設定格式如下:

steven:x:500:500::/home/steven:/bin/bash
(id:password:uid:gid:full_name:Home Directory:Login shell)

所以對於LDAP而言,也要引用相關的Atrribute才可以正確的做應對登入,下表則為posix到/etc/passwd的對應:

objectClass: posixAccount

id uid
password userPassword
uid uidNumber
gid gidNumber
full_name gecos
Home Directory homeDirectory
Login shell loginShell

/etc/shadow的設定格式如下:

steven:$1$xGQPf1Cs$Y/kQw5TmUXvWY/1z3QgNZ/:13001:0:99999:7:::
(username:passwd:last:may:must:warn:expire:disable:reserved)

則posix到/etc/shadow的表格對應如下:

objectClass: shadowAccount

username uid
password userPassword
last shadowLastChange
may shadowMin
must shadowMax
warn shadowWarning
expire shadowExpire
disable shadowInactive
reserved shadowFlag

由上面兩個對應的表格得知,若要設計ldif檔案時,最少也要引用上述的這些Attribute才能達到目的,除了這兩個對應之外,還有/etc/group,它的設定格式如下:

steven:x:500:
(group name:password:group id:other account)

則posix到/etc/group的表格對應如下:

objectClass: posixGroup

group name cn
password userPassword
group id gidNumber
other account memberUid

所以說對系統管理而言,群組也是很重要,千萬別忘了它

3) 按照上面的對照建立user-login.ldif(登入認證的LDAP資料庫)

#Evan McNabb
dn: cn=c293831287,ou=user,ou=login,dc=labs,dc=com
uid: c293831287
cn: c293831287
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: hrC293831287
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 600
gidNumber: 510
homeDirectory: /home/c293831287
gecos: Evan McNabb

#Jenny Smith
dn: cn=d197700415,ou=user,ou=login,dc=labs,dc=com
uid: d197700415
cn: d197700415
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: hrD197700415
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 601
gidNumber: 510
homeDirectory: /home/d197700415
gecos: Jenny Smith

#Dax Kelson
dn: cn=d295723341,ou=user,ou=login,dc=labs,dc=com
uid: d295723341
cn: d295723341
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: hrD295723341
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 602
gidNumber: 510
homeDirectory: /home/d295723341
gecos: Dax Kelson

#Bryan Croft
dn: cn=c297303122,ou=user,ou=login,dc=labs,dc=com
uid: c297303122
cn: c297303122
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: hrC297303122
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 603
gidNumber: 510
homeDirectory: /home/c297303122
gecos: Bryan Croft

#Fred Smith
dn: cn=d191627793,ou=user,ou=login,dc=labs,dc=com
uid: d191627793
cn: d191627793
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: hrD191627793
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 604
gidNumber: 510
homeDirectory: /home/d191627793
gecos: Fred Smith

#Nancy Smith
dn: cn=b192927969,ou=user,ou=login,dc=labs,dc=com
uid: b192927969
cn: b192927969
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: hrB192927969
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 605
gidNumber: 510
homeDirectory: /home/b192927969
gecos: Nancy Smith

#Lamont Peterson
dn: cn=c293190610,ou=user,ou=login,dc=labs,dc=com
uid: c293190610
cn: c293190610
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: hrC293190610
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 606
gidNumber: 510
homeDirectory: /home/c293190610
gecos: Lamont Peterson

#Cameron Christensen
dn: cn=h191497299,ou=user,ou=login,dc=labs,dc=com
uid: h191497299
cn: h191497299
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: miH191497299
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 607
gidNumber: 511
homeDirectory: /home/h191497299
gecos: Cameron Christensen

#Jane Smith
dn: cn=b299479351,ou=user,ou=login,dc=labs,dc=com
uid: b299479351
cn: b299479351
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: miB299479351
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 608
gidNumber: 511
homeDirectory: /home/b299479351
gecos: Jane Smith

#Derek Carter
dn: cn=c291677874,ou=user,ou=login,dc=labs,dc=com
uid: c291677874
cn: c291677874
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: miC291677874
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 609
gidNumber: 511
homeDirectory: /home/c291677874
gecos: Derek Carter

#Stuart Jansen
dn: cn=b297933030,ou=user,ou=login,dc=labs,dc=com
uid: b297933030
cn: b297933030
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: miB297933030
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 610
gidNumber: 511
homeDirectory: /home/b297933030
gecos: Stuart Jansen

#Sally Jansen
dn: cn=f296974826,ou=user,ou=login,dc=labs,dc=com
uid: f296974826
cn: f296974826
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: miF296974826
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 611
gidNumber: 511
homeDirectory: /home/f296974826
gecos: Sally Jansen

#Jan Johnson
dn: cn=b299136575,ou=user,ou=login,dc=labs,dc=com
uid: b299136575
cn: b299136575
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: acB299136575
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 612
gidNumber: 512
homeDirectory: /home/b299136575
gecos: Jan Johnson

#John Smith
dn: cn=e295689078,ou=user,ou=login,dc=labs,dc=com
uid: e295689078
cn: e295689078
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: acE295689078
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 613
gidNumber: 512
homeDirectory: /home/e295689078
gecos: John Smith

#Tim Peterson
dn: cn=a293893990,ou=user,ou=login,dc=labs,dc=com
uid: a293893990
cn: a293893990
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: acA293893990
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 614
gidNumber: 512
homeDirectory: /home/a293893990
gecos: Tim Peterson

#Joan Jett
dn: cn=f192426229,ou=user,ou=login,dc=labs,dc=com
uid: f192426229
cn: f192426229
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: acF192426229
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 615
gidNumber: 512
homeDirectory: /home/f192426229
gecos: Joan Jett

#Cindy Jackson
dn: cn=d295380453,ou=user,ou=login,dc=labs,dc=com
uid: d295380453
cn: d295380453
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: acD295380453
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 616
gidNumber: 512
homeDirectory: /home/d295380453
gecos: Cindy Jackson

4) 將users-login.ldif透過LDAP管理帳號匯入至LDAP資料庫內

adding new entry "cn=c293831287,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=d197700415,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=d295723341,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=c297303122,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=d191627793,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=b192927969,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=c293190610,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=h191497299,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=b299479351,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=c291677874,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=b297933030,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=f296974826,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=b299136575,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=e295689078,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=a293893990,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=f192426229,ou=user,ou=login,dc=labs,dc=com"
adding new entry "cn=d295380453,ou=user,ou=login,dc=labs,dc=com"

5) 透過ldapsearch來查詢登入認證的資料是否已匯入至LDAP資料庫內

...
# extended LDIF
#
# LDAPv3
# base <ou=user,ou=login,dc=labs,dc=com> with scope subtree
# filter: (cn=d295380453)
# requesting: ALL
#

# d295380453, user, login, labs.com
# f192426229, user, login, labs.com
dn: cn=f192426229,ou=user,ou=login,dc=labs,dc=com
uid: f192426229
cn: f192426229
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: YWNGMTkyNDI2MjI5
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 615
gidNumber: 512
homeDirectory: /home/f192426229
gecos: Joan Jett

# d295380453, user, login, labs.com
dn: cn=d295380453,ou=user,ou=login,dc=labs,dc=com
uid: d295380453
cn: d295380453
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: YWNEMjk1MzgwNDUz
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 616
gidNumber: 512
homeDirectory: /home/d295380453
gecos: Cindy Jackson

# search result
search: 2
result: 0 Success

# numResponses: 19
# numEntries: 18

6) 按照上面的對照建立group.ldif(群組的LDAP資料庫)並匯入

#Human Resource
dn: cn=hr,ou=group,ou=login,dc=labs,dc=com
objectClass: posixGroup
cn: hr
gidNumber: 510

#MIS
dn: cn=mis,ou=group,ou=login,dc=labs,dc=com
objectClass: posixGroup
cn: mis
gidNumber: 511

#Account
dn: cn=account,ou=group,ou=login,dc=labs,dc=com
objectClass: posixGroup
cn: account
gidNumber: 512
adding new entry "cn=hr,ou=group,ou=login,dc=labs,dc=com"
adding new entry "cn=mis,ou=group,ou=login,dc=labs,dc=com"
adding new entry "cn=account,ou=group,ou=login,dc=labs,dc=com"

7) 編輯slapd.conf去更改LDAP的ACLs(因其中有包含password項目,若不限制則每個人都可查別人的password)

#######################################################################
# 以下為 ACL Rules 存取安全設定 (增加 Access Control 部份)
# 合法的使用者能讀取 LDAP 資料庫,但不能讀/寫其它人的密碼
#######################################################################
access to attrs=userPassword
       by self write
       by anonymous auth
       by dn.base="cn=Manager,dc=labs,dc=com" write
       by * none
#######################################################################
# 為了讓 nss_ldap 機制能夠運作,必須開啟 anonymous 讀取的權限,但是限制它不能從任何 IP 讀取
#######################################################################
access to *
       by self write
       by users read
       by anonymous peername.IP=127.0.0.1 read
       by anonymous peername.IP=192.168.73.0%255.255.255.0 read
       by dn.base="cn=Manager,dc=labs,dc=org" write
       by * none
#service slapd restart

◎權限控制部分的驗證並與想像的不符,詳細設定的說明請參考官方文件

8) 在Client設定登入認證使用LDAP

#yum -y install pam_ldap nss-pam-ldapd
#setup

Starting nslcd:                                            [  OK  ]

◎若你想要挑戰手動設定,方法如下:

TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT never
URI ldap://LDAP_Server_IP/
BASE ou=user,ou=login,dc=labs,dc=com
uid nslcd
gid ldap
# This comment prevents repeated auto-migration of settings.
uri ldap://LDAP_Server_IP/
base ou=login,dc=labs,dc=com
ssl no
tls_cacertdir /etc/openldap/cacerts
base ou=login,dc=labs,dc=com
# add at the last line
uri ldap://LDAP_Server_IP/
ssl no
tls_cacertdir /etc/openldap/cacerts
pam_password md5
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so
# add if you need ( create home directory automatically if it's none )
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
passwd: files ldap # line 33: add
shadow: files ldap # add
group: files ldap # add
netgroup: files ldap # line 57: change
automount: files ldap # line 61: change
USELDAP= yes # line 18: change
#chkconfig --level 345 nslcd on
#reboot

以上設定參考朱老師筆記內的LDAP用戶端設定,所以還是手動的好吧!

9) 透過Secure Shell(SSH)驗證LDAP登入驗證機制

b299136575@LDAP_Server_IP's password:
Last login: Sat Jun 16 23:03:50 2012 from LDAP_Server_IP
Could not chdir to home directory /home/b299136575: No such file or directory

◎在使用LDAP帳號登入時出現“Could not chdir to home directory /home/b299136575: No such file or directory”,是因為你並沒有建立該User的Home Directory,所以您可以再建立該使用者的Home Directory就可以解決了,若你手邊剛好有File Server的服務,可以使用NFS的方法並搭配Automount來掛載使用者家目錄,剩下一些細部的設定可以參考StevenWeithennJamyy關於LDAP的說明,累了,收工!

3.其它LDAP参考资料

当然 ldap 也可以用GUI啦,比如LDAPBrowser,Windows下的工具,简单易用。这里就不做详细介绍了。

其它资料包括:

其中后面三个是中文资料。

Dropbox 同时运行多个账号

今天突然冒出来了一个需求:要在一台电脑上同时运行多个 Dropbox 账号。我原来有一个账号,里面存放了很多东西,有几百M。而现在想再添加一个Dropbox账号,专门用于GTD,在电脑、手机和平板等各种设备中同步。

但 Dropbox 自身并未提供多账号登录功能,在 DropboxChina 上面提示没有实现Dropbox多账号登录功能,不过总是会有办法的。

方法一、使用系统中的多用户

具体方法可以在这里找到: 在一台电脑中使用两个不同的 Dropbox 帐号。这种方式是曲线救国,个人感觉相当繁琐,下面的方法更好。

方法二、使用 DropboxPortableAHK
使用这种方法非常简单,就跟重新装一个Dropbox差不多,自动启动的设置也非常简单。 我现在就是使用这种方法在做。

DropboxPortableAHK

Zabbix 图形显示中文乱码解决方法

不晓得有没有童鞋跟我一样悲剧,zabbix图形化显示时下面的中文是“方框框”。

问题原因:由于zabbix的web前端没有中文字体
解决方法:
1. 进入 C:\Windows\Fonts 选择其中任意一种中文字体例如 “黑体” ( SIMHEI.TTF )
2. 将 Windows 下的中文字体文件( for example: simhei.ttf ) 上传到 zabbix web 目录( Default  :  /usr/share/zabbix )下的 fonts 目录 ( Default: /usr/share/zabbix/fonts )
3. 修改zabbix的web前端的字体设置,将如下两行修改为:
#vi /usr/share/zabbix/include/define.inc.php
define('ZBX_FONT_NAME', 'DejaVuSans');
define('ZBX_GRAPH_FONT_NAME', 'DejaVuSans');
修改为
define('ZBX_FONT_NAME',  'simhei');
define('ZBX_GRAPH_FONT_NAME',  'simhei');
其中simhei为字库名字,不用写ttf后缀。
这样就行了,刷新一下浏览器,看看是不是显示正常了。