zookeeper集群架构详解!
时间:2025-11-04 23:33:41 出处:域名阅读(143)
之前的集解文章为大家介绍过zookeeper服务部署与基础使用的相关知识,接下来本篇文章为大家介绍一下zookeeper集群架构,群架快跟着小编来学习一下吧。构详
推荐阅读:
【SRE工程师培训】zookeeper服务部署与基础使用!
zookeeper服务部署与基础使用(二)!老男孩Linux培训班
zookeeper集群介绍
| 为什么搭建Zookeeper集群
大部分分布式应用需要一个主控、集解协调器或者控制器来管理物理分布的群架子进程
zookeeper作为注册中心,服务器和客户端都要访问,构详如果有大量的集解并发,肯定会有等待
所以可以通过zookeeper集群解决
下面是群架zookeeper集群部署结构图:

| zookeeper集群的角色
Leader:领导者,一个Zookeeper集群同一时间只能有一个Leader,构详Leader服务器是集解整个Zookeeper集群工作制中的核心,其主要工作有以下:
事务请求的群架唯一调度和处理者,保证集群事务处理的构详顺序性。Zookeeper中所有事务操作都是集解由leader服务器进行处理 集群内部服务器的调用者 接受所有的Follower的提案请求并统一协调发起提案投票,负责与所有Follower进行内部数据交换(同步)Follower:跟随者,群架主要工作:
处理客户端的构详非事务请求,并转发事务请求给Leader服务器 参与事务请求的同步提交投票。同时与Leader进行数据交换(同步) 参与Leader选举投票Observer:观察者,主要工作:
观察Zookeeper集群的云服务器最新状态变化,并将这些状态变更同步过来 对于非事务请求,可以直接独立处理,而对于事务请求,则会转发给Leader服务器进行处理。这是集群的可选组件 但obServer不参加投票过程,只同步leader的状态。obServer的目的是为了扩展系统,提高读取速度Client:客户端:
向zookeeper集群发起连接请求的一方zookeeper的leader选举
| zookeeper服务端状态
zookeeper服务端有以下四种常见的状态:

| zookeeper集群启动时的leader选举
在集群初始化节点,当有一台服务器zk101启动时,其单独无法进行和完成leader选举,当第二台服务器zk102启动时,此时两台机器就可以相互通信,每台机器都试图找到leader,于是进入leader选举过程
zookeeper集群启动时期的leader选举过程如下所示:
1、每个server发出一个投票,由于初始情况,zk101和zk102都会将自己作为leader服务器来进行投票,每次投票会包含所推举的服务器myid和zxid,如下所示:
使用(myid,zxid)来表示,b2b信息网此时zk101投票为(101,0),zk102的投票为(102,0),然后各自将跟这个投票发给集群的其它机器;
2、集群中每台服务器接收来自集群中各个服务器的投票;
3、处理投票,针对每一个投票,服务器都需要将别人的的投票和自己的投票进行pk,pk的规则如下:
对于zk101而言,它的投票是"(101,0)",接收zk102的投票为"(102,0)",首先会比较两者的zxid,均为0,再比较myid,此时zk102的myid最大,于是zk101节点需要更新自己的投票为"(102,0)" 对于zk102而言,它的投票是"(102,0)",接收zk101的b2b供应网投票为"(101,0)",很明显zk101的myid较小,因此zk102无需更新字节的投票,只是再次向集群中所有机器上发送一次投票信息即可;a.优先检查zxid,zxid比较大的服务器优先作为leader;
b.如果zxid相同,那么就比较myid,myid较大的服务器作为leader服务器;
综上所述,我们可以针对zk101和zk102选举的过程如下:
4、统计投票,每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接收到相同的投票信息,对于zk101和zk102而言,都统计出集群中已经有两台机器接收了(102,0)的投票信息,此时认为已经选出来leader;
5、改变服务器状态,一旦确定了leader,每个zookeeper服务器就会更新自己的状态,如果是follower,那么就变更为following,如果是leader,就变更为leading
温馨提示:
myid:表示当前zookeeper server的server id zxid:表示zookeeper transaction id,即zookeeper事务ID判断是否已经有过半机器接收到相同的投票信息:
假设集群可参与投票的服务器数量为N,那么过半机器数量计算方式为: (N / 2 + 1) 我们的集群只有3台,那么过半就是2台服务器| zookeeper集群运行时的leader选举
在zookeeper运行期间,leader与非leader服务器各司其职,即便当有非leader服务器宕机或新加入,此时也不会影响leader
但是一旦leader服务器挂了,那么这个集群将暂停对外服务,当剩余节点数大于原集群半数节点时,则zookeeper集群可以进入新一轮leader选举,其过程和启动时期的leader选举过程基本一致
假设正在运行的有zk101,zk102,zk103这三台服务器,当leader是zk102,若某一时刻leader挂了,此时便开始leader选举,其过程如下:
1、变更状态,leader挂后,余下的服务器都会将自己的服务器状态变更为looking,然后开始进入leader选举过程;
2、每个server会发出一个投票,在运行期间,每个服务器上的zxid可能不同,此时假定zk101的zxid为"996",zk103的zxid为"965",在第一轮投票中,zk101和zk103都会投自己,产生投票(101,996),(103,965),然后各自将投票发送给集群中所有机器;
3、接收来自各个服务器的投票,与启动时过程相同;
4、处理投票,与启动过程相同,此时zk101将会成为leader;
5、统计投票,与启动时过程相同;
6、改变服务器的状态,与启动时过程相同;
实验环境准备
| zookeeper集群搭建概述
单机环境下,zookeeper安装完毕,我们可以基于一台虚拟机,进行zookeeper的伪分布式集群搭建,zookeeper集群中包含3个节点,例如节点对外提供服务端口号分别为2181,2182和2183
但在实际生产环境中,伪分布式并不使用,因此我们还是搭建一个完全分布式集群,这样更贴近生产环境
| 测试环境说明

| 添加zookeeper集群的映射信息
cat > /etc/hosts <<EOF 10.0.0.101 zk101.oldboyedu.com 10.0.0.102 zk102.oldboyedu.com 10.0.0.103 zk103.oldboyedu.com EOF
| 拷贝 /etc/hosts 文件到集群的其它节点上
scp /etc/hosts zk102.oldboyedu.com:/etc/hosts scp /etc/hosts zk103.oldboyedu.com:/etc/hosts| 安装JDK并配置环境变量
温馨提示:JDK官方的下载地址:
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
mkdir -pv /oldboyedu/softwares/ # 手动上传jdk软件包 tar xf jdk-8u301-linux-x64.tar.gz -C /oldboyedu/softwares/ ln -sv /oldboyedu/softwares/jdk1.8.0_301/ /oldboyedu/softwares/jdk # 配置jdk环境变量 cat >/etc/profile.d/jdk.sh<<EOF #!/bin/bash JAVA_HOME=/oldboyedu/softwares/jdk PATH=\$PATH:\$JAVA_HOME/bin EOF # 使环境变量生效 chmod +x /etc/profile.d/jdk.sh source /etc/profile.d/jdk.sh| 部署zookeeper并配置环境变量
# 下载zookeeper wget --no-check-certificate https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz # zookeeper软件部署 mkdir -p /oldboyedu/softwares tar xf apache-zookeeper-3.7.1-bin.tar.gz -C /oldboyedu/softwares/ ln -sv /oldboyedu/softwares/apache-zookeeper-3.7.1-bin/ /oldboyedu/softwares/zookeeper # 配置zookeeper环境变量 cat >/etc/profile.d/zookeeper.sh<<EOF #!/bin/bash ZK_HOME=/oldboyedu/softwares/zookeeper PATH=\$PATH:\$ZK_HOME/bin EOF # 使环境变量生效 chmod +x /etc/profile.d/zookeeper.sh source /etc/profile.d/zookeeper.sh # 创建zookeeper用户并指定家目录 mkdir -p /oldboyedu/data useradd -d /oldboyedu/data/zookeeper zookeeper chown -R zookeeper. /oldboyedu/softwares/apache-zookeeper-3.7.1-bin/ # 配置zookeeper服务 cp /oldboyedu/softwares/apache-zookeeper-3.7.1-bin/conf/zoo_sample.cfg /oldboyedu/softwares/apache-zookeeper-3.7.1-bin/conf/zoo.cfg sed -ri s#(dataDir=)/tmp/zookeeper#\1/oldboyedu/data/zookeeper# /oldboyedu/softwares/apache-zookeeper-3.7.1-bin/conf/zoo.cfg| 配置免密登录
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P # 拷贝密钥 ssh-copy-id root@zk101.oldboyedu.com ssh-copy-id root@zk102.oldboyedu.com ssh-copy-id root@zk103.oldboyedu.com| 关闭防火墙
sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config systemctl stop firewalld systemctl disable firewalldzookeeper集群构建
| 修改zookeeper的配置文件
zookeeper-101的配置 # egrep -v "^#|^$" /oldboyedu/softwares/zookeeper/conf/zoo.cfg tickTime=2000 initLimit=5 syncLimit=2 dataDir=/oldboyedu/data/zookeeper clientPort=2181 clientPortAddress=10.0.0.101 server.101=zk101.oldboyedu.com:2888:3888 server.102=zk102.oldboyedu.com:2888:3888 server.103=zk103.oldboyedu.com:2888:3888 zookeeper-102的配置 # egrep -v "^#|^$" /oldboyedu/softwares/zookeeper/conf/zoo.cfg tickTime=2000 initLimit=5 syncLimit=2 dataDir=/oldboyedu/data/zookeeper clientPort=2181 clientPortAddress=10.0.0.102 server.101=zk101.oldboyedu.com:2888:3888 server.102=zk102.oldboyedu.com:2888:3888 server.103=zk103.oldboyedu.com:2888:3888 zookeeper-103的配置 # egrep -v "^#|^$" /oldboyedu/softwares/zookeeper/conf/zoo.cfg tickTime=2000 initLimit=5 syncLimit=2 dataDir=/oldboyedu/data/zookeeper clientPort=2181 clientPortAddress=10.0.0.103 server.101=zk101.oldboyedu.com:2888:3888 server.102=zk102.oldboyedu.com:2888:3888 server.103=zk103.oldboyedu.com:2888:3888| 创建配置zookeeper的堆内存配置文件
cat >/oldboyedu/softwares/zookeeper/conf/java.env<<EOF #!/bin/bash #指定JDK的安装路径 export JAVA_HOME=/oldboyedu/softwares/jdk #指定zookeeper的heap内存大小 export JVMFLAGS="-Xms256m -Xmx256m \$JVMFLAGS" EOF # 查看JDK的堆内存大小: jmap -heap "java进程的PID"| 编写zookeeper的启动脚本
cat >/oldboyedu/softwares/zookeeper/bin/manager-zk.sh<<EOF #!/bin/bash # 判断用户是否传参 if [ \$# -ne 1 ];then echo "无效参数,用法为: \$0 {start|stop|restart|status}" exit fi # 获取用户输入的命令 cmd=\$1 # 定义函数功能 function zookeeperManger(){ case \$cmd in start) echo "启动服务" remoteExecution start ;; stop) echo "停止服务" remoteExecution stop ;; restart) echo "重启服务" remoteExecution restart ;; status) echo "查看状态" remoteExecution status ;; *) echo "无效参数,用法为: \$0 {start|stop|restart|status}" ;; esac } # 定义执行的命令 function remoteExecution(){ for (( i=101 ; i<=103 ; i++ )) ; do tput setaf 2 echo ========== zk\${i}.oldboyedu.com zkServer.sh \$1 ================ tput setaf 9 ssh zk\${i}.oldboyedu.com "source /etc/profile.d/zookeeper.sh; zkServer.sh \$1" done } # 调用函数 zookeeperManger EOF chmod +x /oldboyedu/softwares/zookeeper/bin/manager-zk.sh温馨提示:
该脚本为串行的脚本,建议改为并行执行的脚本,生产环境中建议改为并行的脚本,或者直接使用ansible来实现管理也可以哟~
| 创建myid文件并写入服务器编号
for (( i=101;i<=103;i++ )) do ssh zk${i}.oldboyedu.com "echo -n $i > /oldboyedu/data/zookeeper/myid" ;done| 查看zookeeper服务
manager-zk.sh status
| 启动zookeeper服务
manager-zk.sh start manager-zk.sh status
| 连接zookeeper集群
zkCli.sh -server "leader服务器的IP:2181"observer角色及其配置
| observer角色特点
observer角色特点如下所示:
不参与集群的leader选举; 不参与集群中写数据时的ack反馈;| 修改配置文件
# egrep -v "^#|^$" /oldboyedu/softwares/zookeeper/conf/zoo.cfg tickTime=2000 initLimit=5 syncLimit=2 dataDir=/oldboyedu/data/zookeeper clientPort=2181 clientPortAddress=10.0.0.101 peerType=observer server.101=zk101.oldboyedu.com:2888:3888:observer server.102=zk102.oldboyedu.com:2888:3888 server.103=zk103.oldboyedu.com:2888:3888温馨提示:
如果我们将某个节点(本案例为zookeeper-101节点)的配置文件中存在"peerType=observer"时,请将"server.101"哪行配置追加":observer"
| 重启集群
manager-zk.sh restart
| 查看集群状态
manager-zk.sh status
| 连接observer节点
zkCli.sh -server 10.0.0.101:2181zookeeper监控命令
| zookeeper常用四字命令

| 部署命令行工具
yum -y install nc telnet| 配置白名单
# egrep -v "^#|^$" /oldboyedu/softwares/zookeeper/conf/zoo.cfg ··· 4lw.commands.whitelist=* ··· # manager-zk.sh restart # 修改以后记得重启服务使之生效!| 基于telnet查看zookeeper集群的状态信息
# telnet zk101.oldboyedu.com 2181 Trying 10.0.0.101... Connected to zk101.oldboyedu.com. Escape character is ^]. conf
| 基于nc查看zookeeper集群的状态信息
echo conf | nc zk101.oldboyedu.com 2181
ZkWeb管理zookeeper集群
| 下载zkWeb
wget https://github.com/zhitom/zkweb/releases/download/zkWeb-v1.2.1/zkWeb-v1.2.1.jar| 启动zkWeb
java -jar zkWeb-v1.2.1.jar| 浏览器访问
浏览器访问启动zkWeb的服务器,端口为8099
http://10.0.0.101:8099

猜你喜欢
- 电脑服装制作设计教程(利用电脑软件与技巧,让你成为时尚设计大师)
 - LVM是Logical Volume Manager(逻辑卷管理器)的简写,又译为逻辑卷宗管理器、逻辑扇区管理器、逻辑磁盘管理器。是Linux核心所提供的逻辑卷管理(Logical Volume Management)功能。它在硬盘的硬盘分区之上,又创建了一个逻辑层以方便系统管理硬盘分区系统。最早由IBM开发,在AIX系统上实现,OS/2操作系统与HP-UX也支持这个功能;在1998年,Heinz Mauelshagen根据HP-UX上的逻辑卷管理器,写作出第一个Linux版本的逻辑卷管理器;并将其发布到Linux社区中,它允许用户在Linux系统上用简单的命令行管理一个完整的逻辑卷管理环境。LVM的优点:它是建立在物理存储设备之上的一个抽象层,允许用户生成逻辑存储卷,与直接使用物理存储在管理上相比,提供了更好灵活性;LVM将存储虚拟化,使用逻辑卷,用户不会受限于物理磁盘的大小;另外,与硬件相关的存储设置被器隐藏,用户可以不用停止应用或卸载文件系统来调整卷大小或数据迁移,可以减少操作成本。LVM与直接使用物理存储相比,有以下优点:1、 灵活的容量当使用逻辑卷时,文件系统可以扩展到多个磁盘上,你可以聚合多个磁盘或磁盘分区成单一的逻辑卷.2、 可伸缩的存储池;你可以使用简单的命令来扩大或缩小逻辑卷大小,不用重新格式化或分区磁盘设备.3、 在线的数据再分配你可以在线移动数据,数据可以在磁盘在线的情况下重新分配.比如,你可以在线更换可热插拔的磁盘.4、 方便的设备命名;逻辑卷可以按你觉得方便的方式来起任何名称.5、 磁盘条块化你可以生成一个逻辑盘,它的数据可以被条块化存储在2个或更多的磁盘上.这样可以明显提升数据吞吐量.6、 镜像卷逻辑卷提供方便的方法来镜像你的数据.7、 卷快照使用逻辑卷,你可以获得设备快照用来一致性备份或者测试数据更新效果而不影响真实数据.2.版本:LVM1 最初的LVM与1998年发布,只在Linux内核2.4版本上可用,它提供最基本的逻辑卷管理。LVM2 LVM-1的更新版本,在Linux内核2.6中才可用,它在标准的LVM-1功能外还提供了额外的功能。查看版本:复制代码代码如下:复制代码代码如下:复制代码代码如下:逻辑卷的创建,就是将多块硬盘创建物理卷,而将这些物理卷以逻辑的形式总成一个容器,然后从这个容器里面创建大小不同的分区文件,而这个容器就是所谓的卷组(VG),而从这个容器里创建大小不同的分区文件,这个分区文件就叫做逻辑卷。LVM实现逻辑卷镜像2、将sdb、sdc、sdd、sde 创建物理卷,将sdb、sdc、sdd 添加卷组到vmTest复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下: 复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:复制代码代码如下:[root@node4 lvmTest]#[root@node4 lvmTest]# lvdisplay --- Logical volume --- LV Path /dev/vgTest/lvTest LV Name lvTest VG Name vgTest LV UUID a8kDmI-R3ls-SfKJ-qx3d-1Tbb-wPAd-TJcQfn LV Write Access read/write LV Creation host, time node4.lansgg.com, 2015-09-10 20:50:41 +0800 LV Status available # open 1 LV Size 1.00 GiB Current LE 256 Mirrored volumes 2 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:5
 - 利用系统自带的网络功能创建热点5、进入Wi-Fi安全选项卡,选择 WPA & WPA2 Personal 并且输入密码。7、 进入IPv6选项卡,在Method(方法)里设置为忽略ignore (只有在你不使用IPv6的情况下这么做) 8、 点击 Save(保存) 按钮以保存配置。a、 把 mode=infrastructure 改成 mode=ap 并且保存文件。11、你现在可以把你的设备连上Wifi了。已经过 Android 5.0的小米4测试。(下载了1GB的文件以测试速度与稳定性)1:安装热点产生工具,hostapd复制代码代码如下:interface=wlan0driver=nl80211ssid=XXXXXX #xxxx是你用手机访问时,看到的无线网络的名字hw_mode=gchannel=10macaddr_acl=0auth_algs=3wpa=2wpa_passphrase=XXXXXX #xxxx是你用手机访问时,需要输入的密码。自己设置一个密码wpa_key_mgmt=WPA-PSKwpa_pairwise=TKIPCCMPrsn_pairwise=TKIPCCMP复制代码代码如下:sudo nano /etc/dhcp/dhcpd.conf在文件的最后添加如下:5:最后一步,写一个脚本,放在你的home目录(或者你认为方便的位置),方便的开启热点复制代码代码如下:#!/bin/bashap.sh脚本做好保存后,修改成为可执行的权限 :复制代码代码如下:sudo ./ap.sh
 - 你可能会有很多理由想要把一个应用、一个用户或者一个环境与你的 linux 系统隔离开来。不同的操作系统有不同的实现方式,而在 linux 中,一个典型的方式就是 chroot 环境。在这份教程中,我会一步一步指导你怎么使用 chroot 命令去配置一个与真实系统分离出来的独立环境。这个功能主要可以用于测试项目,以下这些步骤都在 Ubuntu 14.04 虚拟专用服务器(VPS)上执行。学会快速搭建一个简单的 chroot 环境是一项非常实用的技能,绝大多数系统管理员都能从中受益。Chroot 环境一个 chroot 环境就是通过系统调用,将一个本地目录临时变成根目录。一般所说的系统根目录就是挂载点/,然而使用 chroot 命令后,你可以使用其它目录作为根目录。原则上,任何运行在 chroot 环境内的应用都不能访问系统中其他信息(LCTT译注:使用 chroot 把一个目录变成根目录,在里面运行的应用只能访问本目录内的文件,无法访问到目录外的文件。然而,运行在 chroot 环境的应用可以通过 sysfs 文件系统访问到环境外的信息,所以,这里有个“原则上”的修饰语)。Chroot 环境的用处 测试一个不稳定的应用服务不会影响到整个主机系统。 就算使用 root 权限做了些不当的操作,把 chroot 环境搞得一塌糊涂,也不会影响到主机系统。 可以在你的系统中运行另外一个操作系统。举个例子,你可以在 chroot 环境中编译、安装、测试软件,而不去动真实的系统。你也可以在64位环境下使用 chroot 创建一个32位环境,然后运行一个32位的程序(LCTT泽注:假如你的真实环境是32位的,那就不能 chroot 一个64位的环境了)。但是为了安全考虑,chroot 环境为非特权用户设立了非常严格的限制,而不是提供完整的安全策略。假如你需要的是有完善的安全策略的隔离方案,可以考虑下 LXC、Docker、vservers等等。Debootstrap 和 Schroot使用 chroot 环境需要安装 debootstrap 和 schroot,这两个软件都在 Ubuntu 的镜像源中。其中 schroot 用于创建 chroot 环境。Debootstrap 可以让你通过镜像源安装任何 Debian(或基于 Debian 的)系统,装好的系统会包含最基本的命令。Schroot 命令允许用户使用相同的机制去创建 chroot 环境,但在访问 chroot 环境时会做些权限检查,并且会允许用户做些额外的自动设置,比如挂载一些文件系统。在 Ubuntu 14.04 LTS 上,我们可以通过两步来实现这个功能:1. 安装软件包第一步,在Ubuntu 14.04 LTS 主机系统上安装 debootstrap 和 schroot:复制代码代码如下:$ sudo apt-get install debootstrap $ sudo apt-get install schroot2. 配置 Schroot现在我们有工具在手,需要指定一个目录作为我们的 chroot 环境。这里创建一个目录先:复制代码代码如下:sudo mkdir /linoxide编辑 schroot 的配置文件:复制代码代码如下:sudo nano /etc/schroot/schroot.conf再提醒一下,我们现在是在 Ubuntu 14.04 LTS 系统上。假如我们想测试一个软件包能不能在 Ubuntu 13.10(代号是“Saucy Salamander”) 上运行,就可以在配置文件中添加下面的内容:复制代码代码如下: [saucy] description=Ubuntu Saucy location=/linoxide priority=3 users=arun root-groups=root 根据你的系统要求,调整上面的配置信息。3. 使用 debootstrap 安装32位 Ubuntu 系统Debootstrap 命令会在你的 chroot 环境里面下载安装一个最小系统。只要你能访问镜像源,你就可以安装任何基于 Debian 的系统版本。前面我们已经创建了 /linoxide 目录用于放置 chroot 环境,现在我们可以在这个目录里面运行 debootstrap 了:复制代码代码如下:cd /linoxide sudo debootstrap --variant=buildd --arch amd64 saucy /linoxide/ http://archive.ubuntu.com/ubuntu/ sudo chroot /linoxide /debootstrap/debootstrap --second-stage你可以将 --arch 的参数换成 i386 或其他架构,只要存在这种架构的镜像源。你也可以把镜像源 http://archive.ubuntu.com/ubuntu/ 换成离你最近的镜像源,具体可参考 Ubuntu 官方镜像主页。注意:假如你是在64位系统中创建32位系统,你需要在上面第3行命令中加入 --foreign 选项,就像下面的命令:复制代码代码如下:sudo debootstrap --variant=buildd --foreign --arch i386 saucy /linoxide/ http://archive.ubuntu.com/ubuntu/下载需要一段时间,看你网络带宽性能。最小系统大概有500M。4. 完成 chroot 环境安装完系统后,我们需要做一些收尾工作,确保系统运行正常。首先,保证主机的 fstab 程序能意识到 chroot 环境的存在:复制代码代码如下: sudo nano /etc/fstab在文件最后面添加下面的配置:复制代码代码如下:proc /linoxide/proc proc defaults 0 0 sysfs /linoxide/sys sysfs defaults 0 0保存并关闭文件。挂载一些文件系统到 chroot 环境:复制代码代码如下:$ sudo mount proc /linoxide/proc -t proc $ sudo mount sysfs /linoxide/sys -t sysfs复制 /etc/hosts 文件到 chroot 环境,这样 chroot 环境就可以使用网络了:复制代码代码如下:$ sudo cp /etc/hosts /linoxide/etc/hosts最后使用 schroot -l 命令列出系统上所有的 chroot 环境:复制代码代码如下:$ schroot -l使用下面的命令进入 chroot 环境:复制代码代码如下:$ sudo chroot /linoxide/ /bin/bash测试安装的版本:复制代码代码如下:# lsb_release -a # uname -a为了在 chroot 环境中使用图形界面,你需要设置 DISPLAY 环境变量:复制代码代码如下:$ DISPLAY=:0.0 ./apps目前为止,我已经成功地在 Ubuntu 14.04 LTS 上安装了 Ubuntu 13.10。退出 chroot 环境:复制代码代码如下:# exit清理一下,卸载文件系统:复制代码代码如下:$ sudo umount /test/proc $ sudo umount /test/sys
 - 打造网红电脑钟表的制作教程(用创意与技术,打造属于自己的网红电脑钟表)
 - 木质电脑键盘制作教程(自制环保键盘,让你的打字体验更加亲近大自然)
 - 这些受经济危机的影响,各个公司风云变换,就连我待部门也不例外,心头总是感到很沉重的危机感。偶然瞥见书架上一年前买的《Programming Ruby》,终于决定再次把它拿出来,继续学习,也好为以后的“不测”做个准备。 前几天看到同事用Ubuntu,感觉挺有意思,于是就准备也学习一下,就确定了在Ubuntu下学习Ruby的开发,以及以后的ROR开发。当然首要的任务还是安装Ruby的运行环境。 打开Terminal,输入:ruby -v,提示命令不可用,所以需要安装Ruby的运行环境。 运行:sudo apt-get install ruby,提示输入密码,可是输入密码后,提示没有权限,不知道怎么回事儿。当然是就运行了一下:sudo passwd root,为root账户设置了密码。而后,再次运行安装命令 sudo apt-get install ruby,输入密码(当前账户的密码),竟然开始下载和安装了。 安装完成后,运行:ruby -v,提示当前安装的版本是1.8。不过我从网站看到最新版本是1.9,但是不知道是否这里也有。于是就用了:sudo apt-cache search ruby,在出现的列表中发现了ruby1.9的身影,在尝试: sudo apt-get update ruby 升级没有作用之后,也由于1.8是稳定版本,就不再更换了。 书上提到了irb是一个很好用的ruby交互环境,而且在开发过程中要不断查阅文档,于是就使用: sudo apt-get install irb sudo apt-get install ri 安装了irb环境和ri文档查阅工具。 至此,简单的Ruby开发环境配置完毕。
 - Ubuntu 当今最流行的 Linux 操作系统,在android大行天下之时,Ubuntu 也推出自己的移动操作系统:Ubuntu touch,虽然有些迟,但ubuntu Touch 提出了同时支持使用 Qt/QML 开发原生应用,以及基于 HTML5 的 web 应用,从这里也看出了 Ubuntu 在移动领域的长足眼光。已经发布的版本有 Ubuntukylin、Lubuntu、KUbuntu、ubuntu Gnome。更新信息:Unity has improved support for High-DPI displays.Firefox is updated to version 33 and Chromium is updated to version 38.Gtk updated to version 3.12. Qt updated to version 5.3.Support for IPP Everywhere printers is added, and printers shared from Ubuntu can emulate IPP Everywhere printers.LibreOffice 4.3 brings a lot of improvements including improved PDF support, new features in Writer, Calc and Impress (word processor, spreadsheet and presentations).官方下载:Ubuntu 14.10Ubuntu 14.10国内镜像站点下载地址:中国科学技术大学网易镜像地址(一)网易镜像地址(二)厦门大学开源镜像下载ubuntu daily-live(每日创建版)版本:daily-live官方推荐源地址:http://wiki.ubuntu.org.cn/Qref/Source下载ubuntu-desktop-next(每日创建版)版本测试版本下载
 - 电脑开机错误00005(深入了解电脑开机错误00005,避免数据丢失和系统崩溃)