class="kwhl">class="submitted">转自:http://www.ithierarchy.com/ITH/node/36
class="kwhl">class="submitted">
class="kwhl">class="submitted">Submitted by class="kwhl">class="username" xml:lang="">Justin on Tue, 12/17/2013 - 21:42
class="kwhl">class="content">

class="kwhl">class="field field-name-body field-type-text-with-summary field-label-hidden">

class="kwhl">class="field-items">

class="kwhl">class="field-item even">

I needed to run LSI MegaRaid Storage Manager (vivaldiframework) for my LSI 9260-8i SAS card in my Ubuntu Desktop. Ubuntu is based on Debian so this may also work to get LSI MegaRaid Storage Manager on Debian as well, but I have not yet tried it yet. It took some work but I go it to install so I thought I would tell you how I did it. It is assumed that in the following, when editing a file you are doing it with superuser rights such as opening the files from the comand prompt with "sudo nano /path/to/file/file" or "sudo vi /path/to/file/file"

I found that you need to have a GUI installed (though the install can be done completely by ssh.

root account:

If the root account has not been enabled, it will need to be enabled and have a pasword set

sudo passwd root

sudo passwd -u root

Install prerequisites:

sudo apt-get install alien libstdc++5  rcconf

You also need to install at least Java 7, I am using Java8. I followed the procedure found at: http://www.ubuntugeek.com/how-to-install-oracle-java-7-in-ubuntu-12-04.html and just changed java7 in the command line to java8

 

You need to download the Linux  build from LSI (http://www.lsi.com/support/pages/download-results.aspx?component=Storage+Component&productfamily=RAID+Controllers&productcode=P00066&assettype=Management+Software+and+Tools&productname=MegaRAID+SAS+9260-8i). I initially tried the latest but had some problems with it. It could very well have been a fluk but I just went back to the 13.11.01.00 version that worked just fine.

mkdir ~/LSI

cp 13.11.01.00_Linux_x64_MSM.gz ~/LSI/

cd ~/LSI/

tar xzvf 13.11.01.00_Linux_x64_MSM.gz

cd disk

sudo alien --scripts *.rpm

install deb packages

sudo dpkg --install lib-utils2_1.00-6_all.deb

sudo dpkg --install megaraid-storage-manager_13.11.01-1_all.deb

edit /etc/init.d/vivaldiframeworkd and replace the line

for ((i=0, i < 20, i++))

with

for i in `seq 0 19`

edit "/usr/local/MegaRAID Storage Manager/Framework/startupui.sh" and replace

LD_LIBRARY_PATH=`pwd`:/opt/lsi/Apache:/opt/lsi/Pegasus:/opt/lsi/openssl;export LD_LIBRARY_PATH

with

LD_LIBRARY_PATH=`pwd`:/opt/lsi/Pegasus:/usr/sbin/openssl;export LD_LIBRARY_PATH

configure the service to start automatically:

sudo rcconf

arrow down to the vivaldiframeworkd, if it does not have an "*" in it , hit the space bar to select it, then hit enter or tab to OK

 

Restart the vivaldiframeworkd service:

sudo /etc/init.d/vivaldiframeworkd restart

class="kwhl">class="lightbox-processed" href="http://www.ithierarchy.com/ITH/sites/default/files/u72/LSIAutoStart.JPG" rel="lightbox">

if you want to use the Graphical desktop installed on you box you can access the GUI with

cd "/usr/local/MegaRAID Storage Manager"

./startupui.sh

 

转:https://my.oschina.net/u/2266513/blog/3083003

 

目前Proxmox中文社区源已正式提供镜像服务,镜像更新频率为每10小时,镜像站机房存放在法国巴黎online机房使用阿里云、华为云融合提供国内CDN加速服务。 地址 http://download.proxmox.wiki

class="kwhl">class="hljs shell">class="kwhl">class="hljs-meta">#class="kwhl">class="bash"> 删除企业源
rm -rf /etc/apt/sources.list.d/pve-enterprise.list
class="kwhl">class="hljs-meta">#class="kwhl">class="bash">下载秘钥
wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
class="kwhl">class="hljs-meta">#class="kwhl">class="bash"> 添加社区源
echo "deb http://download.proxmox.wiki/debian/pve stretch pve-no-subscription" >/etc/apt/sources.list.d/pve-install-repo.list

建议同时使用国内debian源

class="kwhl">class="hljs shell">deb http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb-data-original http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb http://mirrors.aliyun.com/debian-security buster/updates main
deb-data-original http://mirrors.aliyun.com/debian-security buster/updates main
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb-data-original http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
deb-data-original http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib

最后执行

class="kwhl">class="hljs shell">apt update
class="kwhl">class="hljs-meta">#class="kwhl">class="bash">apt update&&apt dist-upgrade class="kwhl">class="hljs-comment">#如需升级pve,则执行该命令

最近入了一台独立服务器,如果直接拿来跑项目的话就太浪费资源了。于是打算使用Proxmox VE这款虚拟化管理软件进行VPS管理。

Proxmox VE是一款套开源的虚拟化管理软件,用户可通过网页的方式来管理服务器上使用 kvm 以及 lxc 技术运行的虚拟机。同时提供了一些先进功能的支持,如集群、HA等。

0x00 安装

Proxmox VE是基于Debian进行开发的,主要有两种安装方式。
其一是通过官方提供的iso作为一个全新的系统安装
另一种方式是在已有的Debian系统上安装
手动安装时请务必保证网卡配置正确,若出错的话在不带IPMI的机子上很难处理。

安装完成后即可通过https://ip:8006/访问管理页面

另外,这里记录一下版本升级的方法。由于Proxmox VE是一家商业公司在运营,所以一些功能是需要购买订阅才能使用的,例如说版本更新功能。但是可以通过一些方法绕过限制。注意这些更新方法请勿用于生产环境中。

将软件源更改为测试源

修改/etc/apt/sources.list.d/pve-install-repo.list, 将 pve-no-subscription 修改为pvetest
然后apt三连即可更新为新版本。

class="kwhl">class="hljs sql">apt-get class="kwhl">class="hljs-keyword">update
apt-class="kwhl">class="hljs-keyword">get class="kwhl">class="hljs-keyword">upgrade
apt-class="kwhl">class="hljs-keyword">get dist-class="kwhl">class="hljs-keyword">upgrade

0x01 相关设定

对于kvm虚拟化的虚拟机,若想上传需要用到的iso文件,可以直接通过网页端上传,也可以直接将文件放入/var/lib/vz/template/iso/
如果想对kvm虚拟机的启动参数进行调整,官方提供了api:qm set,具体可参照官方文档
对于lxc虚拟化的虚拟机,可以直接从系统中下载对应发行版的模板,无需自行下载。
可以直接使用LXC自带的api对lxc虚拟机进行管理,注意-n为虚拟机的id。

0x02 网络配置

对于多ip的服务器,本身官方就是按照桥接的方式做好网络配置的,直接在虚拟机中填写分配的ip即可。
对于单ip服务器,可以采用NAT的方法让虚拟机连上外部网络。这里介绍俩种方式。

采用QEMU自带的NAT

对于KVM虚拟机,可以直接在创建虚拟机的时候勾上NAT,这时候就会自动为虚拟机分配一个虚拟的子网并且虚拟机可以通过nat连接到外部网络,基本上是开箱即用。同时也支持端口映射,具体可参考官方wiki下的QEMU port redirection。但之前在使用的过程中,发现这个端口映射并不是很稳定。同时虽然这种方法很简单,但是虚拟机之间是隔离的,无法互通数据,这样就非常不灵活。
同时,LXC虚拟机是没有这种开箱即用的NAT的。

配置iptables创建子网以实现nat

主要思路是创建一个虚拟桥接设备并创建一个子网,然后将所有虚拟机包括宿主机都连接到这个子网内,再开启iptables的NAT功能。
编辑配置文件/etc/interfaces,以下是参考配置

class="kwhl">class="hljs nginx">class="kwhl">class="hljs-attribute">auto vmbr2
iface vmbr2 inet static
    address class="kwhl">class="hljs-number">10.0.0.254
    netmask class="kwhl">class="hljs-number">255.255.255.0
    bridge_ports class="kwhl">class="hljs-literal">none
    bridge_stp class="kwhl">class="hljs-literal">off
    bridge_fd class="kwhl">class="hljs-number">0
    post-up echo class="kwhl">class="hljs-number">1 > /proc/sys/net/ipv4/ip_forward
    post-up iptables -t nat -A POSTROUTING -s class="kwhl">class="hljs-string">'10.0.0.0/24' -o vmbr0 -j MASQUERADE
    post-down iptables -t nat -D POSTROUTING -s class="kwhl">class="hljs-string">'10.0.0.0/24' -o vmbr0 -j MASQUERADE

以上配置创建了vmbr2并且分配了一个子网10.0.0.0/24,同时宿主机(同时亦为网关)在这个子网内的ip为10.0.0.254。然后开启了内核的转发功能与iptables的NAT功能(其中vmbr0为通向外部网络的设备)。
若想添加端口转发直接在iptables中增加相关条目即可。
例如想要将宿主机vmbr0的80端口的tcp连接转发到10.0.0.102的80端口上:
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 10.0.0.102:80
如果想保存转发规则,使之重启后依然有效,则需要在/etc/interfaces相应位置加入

class="kwhl">class="hljs css">class="kwhl">class="hljs-selector-tag">post-up class="kwhl">class="hljs-selector-tag">iptables class="kwhl">class="hljs-selector-tag">-t class="kwhl">class="hljs-selector-tag">nat class="kwhl">class="hljs-selector-tag">-A class="kwhl">class="hljs-selector-tag">PREROUTING class="kwhl">class="hljs-selector-tag">-i class="kwhl">class="hljs-selector-tag">vmbr0 class="kwhl">class="hljs-selector-tag">-p class="kwhl">class="hljs-selector-tag">tcp class="kwhl">class="hljs-selector-tag">--dport 80 class="kwhl">class="hljs-selector-tag">-j class="kwhl">class="hljs-selector-tag">DNAT class="kwhl">class="hljs-selector-tag">--to 10class="kwhl">class="hljs-selector-class="kwhl">class">.0class="kwhl">class="hljs-selector-class="kwhl">class">.0class="kwhl">class="hljs-selector-class="kwhl">class">.102class="kwhl">class="hljs-selector-pseudo">:80
class="kwhl">class="hljs-selector-tag">post-down class="kwhl">class="hljs-selector-tag">iptables class="kwhl">class="hljs-selector-tag">-t class="kwhl">class="hljs-selector-tag">nat class="kwhl">class="hljs-selector-tag">-D class="kwhl">class="hljs-selector-tag">PREROUTING class="kwhl">class="hljs-selector-tag">-i class="kwhl">class="hljs-selector-tag">vmbr0 class="kwhl">class="hljs-selector-tag">-p class="kwhl">class="hljs-selector-tag">tcp class="kwhl">class="hljs-selector-tag">--dport 80 class="kwhl">class="hljs-selector-tag">-j class="kwhl">class="hljs-selector-tag">DNAT class="kwhl">class="hljs-selector-tag">--to 10class="kwhl">class="hljs-selector-class="kwhl">class">.0class="kwhl">class="hljs-selector-class="kwhl">class">.0class="kwhl">class="hljs-selector-class="kwhl">class">.102class="kwhl">class="hljs-selector-pseudo">:80

通过以上方法就能组建一个灵活的子网了,kvm虚拟机和lxc虚拟机都可接入,并且都可以有端口转发。由于没有DHCP服务器所以要自行分配ip。注意创建虚拟机的时候将其挂载到vmbr2端口下。
我的服务器只有一个ip,所以内部组网就只能采取这种这种的方法了hhhh。为了充分利用资源,我将80,443端口转发到内部一台虚拟机上,这台虚拟机再使用nginx反代到内网的其它虚拟机,以充分利用单个ip。

启用BBR优化网络

目前的Proxmox VE版本的linux内核版本比较新,已经包含了bbr模块了。

修改sysctl.conf

class="kwhl">class="hljs ruby">echo class="kwhl">class="hljs-string">"net.core.default_qdisc=fq" class="kwhl">class="hljs-meta">>> /etc/sysctl.conf
echo class="kwhl">class="hljs-string">"net.ipv4.tcp_congestion_control=bbr" class="kwhl">class="hljs-meta">>> /etc/sysctl.conf

保存生效

class="kwhl">class="hljs nginx">class="kwhl">class="hljs-attribute">sysctl -p

检测是否已启用bbr模块

class="kwhl">class="hljs nginx">class="kwhl">class="hljs-attribute">lsmod | grep bbr

如果含有bbr即说明内核内已启用bbr模块

class="kwhl">class="aligncenter size-full wp-image-3329" data-original="/app/get_remote_pic.php?file=http://img.dockerinfo.net/2016/10/20161027203227.jpg" sizes="(max-width: 650px) 100vw, 650px" data-originalset="http://img.dockerinfo.net/2016/10/20161027203227.jpg 650w, http://img.dockerinfo.net/2016/10/20161027203227-300x247.jpg 300w" alt="20161027203227" width="650" height="535" data-tag="bdshare" />

介绍

前段时间网易蜂巢曾经推出蜂巢 Logo T恤,用的正是 Docker 镜像制作,最神奇的是,它最终的镜像大小只有 585字节。

class="kwhl">class="prettyprint">class="kwhl">class="pln">$ docker images class="kwhl">class="pun">|class="kwhl">class="pln"> grep hubclass="kwhl">class="pun">.class="kwhl">class="pln">cclass="kwhl">class="pun">.class="kwhl">class="lit">163.comclass="kwhl">class="pun">/class="kwhl">class="kwd">publicclass="kwhl">class="pun">/class="kwhl">class="pln">logo

REPOSITORY                          TAG     IMAGE ID           CREATED      SIZE

hubclass="kwhl">class="pun">.class="kwhl">class="pln">cclass="kwhl">class="pun">.class="kwhl">class="lit">163.comclass="kwhl">class="pun">/class="kwhl">class="kwd">publicclass="kwhl">class="pun">/class="kwhl">class="pln">logo  latest  class="kwhl">class="lit">6fbdd13cd204class="kwhl">class="pln">  class="kwhl">class="lit">11class="kwhl">class="pln"> days ago  class="kwhl">class="lit">585class="kwhl">class="pln"> B

这其中就用到了不少精简镜像的技术,尤其是针对 C 程序的优化和精简。但我们平常开发肯定不止用 C 语言,甚至有些镜像都不是我们自己来打包的(比如下载公共镜像),那是否有一些通用的精简 Docker 镜像的手段呢? 答案是肯定的 ,甚至有的镜像可以精简 98%。精简镜像大小的好处不言而喻,既节省了存储空间,又能节省带宽,加快传输。那好,接下来就请跟随我来学习怎么一步步精简 Docker 镜像吧。

镜像层(Layers)

在开始制作镜像之前,首先了解下镜像的原理,而这其中最重要的概念就是镜像层(Layers)。镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts)等,幸运的是你可以在很多地方学习到这些技术,这里就不再赘述技术细节。

 

class="kwhl">class="aligncenter size-full wp-image-3330" data-original="/app/get_remote_pic.php?file=http://img.dockerinfo.net/2016/10/20161027203243.jpg" sizes="(max-width: 545px) 100vw, 545px" data-originalset="http://img.dockerinfo.net/2016/10/20161027203243.jpg 545w, http://img.dockerinfo.net/2016/10/20161027203243-300x241.jpg 300w" alt="20161027203243" width="545" height="438" data-tag="bdshare" />

 

总的来说,你最需要记住这点:

在 Dockerfile 中, 每一条指令都会创建一个镜像层,继而会增加整体镜像的大小。

举例来说:

class="kwhl">class="prettyprint">class="kwhl">class="pln">FROM busybox

RUN mkdir class="kwhl">class="pun">/class="kwhl">class="pln">tmpclass="kwhl">class="pun">/class="kwhl">class="pln">foo

RUN dd class="kwhl">class="kwd">ifclass="kwhl">class="pun">=class="kwhl">class="str">/dev/class="kwhl">class="pln">zero ofclass="kwhl">class="pun">=class="kwhl">class="str">/tmp/class="kwhl">class="pln">fooclass="kwhl">class="pun">/class="kwhl">class="pln">bar bsclass="kwhl">class="pun">=class="kwhl">class="lit">1048576class="kwhl">class="pln"> countclass="kwhl">class="pun">=class="kwhl">class="lit">100class="kwhl">class="pln">

RUN rm class="kwhl">class="pun">/class="kwhl">class="pln">tmpclass="kwhl">class="pun">/class="kwhl">class="pln">fooclass="kwhl">class="pun">/class="kwhl">class="pln">bar

以上 Dockerfile 干了这几件事:

  • 基于一个官方的基础镜像 busybox(只有1M多)
  • 创建一个文件夹(/tmp/foo)和一个文件(bar)
  • 为该文件分配了100M大小
  • 再把这个大文件删除

事实上,它最终什么也没做,我们把它构建成镜像看看(构建可以参考一期):

class="kwhl">class="prettyprint">class="kwhl">class="pln">docker build class="kwhl">class="pun">-class="kwhl">class="pln">t busyboxclass="kwhl">class="pun">:class="kwhl">class="pln">test class="kwhl">class="pun">.

再让我们来对比下原生的 busybox 镜像大小和我们生成的镜像大小:

class="kwhl">class="prettyprint">class="kwhl">class="pln">$ docker images class="kwhl">class="pun">|class="kwhl">class="pln"> grep

busyboxbusybox    test     class="kwhl">class="lit">896c63dbdb96class="kwhl">class="pln">    class="kwhl">class="lit">2class="kwhl">class="pln"> seconds ago    class="kwhl">class="lit">106class="kwhl">class="pln"> MB

busybox    latest   class="kwhl">class="lit">2b8fd9751c4cclass="kwhl">class="pln">    class="kwhl">class="lit">9class="kwhl">class="pln"> weeks ago      class="kwhl">class="lit">1.093class="kwhl">class="pln"> MB

出乎意料的是,却生成了 106 MB 的镜像。

多出了 100 M,这是为何?这点和 git 类似(都用到了Copy-On-Write技术),我用 git 做了如下两次提交(添加了又删除),请问 A_VERY_LARGE_FILE 还在 git 仓库中吗?

class="kwhl">class="prettyprint">class="kwhl">class="pln">$ git add  A_VERY_LARGE_FILE

$ git commit

$ git rm  A_VERY_LARGE_FILE

$ git commit

答案是: 在的 ,并且会占用仓库的大小。Git 会保存每一次提交的文件版本,而 Dockerfile 中每一条指令都可能增加整体镜像的大小,即使它最终什么事情都没做。

精简步骤

了解了镜像层知识,有助于我们接下来制作精简镜像。这里开始,以最常用的开源缓存软件 Redis 为例,从一步步试验,来介绍如何制作更精简的 Docker 镜像

步骤 1:初始化构建 Redis 镜像

直接上 Dockerfile :

class="kwhl">class="prettyprint">class="kwhl">class="pln">FROM ubuntuclass="kwhl">class="pun">:class="kwhl">class="pln">trusty

ENV VER     class="kwhl">class="lit">3.0class="kwhl">class="pun">.class="kwhl">class="lit">0class="kwhl">class="pln">

ENV TARBALL httpclass="kwhl">class="pun">:class="kwhl">class="com">//download.redis.io/releases/redis-$VER.tar.gz

class="kwhl">class="com"># ==> Install curl and helper tools...class="kwhl">class="pln">

RUN aptclass="kwhl">class="pun">-class="kwhl">class="kwd">getclass="kwhl">class="pln"> update

RUN aptclass="kwhl">class="pun">-class="kwhl">class="kwd">getclass="kwhl">class="pln"> install class="kwhl">class="pun">-class="kwhl">class="pln">y  curl make gcc

class="kwhl">class="com"># ==> Download, compile, and install...class="kwhl">class="pln">

RUN curl class="kwhl">class="pun">-class="kwhl">class="pln">L $TARBALL class="kwhl">class="pun">|class="kwhl">class="pln"> tar zxv

WORKDIR  redisclass="kwhl">class="pun">-class="kwhl">class="pln">$VER

RUN make

RUN make install

class="kwhl">class="com">#...

class="kwhl">class="com"># ==> Clean up...class="kwhl">class="pln">

WORKDIR class="kwhl">class="pun">/class="kwhl">class="pln">

RUN aptclass="kwhl">class="pun">-class="kwhl">class="kwd">getclass="kwhl">class="pln"> remove class="kwhl">class="pun">-class="kwhl">class="pln">y class="kwhl">class="pun">--class="kwhl">class="kwd">autoclass="kwhl">class="pun">-class="kwhl">class="pln">remove curl make gcc

RUN aptclass="kwhl">class="pun">-class="kwhl">class="kwd">getclass="kwhl">class="pln"> clean

RUN rm class="kwhl">class="pun">-class="kwhl">class="pln">rf class="kwhl">class="pun">/class="kwhl">class="kwd">varclass="kwhl">class="pun">/class="kwhl">class="pln">libclass="kwhl">class="pun">/class="kwhl">class="pln">aptclass="kwhl">class="pun">/class="kwhl">class="pln">listsclass="kwhl">class="com">/*  /redis-$VER

#...

CMD ["redis-server"]

结合注释,读起来并不困难,用到的都是常规的几个命令,简要介绍如下:

  • FROM:顶头写,指定一个基础镜像,此处基于 ubuntu:trusty
  • ENV:设置环境变量,这里设置了 VER 和 TARBALL 两个环境变量
  • RUN:最常用的 Dockerfile 指令,用于运行各种命令,这里调用了 8 次 RUN 指令
  • WORKDIR:指定工作目录,相当于指令 cd
  • CMD:指定镜像默认执行的命令,此处默认执行 redis-server 命令来启动 redis

执行构建:

class="kwhl">class="prettyprint">class="kwhl">class="pln">$ docker build  class="kwhl">class="pun">-class="kwhl">class="pln">t redisclass="kwhl">class="pun">:class="kwhl">class="pln">labclass="kwhl">class="pun">-class="kwhl">class="lit">1class="kwhl">class="pln">  class="kwhl">class="pun">.

注:国内网络,更新下载可能会较慢

查看大小:

 

class="kwhl">class="aligncenter size-full wp-image-3332" data-original="/app/get_remote_pic.php?file=http://img.dockerinfo.net/2016/10/20161027203303.jpg" sizes="(max-width: 435px) 100vw, 435px" data-originalset="http://img.dockerinfo.net/2016/10/20161027203303.jpg 435w, http://img.dockerinfo.net/2016/10/20161027203303-300x62.jpg 300w" alt="20161027203303" width="435" height="90" data-tag="bdshare" />

 

动辄就有 300多 M 的大小,不能忍,下面我们开始一步步优化。

步骤 2: 优化基础镜像

方法:选用更小的基础镜像。

常用的 Linux 系统镜像一般有 ubuntu、centos、debian,其中debian 更轻量,而且够用,对比如下:

class="kwhl">class="prettyprint">class="kwhl">class="pln">REPOSITORY     TAG        IMAGE ID           VIRTUAL SIZE

class="kwhl">class="pun">---------------class="kwhl">class="pln">           class="kwhl">class="pun">------class="kwhl">class="pln">          class="kwhl">class="pun">------------class="kwhl">class="pln">                class="kwhl">class="pun">------------class="kwhl">class="pln">

centos              class="kwhl">class="lit">7class="kwhl">class="pln">               class="kwhl">class="lit">214a4932132aclass="kwhl">class="pln">     class="kwhl">class="lit">215.7class="kwhl">class="pln"> MB

centos              class="kwhl">class="lit">6class="kwhl">class="pln">               f6808a3e4d9e      class="kwhl">class="lit">202.6class="kwhl">class="pln"> MB

ubuntu              trusty       d0955f21bf24      class="kwhl">class="lit">188.3class="kwhl">class="pln"> MB

ubuntu              precise    class="kwhl">class="lit">9c5e4be642b7class="kwhl">class="pln">     class="kwhl">class="lit">131.9class="kwhl">class="pln"> MB

debian              jessie       class="kwhl">class="lit">65688f7c61c4class="kwhl">class="pln">      class="kwhl">class="lit">122.8class="kwhl">class="pln"> MB

debian              wheezy    class="kwhl">class="lit">1265e16d0c28class="kwhl">class="pln">      class="kwhl">class="lit">84.96class="kwhl">class="pln"> MB

替换 debian:jessie 作为我们的基础镜像。

优化 Dockerfile:

class="kwhl">class="prettyprint">class="kwhl">class="pln">FROM debianclass="kwhl">class="pun">:class="kwhl">class="pln">jessie

class="kwhl">class="com">#...

执行构建:

class="kwhl">class="prettyprint">class="kwhl">class="pln">$ docker build  class="kwhl">class="pun">-class="kwhl">class="pln">t redisclass="kwhl">class="pun">:class="kwhl">class="pln">labclass="kwhl">class="pun">-class="kwhl">class="lit">2class="kwhl">class="pln">  class="kwhl">class="pun">.

查看大小:

 

class="kwhl">class="aligncenter size-full wp-image-3331" data-original="/app/get_remote_pic.php?file=http://img.dockerinfo.net/2016/10/20161027203254.jpg" sizes="(max-width: 441px) 100vw, 441px" data-originalset="http://img.dockerinfo.net/2016/10/20161027203254.jpg 441w, http://img.dockerinfo.net/2016/10/20161027203254-300x91.jpg 300w" alt="20161027203254" width="441" height="134" data-tag="bdshare" />

 

减少了42M,稍有成效,但并不明显。细心的同学应该发现,只有 122 MB 的 debian 基础镜像,构建后增加到了 305 MB,看来这里面肯定有优化的空间,如何优化就要用到我们开头说到的 Image Layer 知识了。

步骤 3:串联 Dockerfile 指令

方法: 串联你的 Dockerfile 指令(一般是 RUN 指令)。

Dockerfile 中的 RUN 指令通过 && 和 / 支持将命令串联在一起,有时能达到意想不到的精简效果。

优化 Dockerfile:

class="kwhl">class="prettyprint">class="kwhl">class="pln">FROM debianclass="kwhl">class="pun">:class="kwhl">class="pln">jessie

ENV VER     class="kwhl">class="lit">3.0class="kwhl">class="pun">.class="kwhl">class="lit">0class="kwhl">class="pln">

ENV TARBALL httpclass="kwhl">class="pun">:class="kwhl">class="com">//download.redis.io/releases/redis-$VER.tar.gzclass="kwhl">class="pln">




RUN echo class="kwhl">class="str">"==> Install curl and helper tools..."class="kwhl">class="pln">  class="kwhl">class="pun">&&class="kwhl">class="pln"> \     aptclass="kwhl">class="pun">-class="kwhl">class="kwd">getclass="kwhl">class="pln"> update                      class="kwhl">class="pun">&&class="kwhl">class="pln"> \   

  aptclass="kwhl">class="pun">-class="kwhl">class="kwd">getclass="kwhl">class="pln"> install class="kwhl">class="pun">-class="kwhl">class="pln">y  curl make gcc   class="kwhl">class="pun">&&class="kwhl">class="pln"> \  

  \   

  echo class="kwhl">class="str">"==> Download, compile, and install..."class="kwhl">class="pln">  class="kwhl">class="pun">&&class="kwhl">class="pln"> \  

  curl class="kwhl">class="pun">-class="kwhl">class="pln">L $TARBALL class="kwhl">class="pun">|class="kwhl">class="pln"> tar zxv  class="kwhl">class="pun">&&class="kwhl">class="pln"> \   

  cd redisclass="kwhl">class="pun">-class="kwhl">class="pln">$VER               class="kwhl">class="pun">&&class="kwhl">class="pln"> \   

  make                        class="kwhl">class="pun">&&class="kwhl">class="pln"> \   

  make install                class="kwhl">class="pun">&&class="kwhl">class="pln"> \   

  class="kwhl">class="pun">...class="kwhl">class="pln">   

  echo class="kwhl">class="str">"==> Clean up..."class="kwhl">class="pln">  class="kwhl">class="pun">&&class="kwhl">class="pln"> \   

  aptclass="kwhl">class="pun">-class="kwhl">class="kwd">getclass="kwhl">class="pln"> remove class="kwhl">class="pun">-class="kwhl">class="pln">y class="kwhl">class="pun">--class="kwhl">class="kwd">autoclass="kwhl">class="pun">-class="kwhl">class="pln">remove curl make gcc  class="kwhl">class="pun">&&class="kwhl">class="pln"> \

  aptclass="kwhl">class="pun">-class="kwhl">class="kwd">getclass="kwhl">class="pln"> clean                                  class="kwhl">class="pun">&&class="kwhl">class="pln"> \   

  rm class="kwhl">class="pun">-class="kwhl">class="pln">rf class="kwhl">class="pun">/class="kwhl">class="kwd">varclass="kwhl">class="pun">/class="kwhl">class="pln">libclass="kwhl">class="pun">/class="kwhl">class="pln">aptclass="kwhl">class="pun">/class="kwhl">class="pln">listsclass="kwhl">class="com">/*  /redis-$VER




#...

CMD ["redis-server"]

构建:

class="kwhl">class="prettyprint">class="kwhl">class="pln">$ docker build  class="kwhl">class="pun">-class="kwhl">class="pln">t redisclass="kwhl">class="pun">:class="kwhl">class="pln">labclass="kwhl">class="pun">-class="kwhl">class="lit">3class="kwhl">class="pln">  class="kwhl">class="pun">.

查看大小:

 

class="kwhl">class="aligncenter size-full wp-image-3333" data-original="/app/get_remote_pic.php?file=http://img.dockerinfo.net/2016/10/20161027203318.jpg" sizes="(max-width: 437px) 100vw, 437px" data-originalset="http://img.dockerinfo.net/2016/10/20161027203318.jpg 437w, http://img.dockerinfo.net/2016/10/20161027203318-300x117.jpg 300w" alt="20161027203318" width="437" height="170" data-tag="bdshare" />

 

哇!一下子减少了 50%,效果明显啊!这是最常用的一个精简手段了。

步骤 4:压缩你的镜像

方法:试着用命令或工具压缩你的镜像。

docker 自带的一些命令还能协助压缩镜像,比如 export 和 import

class="kwhl">class="prettyprint">class="kwhl">class="pln">$ docker run class="kwhl">class="pun">-class="kwhl">class="pln">d redisclass="kwhl">class="pun">:class="kwhl">class="pln">labclass="kwhl">class="pun">-class="kwhl">class="lit">3class="kwhl">class="pln">

$ docker class="kwhl">class="kwd">export class="kwhl">class="lit">71b1c0ad0a2b class="kwhl">class="pun">|class="kwhl">class="pln"> docker class="kwhl">class="kwd">import class="kwhl">class="pun">-class="kwhl">class="pln"> redisclass="kwhl">class="pun">:class="kwhl">class="pln">labclass="kwhl">class="pun">-class="kwhl">class="lit">4

但麻烦的是需要先将容器运行起来,而且这个过程中你会丢失镜像原有的一些信息,比如:导出端口,环境变量,默认指令。

所以一般通过命令行来精简镜像都是实验性的,那么这里再推荐一个小工具: docker-squash。用起来更简单方便,并且不会丢失原有镜像的自带信息。

下载安装:

https://github.com/jwilder/docker-squash#installation(复制此链接到浏览器打开)

压缩操作:

class="kwhl">class="prettyprint">class="kwhl">class="pln">$ docker save redisclass="kwhl">class="pun">:class="kwhl">class="pln">labclass="kwhl">class="pun">-class="kwhl">class="lit">3class="kwhl">class="pln"> \ 

  class="kwhl">class="pun">|class="kwhl">class="pln"> sudo dockerclass="kwhl">class="pun">-class="kwhl">class="pln">squash class="kwhl">class="pun">-class="kwhl">class="pln">verbose class="kwhl">class="pun">-class="kwhl">class="pln">t redisclass="kwhl">class="pun">:class="kwhl">class="pln">labclass="kwhl">class="pun">-class="kwhl">class="lit">4class="kwhl">class="pln">  \ 

  class="kwhl">class="pun">|class="kwhl">class="pln"> docker load

注: 该工具在 Mac 下并不好使,请在 Linux 下使用

对比大小:

 

class="kwhl">class="aligncenter size-full wp-image-3334" data-original="/app/get_remote_pic.php?file=http://img.dockerinfo.net/2016/10/20161027203328.jpg" sizes="(max-width: 435px) 100vw, 435px" data-originalset="http://img.dockerinfo.net/2016/10/20161027203328.jpg 435w, http://img.dockerinfo.net/2016/10/20161027203328-300x141.jpg 300w" alt="20161027203328" width="435" height="204" data-tag="bdshare" />

 

好吧,从这里看起来并没有太大作用,所以我只能说试着,而不要报太大期望。

总结

本期我们介绍了镜像层的知识,并且通过实验,介绍三种如何精简镜像的技巧(下期还有更强大的技巧)。这里主要介绍了三种精简方法:选用更精小的镜像,串联 Dockerfile 运行指令,以及试着压缩你的镜像。通过这几个技巧,已经可以将 300M 大小的镜像压缩到 150M,压缩率50%,效果还是不错。但这还远远不够,下篇我们将介绍一些终极手段,压缩效果可以达到 98%哦!

class="kwhl">class="tag_link" title="View all posts in Let's Encrypt" href="http://www.laozuo.org/tag/lets-encrypt" target="_blank">Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持。

class="kwhl">class="tag_link" title="View all posts in Let's Encrypt免费SSL" href="http://www.laozuo.org/tag/lets-encrypt%e5%85%8d%e8%b4%b9ssl" target="_blank">Let's Encrypt免费SSL证书的出现,也会对传统提供付费SSL证书服务的商家有不小的打击。到目前为止,Let's Encrypt获得IdenTrust交叉签名,这就是说可以应用且支持包括FireFox、Chrome在内的主流浏览器的兼容和支持,虽然目前是公测阶段,但是也有不少的用户在自有网站项目中正式使用起来。

class="kwhl">class="alignnone size-full wp-image-7680" data-original="/app/get_remote_pic.php?file=https://images.laozuo.org/wp-content/uploads/2015/12/letsencrypt-1.jpg" alt="实战申请Let's Encrypt永久免费SSL证书过程教程及常见问题" width="600" height="450" />

在今年黑色星期五的时候,Namecheap各种促销活动中也包括年费0.88美元的SSL证书,当时老左也有购买了2个备用学习和适当的放到一些网站中看看效果(据说英文网站谷歌会很喜欢),当时冷雨同学就建议到时候直接使用class="kwhl">class="tag_link" title="View all posts in Let's Encrypt免费SSL" href="http://www.laozuo.org/tag/lets-encrypt%e5%85%8d%e8%b4%b9ssl" target="_blank">Let's Encrypt免费SSL,毕竟有很多大公司支持的,比一些小公司提供的免费SSL证书靠谱很多。

虽然目前Let's Encrypt免费SSL证书默认是90天有效期,但是我们也可以到期自动续约,不影响我们的尝试和使用,为了考虑到文章的真实性和以后的实战性,老左准备利用一些时间分篇幅的展现在应用Let's Encrypt证书的过程,这篇文章分享申请的方法教程。

第一、安装Let's Encrypt前的准备工作

根据官方的要求,我们在VPS、服务器上部署Let's Encrypt免费SSL证书之前,需要系统支持Python2.7以上版本以及支持GIT工具。这个需要根据我们不同的系统版本进行安装和升级,因为有些服务商提供的版本兼容是完善的,尤其是debian环境兼容性比CentOS好一些。

比如CentOS 6 64位环境不支持GIT,我们还可以参考"Linux CentOS 6 64位系统安装Git工具环境教程"和"9步骤升级CentOS5系统Python版本到2.7"进行安装和升级。最为 简单的就是Debian环境不支持,可以运行"apt-get -y install git"直接安装支持,如果是CentOS直接运行"yum -y install git-core"支持。这个具体遇到问题在讨论和搜索解决方案,因为每个环境、商家发行版都可能不同。在这篇文章中,老左采用的是debian 7 环境。

第二、快速获取Let's Encrypt免费SSL证书

在之前的博文中老左也分享过几篇关于SSL部署的过程,我自己也搞的晕乎晕乎的,获取证书和布局还是比较复杂的,Let's Encrypt肯定是考虑到推广HTTPS的普及型会让用户简单的获取和部署SSL证书,所以可以采用下面简单的一键部署获取证书。

PS:在获取某个站点证书文件的时候,我们需要在安装PYTHON2.7以及GIT,更需要将域名解析到当前VPS主机IP中。

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly --standalone --email admin@laozuo.org -d laozuo.org -d www.laozuo.org

然后执行上面的脚本,我们需要根据自己的实际站点情况将域名更换成自己需要部署的。

class="kwhl">class="alignnone size-full wp-image-7681" data-original="/app/get_remote_pic.php?file=https://images.laozuo.org/wp-content/uploads/2015/12/letsencrypt-2.jpg" alt="快速获取Let's Encrypt免费SSL证书" width="648" height="375" />

看到这个界面,直接Agree回车。

class="kwhl">class="alignnone size-full wp-image-7682" data-original="/app/get_remote_pic.php?file=https://images.laozuo.org/wp-content/uploads/2015/12/letsencrypt-3.jpg" alt="Let's Encrypt安装成功" width="648" height="280" />

然后看到这个界面表示部署成功。目前根据大家的反馈以及老左的测试,如果域名是用的国内DNS,包括第三那方DNSPOD等,都可能获取不到域名信息。

class="kwhl">class="alignnone wp-image-7683 size-full" data-original="/app/get_remote_pic.php?file=https://images.laozuo.org/wp-content/uploads/2015/12/letsencrypt-4.jpg" alt="Let's Encrypt国内域名DNS不支持" width="648" height="134" />

这里我们可以看到有"The server could not connect to the client to verify the  domain"的错误提示信息,包括也有其他提示错误,"The server experienced an internal error :: Error creating new registration"我们在邮局的时候不要用国内免费邮局。所以,如果我们是海外域名就直接先用域名自带的DNS。

第三、Let's Encrypt免费SSL证书获取与应用

在完成Let's Encrypt证书的生成之后,我们会在"/etc/letsencrypt/live/laozuo.org/"域名目录下有4个文件就是生成的密钥证书文件。

cert.pem  - Apache服务器端证书
chain.pem  - Apache根证书和中继证书
fullchain.pem  - Nginx所需要ssl_certificate文件
privkey.pem - 安全证书KEY文件

如果我们使用的Nginx环境,那就需要用到fullchain.pem和privkey.pem两个证书文件,在部署Nginx的时候需要用到(参考:LNMP一键包环境安装SSL安全证书且部署HTTPS网站URL过程)。在这篇文章中老左就不详细演示Let's Encrypt证书证书的安装,后面再重新折腾一篇文章详细的部署证书的安装Nginx和Apache。

ssl_certificate /etc/letsencrypt/live/laozuo.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/laozuo.org/privkey.pem;

比如我们在Nginx环境中,只要将对应的ssl_certificate和ssl_certificate_key路径设置成我们生成的2个文件就可以,最好不要移动和复制文件,因为续期的时候直接续期生成的目录文件就可以,不需要再手工复制。

第四、解决Let's Encrypt免费SSL证书有效期问题

我们从生成的文件中可以看到,Let's Encrypt证书是有效期90天的,需要我们自己手工更新续期才可以。

./letsencrypt-auto certonly --renew-by-default --email admin@laozuo.org -d laozuo.org -d www.laozuo.org

这样我们在90天内再去执行一次就可以解决续期问题,这样又可以继续使用90天。如果我们怕忘记的话也可以制作成定时执行任务,比如每个月执行一次。

第五、关于Let's Encrypt免费SSL证书总结

通过以上几个步骤的学习和应用,我们肯定学会了利用Let's Encrypt免费生成和获取SSL证书文件,随着Let's Encrypt的应用普及,SSL以后直接免费不需要购买,因为大部分主流浏览器都支持且有更多的主流商家的支持和赞助,HTTPS以后看来也是趋势。在Let's Encrypt执行过程在中我们需要解决几个问题。

A - 域名DNS和解析问题。在配置Let's Encrypt免费SSL证书的时候域名一定要解析到当前VPS服务器,而且DNS必须用到海外域名DNS,如果用国内免费DNS可能会导致获取不到错误。

B - 安装Let's Encrypt部署之前需要服务器支持PYTHON2.7以及GIT环境,要不无法部署。

C - Let's Encrypt默认是90天免费,需要手工或者自动续期才可以继续使用。

本文固定链接: http://www.laozuo.org/7676.html | 老左博客

转:http://www.senra.me/remove-proxmox-ve-dont-have-valid-subscription-notice/

一.问

最近把我的OVH独服重装了下,打算用Proxmox开点VM来用,省得一直吃灰(雾,安装很简单,毕竟是OVH提供的模板,但是,这玩意每次登陆都会有个蛋疼的提示(You do not have a valid subscription for this server. Please visit www.class="kwhl">class="st_tag internal_tag" title="Posts tagged with proxmox" href="http://www.senra.me/tag/proxmox/" rel="tag">proxmox.com to get a list of available options.),而且找了半天没找到有关的地方,然后去官网看了下订阅的价格,呵呵呵,我还是自己想办法吧……

class="kwhl">class="alignnone size-full wp-image-454 sl_lazyimg" data-original="/app/get_remote_pic.php?file=http://ucdn.senra.me/2017/04/proxmoxve_invalid_sub_notice.png" alt="" width="679" height="204" />

二.解

对于一个网页,要明白它到底发生了什么,那当然是直接F12怼一波,看了下控制台发现有个pvemanagerlib.js,看看名字就觉得很像是这玩意在搞事啊,右击在新页面打开,看看内容,首先根据之前的提示文字来搜索

class="kwhl">class="alignnone size-full wp-image-456 responsively-lazy" data-original="/app/get_remote_pic.php?file=http://ucdn.senra.me/2017/04/pve_warn_text.png" sizes="(max-width: 1589px) 100vw, 1589px" data-originalset="http://cdn.senra.me/wp-content/uploads/2017/04/pve_warn_text-768x100.png" alt="" width="1589" height="206" data-data-originalset="http://cdn.senra.me/wp-content/uploads/2017/04/pve_warn_text.png 1589w, http://cdn.senra.me/wp-content/uploads/2017/04/pve_warn_text-768x100.png 768w" />

很好,找到目标,然后再次搜索noSubKeyHtml

class="kwhl">class="alignnone size-full wp-image-457 sl_lazyimg" data-original="/app/get_remote_pic.php?file=http://ucdn.senra.me/2017/04/pve_warn_action.png" alt="" width="641" height="461" />

一切顺利,找到了执行订阅检测的地方,现在简单了,直接改判断条件或者怼掉show操作都行,问题来了,这个文件在浏览器里又不能改,它到底在哪?

其实很简单,随便locate一下就找到了,我们先用cp备份一下,然后开始修改这个文件

class="kwhl">class="alignnone size-full wp-image-455 sl_lazyimg" data-original="/app/get_remote_pic.php?file=http://ucdn.senra.me/2017/04/pvemanagerlibjs_loc.png" alt="" width="371" height="82" />

然后注销重新登录,一切OK,世界清静

转:http://www.senra.me/add-internal-adapter-for-proxmox-to-secure-intranet-communication/

一.锲子

最近在配置hadoop过程中为了让各节点使用内网通信,研究了下怎么在proxmox下添加内网地址,一开始觉得挺容易,然后发现有点小坑,记录下。

二.Here We Go

首先需要在宿主机上添加个内网网卡,可以使用Proxmox添加,也可以直接改配置文件,效果一样,面板如下,vlan aware随意

class="kwhl">class="alignnone size-full wp-image-463 sl_lazyimg" data-original="/app/get_remote_pic.php?file=http://ucdn.senra.me/2017/04/proxmox_internal_br.png" alt="" width="598" height="294" />

编辑文件的话需要修改/etc/network/interfaces ,添加如下,同样vlan aware 随意

class="kwhl">class="crayon-syntax crayon-theme-sublime-text crayon-font-sourcecodepro crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover disable-anim wrap">

class="kwhl">class="crayon-plain-wrap">
class="kwhl">class="crayon-main">

class="kwhl">class="crayon-table">

class="kwhl">class="crayon-row">

class="kwhl">class="crayon-nums " data-settings="show">

class="kwhl">class="crayon-nums-content">

class="kwhl">class="crayon-num" data-line="crayon-591f5d6631ec0066478681-1">1
class="kwhl">class="crayon-num" data-line="crayon-591f5d6631ec0066478681-2">2
class="kwhl">class="crayon-num" data-line="crayon-591f5d6631ec0066478681-3">3
class="kwhl">class="crayon-num" data-line="crayon-591f5d6631ec0066478681-4">4
class="kwhl">class="crayon-num" data-line="crayon-591f5d6631ec0066478681-5">5
class="kwhl">class="crayon-num" data-line="crayon-591f5d6631ec0066478681-6">6
class="kwhl">class="crayon-num" data-line="crayon-591f5d6631ec0066478681-7">7
class="kwhl">class="crayon-num" data-line="crayon-591f5d6631ec0066478681-8">8
class="kwhl">class="crayon-code">

class="kwhl">class="crayon-pre">

class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">auto class="kwhl">class="crayon-e">vmbr2
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">iface class="kwhl">class="crayon-e">vmbr2 class="kwhl">class="crayon-e">inet class="kwhl">class="crayon-m">static
class="kwhl">class="crayon-line">class="kwhl">class="crayon-i">address class="kwhl">class="crayon-cn">10.10.10.254
class="kwhl">class="crayon-line">class="kwhl">class="crayon-i">netmask class="kwhl">class="crayon-cn">255.255.255.0
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">bridge_ports class="kwhl">class="crayon-e">none
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">bridge_stp class="kwhl">class="crayon-e">off
class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">bridgeclass="kwhl">class="crayon-sy">_fd class="kwhl">class="crayon-cn">0
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">bridge_vlan_aware class="kwhl">class="crayon-v">yes

之后我们便为宿主机添加了一个内网网卡,地址为10.10.10.254

之后我们在创建的容器或是虚拟机上同样添加一个网卡,mac地址会自动生成,网关就写宿主机的,桥接写我们添加的那个网卡,然后就可以了

class="kwhl">class="alignnone size-full wp-image-464 sl_lazyimg" data-original="/app/get_remote_pic.php?file=http://ucdn.senra.me/2017/04/proxmox_vm_internal_eth.png" alt="" width="600" height="265" />

PS.需要注意的有一点,先加内网地址后加外网地址,否则默认路由会是内网,这个是个坑,我一开始没在意然后发现怎么也访问不了

转:http://www.senra.me/add-tun-tap-support-for-proxmox-ve-4-lxc-containers/

一.为什么

class="kwhl">class="st_tag internal_tag" title="Posts tagged with proxmox" href="http://www.senra.me/tag/proxmox/" rel="tag">Proxmox VE 4将3代的OpenVZ支持去除换成了LXC,算是跟随趋势吧,但是LXC和OpenVZ还是有挺多不同的,在权限上更是如此,而网上最多的还是OVZ相关的教程,LXC的是真的少,不过一直以来没需求,所以没怎么折腾,最近在搞内网,所以为了用Tunnel还是得把TUN/TAP支持打开。

二.怎么办

首先当然是谷歌咯,关键词选得好马上出结果,proxmox官方论坛讨论贴 https://forum.class="kwhl">class="st_tag internal_tag" title="Posts tagged with proxmox" href="http://www.senra.me/tag/proxmox/" rel="tag">proxmox.com/threads/class="kwhl">class="st_tag internal_tag" title="Posts tagged with tun" href="http://www.senra.me/tag/tun/" rel="tag">tun-devices-in-ve-4-class="kwhl">class="st_tag internal_tag" title="Posts tagged with lxc" href="http://www.senra.me/tag/lxc/" rel="tag">lxc.23473

总结一下

①.如果需要对所有(之后创建的)LXC容器全部开启tun/class="kwhl">class="st_tag internal_tag" title="Posts tagged with tap" href="http://www.senra.me/tag/tap/" rel="tag">tap

那么需要修改/etc/class="kwhl">class="st_tag internal_tag" title="Posts tagged with lxc" href="http://www.senra.me/tag/lxc/" rel="tag">lxc/default.conf,添加lxc.cgroup.devices.allow = c 10:200 rwm

当然,也可以创建/usr/share/class="kwhl">class="st_tag internal_tag" title="Posts tagged with lxc" href="http://www.senra.me/tag/lxc/" rel="tag">lxc/config/common.conf.d/02-tuntap.conf 这样的配置文件来取得同样的效果

②.而如果只要对指定容器有效,则需要修改/etc/pve/class="kwhl">class="st_tag internal_tag" title="Posts tagged with lxc" href="http://www.senra.me/tag/lxc/" rel="tag">lxc/[ID].conf , [ID]为你的容器编号

还没完,这样只是给了权限,实际上还没好,需要在容器的/etc/rc.local 自启动文件中添加如下

class="kwhl">class="crayon-syntax crayon-theme-sublime-text crayon-font-sourcecodepro crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover disable-anim wrap">

class="kwhl">class="crayon-plain-wrap">
class="kwhl">class="crayon-main">

class="kwhl">class="crayon-table">

class="kwhl">class="crayon-row">

class="kwhl">class="crayon-nums " data-settings="show">

class="kwhl">class="crayon-nums-content">

class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a17631646175-1">1
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a17631646175-2">2
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a17631646175-3">3
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a17631646175-4">4
class="kwhl">class="crayon-code">

class="kwhl">class="crayon-pre">

class="kwhl">class="crayon-line">class="kwhl">class="crayon-st">if class="kwhl">class="crayon-o">! class="kwhl">class="crayon-sy">[ class="kwhl">class="crayon-o">-class="kwhl">class="crayon-i">c class="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">devclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">netclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-i">tun class="kwhl">class="crayon-sy">]class="kwhl">class="crayon-sy">; class="kwhl">class="crayon-st">then
class="kwhl">class="crayon-line"> class="kwhl">class="crayon-i">mkdir class="kwhl">class="crayon-o">-class="kwhl">class="crayon-i">p class="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">devclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-i">net
class="kwhl">class="crayon-line"> class="kwhl">class="crayon-i">mknod class="kwhl">class="crayon-o">-class="kwhl">class="crayon-i">m class="kwhl">class="crayon-cn">666 class="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">devclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">netclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-i">tun class="kwhl">class="crayon-i">c class="kwhl">class="crayon-cn">10 class="kwhl">class="crayon-cn">200
class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">fi

这样你执行需要tun/tap的程序时就不会出问题了

三.附录(记如何在v3版本的ovz下开启tun/class="kwhl">class="st_tag internal_tag" title="Posts tagged with tap" href="http://www.senra.me/tag/tap/" rel="tag">tap)

a. 编辑vz.conf文件,添加iptable_nat ipt_state这2个东西

class="kwhl">class="crayon-syntax crayon-theme-sublime-text crayon-font-sourcecodepro crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover disable-anim wrap">

class="kwhl">class="crayon-plain-wrap">
class="kwhl">class="crayon-main">

class="kwhl">class="crayon-table">

class="kwhl">class="crayon-row">

class="kwhl">class="crayon-nums " data-settings="show">

class="kwhl">class="crayon-nums-content">

class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a28457795064-1">1
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a28457795064-2">2
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a28457795064-3">3
class="kwhl">class="crayon-code">

class="kwhl">class="crayon-pre">

class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">vi class="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">etcclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">vzclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">vzclass="kwhl">class="crayon-sy">.class="kwhl">class="crayon-e">conf
class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">IPTABLESclass="kwhl">class="crayon-o">=class="kwhl">class="crayon-s">" ***" 这一行的引号内添加class="kwhl">class="crayon-cn">2个模块
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">iptable_nat class="kwhl">class="crayon-v">ipt_state

b. 手动关闭所有小鸡,重启openvz模块
/etc/init.d/vz restart

c. 对小鸡进行必要的设置(这里以小鸡100为例,100是指PID,WEB控制面板里可以看到)

class="kwhl">class="crayon-syntax crayon-theme-sublime-text crayon-font-sourcecodepro crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover disable-anim wrap">

class="kwhl">class="crayon-plain-wrap">
class="kwhl">class="crayon-main">

class="kwhl">class="crayon-table">

class="kwhl">class="crayon-row">

class="kwhl">class="crayon-nums " data-settings="show">

class="kwhl">class="crayon-nums-content">

class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a30036159179-1">1
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a30036159179-2">2
class="kwhl">class="crayon-code">

class="kwhl">class="crayon-pre">

class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">vzctl class="kwhl">class="crayon-i">set class="kwhl">class="crayon-cn">100 class="kwhl">class="crayon-o">--class="kwhl">class="crayon-i">devices class="kwhl">class="crayon-v">cclass="kwhl">class="crayon-o">:class="kwhl">class="crayon-cn">10class="kwhl">class="crayon-o">:class="kwhl">class="crayon-cn">200class="kwhl">class="crayon-o">:class="kwhl">class="crayon-v">rw class="kwhl">class="crayon-o">--class="kwhl">class="crayon-e">save
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">vzctl class="kwhl">class="crayon-i">set class="kwhl">class="crayon-cn">100 class="kwhl">class="crayon-o">--class="kwhl">class="crayon-e">capability class="kwhl">class="crayon-v">net_adminclass="kwhl">class="crayon-o">:class="kwhl">class="crayon-v">on class="kwhl">class="crayon-o">--class="kwhl">class="crayon-v">save

d. 母鸡加载一次这些

class="kwhl">class="crayon-syntax crayon-theme-sublime-text crayon-font-sourcecodepro crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover disable-anim wrap">

class="kwhl">class="crayon-plain-wrap">
class="kwhl">class="crayon-main">

class="kwhl">class="crayon-table">

class="kwhl">class="crayon-row">

class="kwhl">class="crayon-nums " data-settings="show">

class="kwhl">class="crayon-nums-content">

class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-1">1
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-2">2
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-3">3
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-4">4
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-5">5
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-6">6
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-7">7
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-8">8
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-9">9
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-10">10
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-11">11
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-12">12
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-13">13
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-14">14
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-15">15
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-16">16
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-17">17
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-18">18
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a38622110841-19">19
class="kwhl">class="crayon-code">

class="kwhl">class="crayon-pre">

class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">modprobe class="kwhl">class="crayon-e">ipt_mark
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">modprobe class="kwhl">class="crayon-e">ipt_MARK
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">modprobe class="kwhl">class="crayon-e">ip_nat_pptp
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">modprobe class="kwhl">class="crayon-e">nf_nat_pptp
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">modprobe class="kwhl">class="crayon-e">tun
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">modprobe class="kwhl">class="crayon-e">ppp_async
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">modprobe class="kwhl">class="crayon-v">pppclass="kwhl">class="crayon-sy">_deflate
class="kwhl">class="crayon-line">
class="kwhl">class="crayon-line">或者
class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">vi class="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">etcclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-e">modules
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">ipt_mark
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">ipt_MARK
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">ip_nat_pptp
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">nf_nat_pptp
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">tun
class="kwhl">class="crayon-line">class="kwhl">class="crayon-e">ppp_async
class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">pppclass="kwhl">class="crayon-sy">_deflate
class="kwhl">class="crayon-line">查看是否启用模块
class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">lsmod class="kwhl">class="crayon-o">| class="kwhl">class="crayon-e">grep class="kwhl">class="crayon-v">nf_nat_pptp

e. 启动小鸡输入以下命令

class="kwhl">class="crayon-syntax crayon-theme-sublime-text crayon-font-sourcecodepro crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover disable-anim wrap">

class="kwhl">class="crayon-plain-wrap">
class="kwhl">class="crayon-main">

class="kwhl">class="crayon-table">

class="kwhl">class="crayon-row">

class="kwhl">class="crayon-nums " data-settings="show">

class="kwhl">class="crayon-nums-content">

class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a40794958489-1">1
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a40794958489-2">2
class="kwhl">class="crayon-num" data-line="crayon-591f5d6797a40794958489-3">3
class="kwhl">class="crayon-code">

class="kwhl">class="crayon-pre">

class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">mkdir class="kwhl">class="crayon-o">-class="kwhl">class="crayon-v">p class="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">devclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-e">net
class="kwhl">class="crayon-line">class="kwhl">class="crayon-v">mknod class="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">devclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">netclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-i">tun class="kwhl">class="crayon-i">c class="kwhl">class="crayon-cn">10 class="kwhl">class="crayon-cn">200
class="kwhl">class="crayon-line">class="kwhl">class="crayon-i">chmod class="kwhl">class="crayon-cn">600 class="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">devclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">netclass="kwhl">class="crayon-o">/class="kwhl">class="crayon-v">tun
class="kwhl">class="st-post-tags">

class="kwhl">class="replace_word" title="Hbase知识库" href="http://lib.csdn.net/base/hbase" target="_blank">Hbase hbck

class="kwhl">class="dp-highlighter bg_plain">

class="kwhl">class="bar">

class="kwhl">class="tools">

[plain] class="kwhl">class="ViewSource" title="view plain" href="http://blog.csdn.net/liliwei0213/article/details/53639275#">view plain class="kwhl">class="CopyToClipboard" title="copy" href="http://blog.csdn.net/liliwei0213/article/details/53639275#">copy

class="kwhl">class="tracking-ad" data-mod="popu_167">在CODE上查看代码片class="kwhl">class="tracking-ad" data-mod="popu_170">派生到我的代码片

  1. class="kwhl">class="alt">新版本的 hbck 可以修复各种错误,修复选项是:
  2. class="kwhl">class="">(1)-fix,向下兼容用,被-fixAssignments替代
  3. class="kwhl">class="alt">(2)-fixAssignments,用于修复region assignments错误
  4. class="kwhl">class="">(3)-fixMeta,用于修复meta表的问题,前提是HDFS上面的region info信息有并且正确。
  5. class="kwhl">class="alt">(4)-fixHdfsHoles,修复region holes(空洞,某个区间没有region)问题
  6. class="kwhl">class="">(5)-fixHdfsOrphans,修复Orphan region(hdfs上面没有.regioninfo的region)
  7. class="kwhl">class="alt">(6)-fixHdfsOverlaps,修复region overlaps(区间重叠)问题
  8. class="kwhl">class="">(7)-fixVersionFile,修复缺失hbase.version文件的问题
  9. class="kwhl">class="alt">(8)-maxMerge <n> (n默认是5),当region有重叠是,需要合并region,一次合并的region数最大不超过这个值。
  10. class="kwhl">class="">(9)-sidelineBigOverlaps ,当修复region overlaps问题时,允许跟其他region重叠次数最多的一些region不参与(修复后,可以把没有参与的数据通过bulk load加载到相应的region)
  11. class="kwhl">class="alt">(10)-maxOverlapsToSideline <n> (n默认是2),当修复region overlaps问题时,一组里最多允许多少个region不参与
  12. class="kwhl">class="">由于选项较多,所以有两个简写的选项
  13. class="kwhl">class="alt">(11) -repair,相当于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps
  14. class="kwhl">class="">(12)-repairHoles,相当于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans
  15. class="kwhl">class="alt">
  16. class="kwhl">class="">
  17. class="kwhl">class="alt">
  18. class="kwhl">class="">新版本的 hbck
  19. class="kwhl">class="alt">(1)缺失hbase.version文件
  20. class="kwhl">class=""> 加上选项 -fixVersionFile 解决
  21. class="kwhl">class="alt">(2)如果一个region即不在META表中,又不在hdfs上面,但是在regionserver的online region集合中
  22. class="kwhl">class=""> 加上选项 -fixAssignments 解决
  23. class="kwhl">class="alt">(3)如果一个region在META表中,并且在regionserver的online region集合中,但是在hdfs上面没有
  24. class="kwhl">class=""> 加上选项 -fixAssignments -fixMeta 解决,( -fixAssignments告诉regionserver close region),( -fixMeta删除META表中region的记录)
  25. class="kwhl">class="alt">(4)如果一个region在META表中没有记录,没有被regionserver服务,但是在hdfs上面有
  26. class="kwhl">class="">加上选项 -fixMeta -fixAssignments 解决,( -fixAssignments 用于assign region),( -fixMeta用于在META表中添加region的记录)
  27. class="kwhl">class="alt">(5)如果一个region在META表中没有记录,在hdfs上面有,被regionserver服务了
  28. class="kwhl">class="">加上选项 -fixMeta 解决,在META表中添加这个region的记录,先undeploy region,后assign
  29. class="kwhl">class="alt">(6)如果一个region在META表中有记录,但是在hdfs上面没有,并且没有被regionserver服务
  30. class="kwhl">class="">加上选项 -fixMeta 解决,删除META表中的记录
  31. class="kwhl">class="alt">(7)如果一个region在META表中有记录,在hdfs上面也有,table不是disabled的,但是这个region没有被服务
  32. class="kwhl">class="">加上选项 -fixAssignments 解决,assign这个region
  33. class="kwhl">class="alt">(8)如果一个region在META表中有记录,在hdfs上面也有,table是disabled的,但是这个region被某个regionserver服务了
  34. class="kwhl">class="">加上选项 -fixAssignments 解决,undeploy这个region
  35. class="kwhl">class="alt">(9)如果一个region在META表中有记录,在hdfs上面也有,table不是disabled的,但是这个region被多个regionserver服务了
  36. class="kwhl">class="">加上选项 -fixAssignments 解决,通知所有regionserver close region,然后assign region
  37. class="kwhl">class="alt">(10)如果一个region在META表中,在hdfs上面也有,也应该被服务,但是META表中记录的regionserver和实际所在的regionserver不相符
  38. class="kwhl">class="">加上选项 -fixAssignments 解决
  39. class="kwhl">class="alt">
  40. class="kwhl">class="">(11)region holes
  41. class="kwhl">class="alt">需要加上 -fixHdfsHoles ,创建一个新的空region,填补空洞,但是不assign 这个 region,也不在META表中添加这个region的相关信息
  42. class="kwhl">class="">(12)region在hdfs上面没有.regioninfo文件
  43. class="kwhl">class="alt">-fixHdfsOrphans 解决
  44. class="kwhl">class="">(13)region overlaps
  45. class="kwhl">class="alt">需要加上 -fixHdfsOverlaps
  46. class="kwhl">class="">
  47. class="kwhl">class="alt">
  48. class="kwhl">class="">说明:
  49. class="kwhl">class="alt">(1)修复region holes时,-fixHdfsHoles 选项只是创建了一个新的空region,填补上了这个区间,还需要加上-fixAssignments -fixMeta 来解决问题,( -fixAssignments 用于assign region),( -fixMeta用于在META表中添加region的记录),所以有了组合拳 -repairHoles 修复region holes,相当于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans
  50. class="kwhl">class="">(2) -fixAssignments,用于修复region没有assign、不应该assign、assign了多次的问题
  51. class="kwhl">class="alt">(3)-fixMeta,如果hdfs上面没有,那么从META表中删除相应的记录,如果hdfs上面有,在META表中添加上相应的记录信息
  52. class="kwhl">class="">(4)-repair 打开所有的修复选项,相当于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps
  53. class="kwhl">class="alt">
  54. class="kwhl">class="">新版本的hbck从(1)hdfs目录(2)META(3)RegionServer这三处获得region的Table和Region的相关信息,根据这些信息判断并repair

示例:

class="kwhl">class="dp-highlighter bg_plain">

class="kwhl">class="bar">

class="kwhl">class="tools">

[plain] class="kwhl">class="ViewSource" title="view plain" href="http://blog.csdn.net/liliwei0213/article/details/53639275#">view plain class="kwhl">class="CopyToClipboard" title="copy" href="http://blog.csdn.net/liliwei0213/article/details/53639275#">copy

class="kwhl">class="tracking-ad" data-mod="popu_167">在CODE上查看代码片class="kwhl">class="tracking-ad" data-mod="popu_170">派生到我的代码片

  1. class="kwhl">class="alt">查看hbasemeta情况
  2. class="kwhl">class="">hbase hbck
  3. class="kwhl">class="alt">1.重新修复hbase meta表(根据hdfs上的regioninfo文件,生成meta表)
  4. class="kwhl">class="">hbase hbck -fixMeta
  5. class="kwhl">class="alt">2.重新将hbase meta表分给regionserver(根据meta表,将meta表上的region分给regionservere)
  6. class="kwhl">class="">hbase hbck -fixAssignments

来自官方手册:https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora

Including Red Hat® Enterprise Linux® / RHEL, CentOS and Fedora.

Node.js is available from the NodeSource Enterprise Linux and Fedora binary distributions repository. Support for this repository, along with its scripts, can be found on GitHub at nodesource/distributions.

Note that the Node.js packages for EL 5 (RHEL5 and CentOS 5) depend on the EPEL repository being available. The setup script will check and provide instructions if it is not installed.

Run as root on RHEL, CentOS or Fedora, for Node.js v6 LTS:

class="kwhl">class="language-bash">class="kwhl">class="language-bash">curl --silent --location https://rpm.nodesource.com/setup_6.x class="kwhl">class="token operator">| class="kwhl">class="token function">bash -

Alternatively for Node.js v7:

class="kwhl">class="language-bash">class="kwhl">class="language-bash">curl --silent --location https://rpm.nodesource.com/setup_7.x class="kwhl">class="token operator">| class="kwhl">class="token function">bash -

Alternatively for Node.js 0.10:

class="kwhl">class="language-bash">class="kwhl">class="language-bash">curl --silent --location https://rpm.nodesource.com/setup class="kwhl">class="token operator">| class="kwhl">class="token function">bash -

Then install, as root:

class="kwhl">class="language-bash">class="kwhl">class="language-bash">yum -y class="kwhl">class="token function">install nodejs