command not found: http://d.zinrai.info/blog/html/ Hello World en-us Sat, 30 Aug 2014 00:00:00 +0900 http://d.zinrai.info/blog/html/2014/08/30/debian_sid_buildbot.html http://d.zinrai.info/blog/html/2014/08/30/debian_sid_buildbot.html <![CDATA[buildbot を動かしてみる]]> buildbot を動かしてみる

CIフレームワークのひとつであるbuildbotを動かしてみる。今回はチュートリアルに従いJOBを走らせるところまでやってみる。http://buildbot.net/img/overview.pngにあるようにbuildbotはmaster/slave構成で動作する。

$ uname -srv
Linux 3.14-2-amd64 #1 SMP Debian 3.14.15-2 (2014-08-09)

master

$ apt-cache show buildbot
Package: buildbot
Version: 0.8.9-1
Installed-Size: 11483
Maintainer: Andriy Senkovych <jolly_roger@itblog.org.ua>
Architecture: all
Depends:
python (>= 2.7), python (<< 2.8), python-twisted,
python-jinja2 (>= 2.1), python-sqlalchemy (>= 0.9~),
python-sqlalchemy (<< 0.10), python-migrate (>= 0.6.1),
python-dateutil (>= 1.5), libjs-sphinxdoc (>= 1.0),
python-twisted-core (>= 2.0), python-twisted-web,
python-twisted-words, dpkg (>= 1.15.4), adduser
Recommends: buildbot-slave, python-twisted-mail, libaprutil1
Suggests: bzr | subversion | cvs | mercurial | darcs | git
Description-en: system to automate the compile/test cycle
The BuildBot is a system to automate the compile/test cycle required
by most software projects to validate code changes. By automatically
rebuilding and testing the tree each time something has changed,
build problems are pinpointed quickly, before other developers are
inconvenienced by the failure. The guilty developer can be ng the builds on a variety of platforms, developers who do
not have the facilities to test their changes everywhere before
checkin will at least know shortly afterwards whether they have
broken the build or not. Warning counts, lint checks, image size,
compile time, and other build parameters can be tracked over time,
are more visible, and are therefore easier to improve.
Description-md5: 298ec22b779490a3c70577e0331e261a
Homepage: http://buildbot.net
Tag: devel::buildtools, devel::lang:python, devel::testing-qa,
implemented-in::python, role::program
Section: devel
Priority: optional
Filename: pool/main/b/buildbot/buildbot_0.8.9-1_all.deb
Size: 1870110
MD5sum: 5ff9f5f620abd35bff478c27cf51dbc8
SHA1: 82ff1610db9445e130fc07fee52736b74d0472ff
SHA256: f62a336ba3e1b517dcb714c1cdb1cd0d8e798760628f5c85a35a1b465bba9bd7
% apt-get install buildbot
% vi /etc/default/buildmaster
MASTER_RUNNER=/usr/bin/buildbot

# NOTE: MASTER_ENABLED has changed its behaviour in version 0.8.4. Use
# 'true|yes|1' to enable instance and 'false|no|0' to disable. Other
# values will be considered as syntax error.

MASTER_ENABLED[1]=1 # 1-enabled, 0-disabled
MASTER_NAME[1]="buildmaster #1" # short name printed on start/stop
MASTER_USER[1]="buildbot" # user to run master as
MASTER_BASEDIR[1]="/var/lib/buildbot/masters" # basedir to master (absolute path)
MASTER_OPTIONS[1]="" # buildbot options
MASTER_PREFIXCMD[1]="" # prefix command, i.e. nice, linux32, dchroot
% cd /var/lib/buildbot/masters
% buildbot create-master .
% chown-R buildbot:buildbot .
% cp master.cfg.sample master.cfg
% service buildmaster start
Starting buildmaster "buildmaster #1".

slave

$ apt-cache show buildbot-slave
Package: buildbot-slave
Version: 0.8.9-1
Installed-Size: 653
Maintainer: Andriy Senkovych <jolly_roger@itblog.org.ua>
Architecture: all
Depends:
python (>= 2.7), python (<< 2.8), python-twisted,
python-twisted-core (>= 2.2), python-twisted-words, adduser
Suggests: buildbot, bzr | subversion | cvs | mercurial | darcs | git-core
Breaks: buildbot (<< 0.8)
Description-en: system to automate the compile/test cycle
The BuildBot is a system to automate the compile/test cycle required
by most software projects to validate code changes. By automatically
rebuilding and testing the tree each time something has changed,
build problems are pinpointed quickly, before other developers are
inconvenienced by the failure. The guilty developer can be identified
and harassed without human intervention.
.
By running the builds on a variety of platforms, developers who do
not have the facilities to test their changes everywhere before
checkin will at least know shortly afterwards whether they have
broken the build or not. Warning counts, lint checks, image size,
compile time, and other build parameters can be tracked over time,
are more visible, and are therefore easier to improve.
Description-md5: 298ec22b779490a3c70577e0331e261a
Homepage: http://buildbot.net
Tag: devel::buildtools, devel::testing-qa, implemented-in::python,
role::program
Section: devel
Priority: optional
Filename: pool/main/b/buildbot-slave/buildbot-slave_0.8.9-1_all.deb
Size: 98744
MD5sum: d709cebd7720976eaef401b68fbaea08
SHA1: d31fd6a3dce03853db68c836552b2534cea75a0b
SHA256: 9bf602c38f985491899b1f1a741beda966b185b8bdd8d56c9ba5a809592d10b1
% apt-get install buildbot-slave
% vi /etc/default/buildslave
SLAVE_RUNNER=/usr/bin/buildslave

# NOTE: SLAVE_ENABLED has changed its behaviour in version 0.8.4. Use
# 'true|yes|1' to enable instance and 'false|no|0' to disable. Other
# values will be considered as syntax error.

SLAVE_ENABLED[1]=1 # 1-enabled, 0-disabled
SLAVE_NAME[1]="buildslave #1" # short name printed on start/stop
SLAVE_USER[1]="buildbot" # user to run slave as
SLAVE_BASEDIR[1]="/var/lib/buildbot/slaves" # basedir to slave (absolute path)
SLAVE_OPTIONS[1]="" # buildbot options
SLAVE_PREFIXCMD[1]="" # prefix command, i.e. nice, linux32, dchroot
% cd /var/lib/buildbot/slaves
% buildslave create-slave . localhost:9989 example-slave pass
% chown-R buildbot:buildbot .
% service buildslave start
Starting buildslave "buildslave #1".

これでmaster/slave構成の出来上がり。あとはhttp://${ipaddress}:8010 にアクセスしてpyflakes/pyflakesでログイン「Waterfall -> runtests -> Force Build」をクリックすればサンプルで登録されているJOBが走る。JOBはmaster.cfgファイルを編集して追加していくことになる。GitがないとエラーになるのでGitをインストールしておくこと。

% apt-get install git

master.cfgは下記のようになっている。

% cat master.cfg
# -*- python -*-
# ex: set syntax=python:

# This is a sample buildmaster config file. It must be installed as
# 'master.cfg' in your buildmaster's base directory.

# This is the dictionary that the buildmaster pays attention to. We also use
# a shorter alias to save typing.
c = BuildmasterConfig = {}

####### BUILDSLAVES

# The 'slaves' list defines the set of recognized buildslaves. Each element is
# a BuildSlave object, specifying a unique slave name and password.  The same
# slave name and password must be configured on the slave.
from buildbot.buildslave import BuildSlave
c['slaves'] = [BuildSlave("example-slave", "pass")]

# 'protocols' contains information about protocols which master will use for
# communicating with slaves.
# You must define at least 'port' option that slaves could connect to your master
# with this protocol.
# 'port' must match the value configured into the buildslaves (with their
# --master option)
c['protocols'] = {'pb': {'port': 9989}}

####### CHANGESOURCES

# the 'change_source' setting tells the buildmaster how it should find out
# about source code changes.  Here we point to the buildbot clone of pyflakes.

from buildbot.changes.gitpoller import GitPoller
c['change_source'] = []
c['change_source'].append(GitPoller(
        'git://github.com/buildbot/pyflakes.git',
        workdir='gitpoller-workdir', branch='master',
        pollinterval=300))

####### SCHEDULERS

# Configure the Schedulers, which decide how to react to incoming changes.  In this
# case, just kick off a 'runtests' build

from buildbot.schedulers.basic import SingleBranchScheduler
from buildbot.schedulers.forcesched import ForceScheduler
from buildbot.changes import filter
c['schedulers'] = []
c['schedulers'].append(SingleBranchScheduler(
                            name="all",
                            change_filter=filter.ChangeFilter(branch='master'),
                            treeStableTimer=None,
                            builderNames=["runtests"]))
c['schedulers'].append(ForceScheduler(
                            name="force",
                            builderNames=["runtests"]))

####### BUILDERS

# The 'builders' list defines the Builders, which tell Buildbot how to perform a build:
# what steps, and which slaves can execute them.  Note that any particular build will
# only take place on one slave.

from buildbot.process.factory import BuildFactory
from buildbot.steps.source.git import Git
from buildbot.steps.shell import ShellCommand

factory = BuildFactory()
# check out the source
factory.addStep(Git(repourl='git://github.com/buildbot/pyflakes.git', mode='incremental'))
# run the tests (note that this will require that 'trial' is installed)
factory.addStep(ShellCommand(command=["trial", "pyflakes"]))

from buildbot.config import BuilderConfig

c['builders'] = []
c['builders'].append(
    BuilderConfig(name="runtests",
      slavenames=["example-slave"],
      factory=factory))

####### STATUS TARGETS

# 'status' is a list of Status Targets. The results of each build will be
# pushed to these targets. buildbot/status/*.py has a variety to choose from,
# including web pages, email senders, and IRC bots.

c['status'] = []

from buildbot.status import html
from buildbot.status.web import authz, auth

authz_cfg=authz.Authz(
    # change any of these to True to enable; see the manual for more
    # options
    auth=auth.BasicAuth([("pyflakes","pyflakes")]),
    gracefulShutdown = False,
    forceBuild = 'auth', # use this to test your slave once it is set up
    forceAllBuilds = False,
    pingBuilder = False,
    stopBuild = False,
    stopAllBuilds = False,
    cancelPendingBuild = False,
)
c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg))

####### PROJECT IDENTITY

# the 'title' string will appear at the top of this buildbot
# installation's html.WebStatus home page (linked to the
# 'titleURL') and is embedded in the title of the waterfall HTML page.

c['title'] = "Pyflakes"
c['titleURL'] = "https://launchpad.net/pyflakes"

# the 'buildbotURL' string should point to the location where the buildbot's
# internal web server (usually the html.WebStatus page) is visible. This
# typically uses the port number set in the Waterfall 'status' entry, but
# with an externally-visible host name which the buildbot cannot figure out
# without some help.

c['buildbotURL'] = "http://localhost:8010/"

####### DB URL

c['db'] = {
    # This specifies what database buildbot uses to store its state.  You can leave
    # this at its default for all but the largest installations.
    'db_url' : "sqlite:///state.sqlite",
}
]]>
Sat, 30 Aug 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/08/29/debian_sid_lxc_centos_container.html http://d.zinrai.info/blog/html/2014/08/29/debian_sid_lxc_centos_container.html <![CDATA[Debian sid で CentOS の LXCテンプレートを試してみた]]> Debian sid で CentOS の LXCテンプレートを試してみた
% uname -srv
Linux 3.14-2-amd64 #1 SMP Debian 3.14.15-2 (2014-08-09)

% cat /etc/debian_version
jessie/sid

templateにCentOSがあったので試してみた。

$ dpkg -L lxc | grep template
/usr/share/lxc/templates
/usr/share/lxc/templates/lxc-centos
/usr/share/lxc/templates/lxc-sshd
/usr/share/lxc/templates/lxc-gentoo
/usr/share/lxc/templates/lxc-fedora
/usr/share/lxc/templates/lxc-debian
/usr/share/lxc/templates/lxc-opensuse
/usr/share/lxc/templates/lxc-ubuntu
/usr/share/lxc/templates/lxc-alpine
/usr/share/lxc/templates/lxc-download
/usr/share/lxc/templates/lxc-cirros
/usr/share/lxc/templates/lxc-oracle
/usr/share/lxc/templates/lxc-openmandriva
/usr/share/lxc/templates/lxc-ubuntu-cloud
/usr/share/lxc/templates/lxc-archlinux
/usr/share/lxc/templates/lxc-altlinux
/usr/share/lxc/templates/lxc-busybox
/usr/share/lxc/templates/lxc-plamo

-Rでリリース番号、-aでarchを指定できる。

$ cat -n /usr/share/lxc/templates/lxc-centos
645 usage()
646 {
647 cat <<EOF
648 usage:
649 $1 -n|--name=<container_name>
650 [-p|--path=<path>] [-c|--clean] [-R|--release=<CentOS_release>] [-A|--arch=<arch of the container>]
651 [-h|--help]
652 Mandatory args:
653 -n,--name container name, used to as an identifier for that container from now on
654 Optional args:
655 -p,--path path to where the container rootfs will be created, defaults to /var/lib/lxc/name.
656 -c,--clean clean the cache
657 -R,--release Centos release for the new container. if the host is Centos, then it will defaultto the host's release.
658 --fqdn fully qualified domain name (FQDN) for DNS and system naming
659 --repo repository to use (url)
660 -a,--arch Define what arch the container will be [i686,x86_64]
661 -h,--help print this help
662 EOF
663 return 0
664 }

テンプレートを眺めてみるとyumを使っていたので、Debianにyumなんてあるのかなと思って調べてみたらあった。yumをインストールしておく。

% apt-get install yum
% vi /var/lib/lxc/centos6-64/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
% lxc-create -n centos6-64 -t centos -- -R 6 -a x86_64
% lxc-start -n centos6-64 -d
% lxc-console -n centos6-64
]]>
Fri, 29 Aug 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/08/28/debian_sid_lxc.html http://d.zinrai.info/blog/html/2014/08/28/debian_sid_lxc.html <![CDATA[Debian sid で LXC を使ってみる]]> Debian sid で LXC を使ってみる
$ uname -srv
Linux 3.14-2-amd64 #1 SMP Debian 3.14.15-2 (2014-08-09)

$ cat /etc/debian_version
jessie/sid
$ apt-cache show lxc
Package: lxc
Version: 1:1.0.5-2
Installed-Size: 2572
Maintainer: Daniel Baumann <mail@daniel-baumann.ch>
Architecture: amd64
Replaces: lxc-dev
Depends: init-system-helpers (>= 1.18~), libapparmor1 (>= 2.6~devel), libc6 (>= 2.17), libcap2 (>= 1:2.10), libseccomp2 (>= 2.1.0), libselinux1 (>= 1.32), python3 (<< 3.5), python3 (>= 3.4~)
Pre-Depends: multiarch-support
Recommends: lua5.2, rsync
Suggests: debootstrap
Conflicts: lxc-dev
Description-en: Linux Containers userspace tools
 Containers are insulated areas inside a system, which have their own namespace
 for filesystem, network, PID, IPC, CPU and memory allocation and which can be
 created using the Control Group and Namespace features included in the Linux
 kernel.
 .
 This package provides the lxc-* tools, which can be used to start a single
 daemon in a container, or to boot an entire "containerized" system, and to
 manage and debug your containers.
Description-md5: 4ece0dffd153c29e95ffdb89f8238dfc
Homepage: http://linuxcontainers.org/
Tag: admin::virtualization, implemented-in::c, interface::commandline,
 role::program, scope::application
Section: admin
Priority: optional
Filename: pool/main/l/lxc/lxc_1.0.5-2_amd64.deb
Size: 614156
MD5sum: 641e858ffedc97f13bdeaf3631466870
SHA1: 032bf1f0a88a4089d8f324411941b3f8b9d87f65
SHA256: 51b6e745dc292f41b8cd66b55d9950794c1ee220b56aed483c5769e21795b0a7
% apt-get install rsync bridge-utils libvirt-bin debootstrap dnsmasq lxc

ネットワーク設定

virsh net-startしようとするとebtablesがないと言われるのでインストールしておく。

% apt-get install ebtables
% vi /etc/libvirt/qemu/networks/default.xml
<network>
  <name>default</name>
  <bridge name="virbr0"/>
  <forward/>
  <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.122.101" end="192.168.122.254"/>
    </dhcp>
  </ip>
</network>
% service dnsmasq stop
% insserv -f -r dnsmasq

% service libvirtd restart

% virsh net-start default
Network default started

% virsh net-autostart default
Network default marked as autostarted

LXC

% vi /etc/fstab
cgroup /sys/fs/cgroup cgroup defaults 0 0

% mount -a
% lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.14-2-amd64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

指定できるテンプレートが増えている。

dpkg -L lxc | grep templates
/usr/share/lxc/templates
/usr/share/lxc/templates/lxc-centos
/usr/share/lxc/templates/lxc-sshd
/usr/share/lxc/templates/lxc-gentoo
/usr/share/lxc/templates/lxc-fedora
/usr/share/lxc/templates/lxc-debian
/usr/share/lxc/templates/lxc-opensuse
/usr/share/lxc/templates/lxc-ubuntu
/usr/share/lxc/templates/lxc-alpine
/usr/share/lxc/templates/lxc-download
/usr/share/lxc/templates/lxc-cirros
/usr/share/lxc/templates/lxc-oracle
/usr/share/lxc/templates/lxc-openmandriva
/usr/share/lxc/templates/lxc-ubuntu-cloud
/usr/share/lxc/templates/lxc-archlinux
/usr/share/lxc/templates/lxc-altlinux
/usr/share/lxc/templates/lxc-busybox
/usr/share/lxc/templates/lxc-plamo
% lxc-create -n wheezy64 -t debian
Root password is '4pb7+JAC', please change !

% lxc-create -n jessie64 -t debian -- -r jessie
Root password is '8o5yK1/4', please change !

% lxc-create -n sid64 -t debian -- -r sid
Root password is '+880EpXJ', please change !

rootパスワードがrootだったのがランダムな文字列を使うようになっていた。

$ cat -n /usr/share/lxc/templates/lxc-debian
154 password="$(dd if=/dev/urandom bs=6 count=1 2> /dev/null | base64)"
155
156 echo "root:$password" | chroot $rootfs chpasswd
157 echo "Root password is '$password', please change !"

コンテナに必要なデバイスの設定をインクルードするようになっていた。lxc.container.conf(5)に各パラメータについての説明がある。

$ cat /var/lib/lxc/wheezy64/config
# Template used to create this container: /usr/share/lxc/templates/lxc-debian
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)
lxc.network.type = empty
lxc.rootfs = /var/lib/lxc/wheezy64/rootfs

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf

# Container specific configuration
lxc.mount = /var/lib/lxc/wheezy64/fstab
lxc.utsname = wheezy64
lxc.arch = amd64
$ dpkg -L lxc | grep config
/usr/bin/lxc-test-saveconfig
/usr/bin/lxc-checkconfig
/usr/bin/lxc-config
/usr/share/man/man1/lxc-config.1.gz
/usr/share/man/man1/lxc-checkconfig.1.gz
/usr/share/man/ja/man1/lxc-config.1.gz
/usr/share/man/ja/man1/lxc-checkconfig.1.gz
/usr/share/lxc/config
/usr/share/lxc/config/ubuntu.userns.conf
/usr/share/lxc/config/debian.userns.conf
/usr/share/lxc/config/gentoo.userns.conf
/usr/share/lxc/config/fedora.common.conf
/usr/share/lxc/config/ubuntu-cloud.lucid.conf
/usr/share/lxc/config/ubuntu.lucid.conf
/usr/share/lxc/config/centos.common.conf
/usr/share/lxc/config/gentoo.moresecure.conf
/usr/share/lxc/config/ubuntu-cloud.userns.conf
/usr/share/lxc/config/oracle.userns.conf
/usr/share/lxc/config/gentoo.common.conf
/usr/share/lxc/config/fedora.userns.conf
/usr/share/lxc/config/debian.common.conf
/usr/share/lxc/config/centos.userns.conf
/usr/share/lxc/config/plamo.common.conf
/usr/share/lxc/config/ubuntu-cloud.common.conf
/usr/share/lxc/config/oracle.common.conf
/usr/share/lxc/config/ubuntu.common.conf
/usr/share/lxc/config/common.seccomp
/usr/share/lxc/config/plamo.userns.conf

ネットワーク設定もincludeするようにしてみた。

% vi /root/network.dhcp.conf
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
$ diff -u config.orig config
--- config.orig 2014-08-28 22:01:31.180346690 +0000
+++ config      2014-08-28 21:59:36.480344872 +0000
@@ -11,3 +11,5 @@
 lxc.mount = /var/lib/lxc/wheezy64/fstab
 lxc.utsname = wheezy64
 lxc.arch = amd64
+
+lxc.include = /root/network.dhcp.conf

lxc-attach(1)が使えた。

% lxc-start -n wheezy64 -d

% lxc-attach -n wheezy64 -- cat /etc/debian_version
7.6

% lxc-attach -n wheezy64 -- apt-get update
Hit http://cdn.debian.net wheezy Release.gpg
Hit http://cdn.debian.net wheezy Release
Hit http://cdn.debian.net wheezy/main amd64 Packages
Get:1 http://cdn.debian.net wheezy/main Translation-en [3,847 kB]
Fetched 3,847 kB in 3s (1,173 kB/s)
Reading package lists... Done

% lxc-attach -n wheezy64 -- apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

lxc-list(1)はなくなっていた。lxc-ls(1)を使う。

% lxc-ls -h
usage: lxc-ls [-h] [-1] [-P PATH] [--active] [--frozen] [--running]
[--stopped] [-f] [-F FANCY_FORMAT] [--nesting] [--version]
[FILTER]

LXC: List containers

positional arguments:
FILTER regexp to be applied on the container list

optional arguments:
-h, --help show this help message and exit
-1 list one container per line (default when piped)
-P PATH, --lxcpath PATH
Use specified container path
--active list only active containers
--frozen list only frozen containers
--running list only running containers
--stopped list only stopped containers
-f, --fancy use fancy output
-F FANCY_FORMAT, --fancy-format FANCY_FORMAT
comma separated list of fields to show
--nesting show nested containers
--version show program's version number and exit

Valid fancy-format fields:
name, state, ipv4, ipv6, autostart, pid, memory, ram, swap

Default fancy-format fields:
name, state, ipv4, ipv6, autostart
% lxc-ls -f
NAME      STATE    IPV4             IPV6  AUTOSTART
---------------------------------------------------
jessie64  STOPPED  -                -     NO
sid64     STOPPED  -                -     NO
wheezy64  RUNNING  192.168.122.105  -     NO

bindmountはwheezyと同じ。

% vi /var/lib/lxc/wheezy64/config
lxc.mount.entry=/var/lib/jenkins /var/lib/lxc/wheezy64/rootfs/home none bind 0 0

/etc/lxc/auto,/usr/share/doc/lxc/README.Debianがなくなっており、Debian起動時にコンテナを起動させる方法がよくわからない。

]]>
Thu, 28 Aug 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/08/24/debian_wheezy_lxc.html http://d.zinrai.info/blog/html/2014/08/24/debian_wheezy_lxc.html <![CDATA[Debian wheezyでLXCを使ってみる]]> Debian wheezyでLXCを使ってみる

https://wiki.debian.org/LXCとREADME.Debianを見ながらDebian wheezyでLXCを使ってみた。

$ uname -srv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3

$ cat /etc/debian_version
7.6
% apt-cache show lxc
Package: lxc
Version: 0.8.0~rc1-8+deb7u2
Installed-Size: 712
Maintainer: Daniel Baumann <daniel.baumann@progress-technologies.net>
Architecture: amd64
Depends: debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.8), libcap2 (>= 2.10)
Pre-Depends: multiarch-support
Recommends: debootstrap | cdebootstrap, rsync, libcap2-bin
Suggests: lxctl
Conflicts: cgroup-bin
Description-en: Linux Containers userspace tools
 Containers are insulated areas inside a system, which have their own namespace
 for filesystem, network, PID, IPC, CPU and memory allocation and which can be
 created using the Control Group and Namespace features included in the Linux
 kernel.
 .
 This package provides the lxc-* tools, which can be used to start a single
 daemon in a container, or to boot an entire "containerized" system, and to
 manage and debug your containers.
Homepage: http://lxc.sourceforge.net/
Description-md5: 4ece0dffd153c29e95ffdb89f8238dfc
Tag: admin::virtualization, implemented-in::c, interface::commandline,
 role::program, scope::application
Section: admin
Priority: optional
Filename: pool/main/l/lxc/lxc_0.8.0~rc1-8+deb7u2_amd64.deb
Size: 169900
MD5sum: 00e9b7b812d6b156f0ea298b88ed6673
SHA1: 74ccf808df7d19242ebf1a91a7f32fb66f39a6fc
SHA256: 06f2ba886c07b0e224429f7b03802612ee58852d7b5be7e8e4b28d74dcd40119
% apt-get install rsync bridge-utils libvirt-bin debootstrap dnsmasq lxc

ネットワーク設定

libvirtを使いvirbr0インタフェースを作成、ここにコンテナを接続する。

$ cat /etc/libvirt/qemu/networks/default.xml
<network>
<name>default</name>
<bridge name="virbr0" />
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254" />
</dhcp>
</ip>
</network>

% service dnsmasq stop
% insserv -f -r dnsmasq
% virsh net-autostart default
% virsh net-start default

LXC

Debian Wikiの「Prepare the host」に書いてあるfstab(5)の設定ではcgroupsファイルシステムはマウントされない。/usr/share/doc/lxc/README.Debianを読んだほうがいい。

% vi /etc/fstab
cgroup /sys/fs/cgroup cgroup defaults 0 0

% mount -a
% lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-3.2.0-4-amd64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

テンプレート(シェルスクリプト)に従ってコンテナは作成される。

% dpkg -L lxc | grep template
/usr/share/lxc/templates
/usr/share/lxc/templates/lxc-ubuntu-cloud
/usr/share/lxc/templates/lxc-debian
/usr/share/lxc/templates/lxc-debconf.d
/usr/share/lxc/templates/lxc-debconf.d/03-debconf
/usr/share/lxc/templates/lxc-debconf.d/03-debconf.templates
/usr/share/lxc/templates/lxc-debconf.d/01-preseed-file.templates
/usr/share/lxc/templates/lxc-debconf.d/01-preseed-file
/usr/share/lxc/templates/lxc-debconf.d/02-preseed-debconf
/usr/share/lxc/templates/lxc-fedora
/usr/share/lxc/templates/lxc-sshd
/usr/share/lxc/templates/lxc-archlinux
/usr/share/lxc/templates/lxc-opensuse
/usr/share/lxc/templates/lxc-debconf
/usr/share/lxc/templates/lxc-altlinux
/usr/share/lxc/templates/lxc-progress
/usr/share/lxc/templates/lxc-progress.d
% cat -n /usr/share/lxc/templates/lxc-debian
293 usage()
294 {
295 cat <<EOF
296 $1 -h|--help -p|--path=<path> [-a|--arch] [-r|--release=<release>] [-c|--clean]
297 release: the debian release (e.g. wheezy): defaults to current stable
298 arch: the container architecture (e.g. amd64): defaults to host arch
299 EOF
300 return 0
301 }
% lxc-create -h
usage: lxc-create -n <name> [-f configuration] [-t template] [-h] [fsopts] -- [template_options]
fsopts: -B none
fsopts: -B lvm [--lvname lvname] [--vgname vgname] [--fstype fstype] [--fssize fssize]
fsopts: -B btrfs
flag is not necessary, if possible btrfs support will be used

creates a lxc system object.

Options:
name : name of the container
configuration: lxc configuration
template : lxc-template is an accessible template script

The container backing store can be altered using '-B'. By default it
is 'none', which is a simple directory tree under /var/lib/lxc/<name>/rootfs
Otherwise, the following option values may be relevant:
lvname : [for -lvm] name of lv in which to create lv,
container-name by default
vgname : [for -lvm] name of vg in which to create lv, 'lxc' by default
fstype : name of filesystem to create, ext4 by default
fssize : size of filesystem to create, 500M by default

for template-specific help, specify a template, for instance:
lxc-create -t debconf -h

テンプレート側で用意している-rオプションを使うと指定したコードネームのベースイメージを取得できる。

% MIRROR=http://ftp.jp.debian.org/debian lxc-create -n wheezy64 -t debian
% MIRROR=http://ftp.jp.debian.org/debian lxc-create -n jessie64 -t debian -- -r jessie
% MIRROR=http://ftp.jp.debian.org/debian lxc-create -n sid64 -t debian -- -r sid
% lxc-list
RUNNING

FROZEN

STOPPED
jessie64
sid64
wheezy64

コンテナを外部と通信させるには下記の設定を追加する。

% vi /var/lib/lxc/wheezy64/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0

lxc-console(1)から抜ける場合は「Ctrl + a q」

% lxc-start -n wheezy64 -d
% lxc-console -n wheezy64

Debian起動時にコンテナを起動させておきたければ、/etc/lxc/autoにシンボリックリンクを張る。/usr/share/doc/lxc/README.Debianの「4. Autostart」に書かれている。

% ln -s /var/lib/lxc/wheezy64/config /etc/lxc/auto/wheezy64

bindmountもできる。ホストのJenkinsディレクトリをコンテナにマウントするには下記の設定を追加する。

% vi /var/lib/lxc/wheezy64/config
lxc.mount.entry=/var/lib/jenkins /var/lib/lxc/wheezy64/rootfs/home none bind 0 0

lxc-attach(1)を使ってホストからコンテナへコマンドを実行させようとしたが、Kernel 3.8以降でないとlxc-attach(1)はうまく動作しないようだ。

wheezy-backportsにKernel 3.14のソースが置いてあるがビルドするのが面倒くさい。Debian sidでもLXCを試してみようと思う。

]]>
Sun, 24 Aug 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/07/04/debian_wheezy_vagrant_digital_ocean.html http://d.zinrai.info/blog/html/2014/07/04/debian_wheezy_vagrant_digital_ocean.html <![CDATA[Vagrant で DigitalOcean を操作する]]> Vagrant で DigitalOcean を操作する

グローバルIPを持ったサーバが必要になったので、DigitalOcean(VPS)を使ってみた。APIが整備されていて、Vagrantで操作できるプラグインもあり簡単にサーバを作ったり消したりできてとても便利

$ uname -srv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2

$ cat /etc/debian_version
7.5
$ vagrant version
Installed Version: 1.6.3
Latest Version: 1.6.3

vagrant-digitalocean

dotenvを使いapi_keyなどをVagrantfileにベタ書きしないようにする。

$ vagrant plugin install vagrant-digitalocean
$ vagrant plugin install dotenv

$ vagrant plugin list
dotenv (0.11.1)
vagrant-digitalocean (0.5.5)

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Dotenv.load

# change default provider to digital_ocean
ENV['VAGRANT_DEFAULT_PROVIDER'] = "digital_ocean"

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.provider :digital_ocean do |provider, override|
    override.vm.hostname          = "debian-wheezy-64"
    override.vm.box               = "digital_ocean"
    override.vm.box_url           = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"
    override.ssh.username         = ENV['DO_SSH_USERNAME']
    override.ssh.private_key_path = ENV['DO_SSH_KEY']
    # disable synced_folder: rsync is not installed on DigitalOcean's guest machine
    override.vm.synced_folder "./", "/vagrant", disabled: true

    provider.client_id            = ENV['DO_CLIENT_ID']
    provider.api_key              = ENV['DO_API_KEY']
    provider.region               = "Singapore 1"
    provider.image                = "Debian 7.0 x64"
    provider.size                 = "512MB"
    provider.private_networking   = true
    provider.setup                = true

    # provision
    # Do whatever you wanna do !!
  end

end

.env

SSH公開鍵をDigitalOceanに登録しておくこと。

$ vi .env
DO_SSH_USERNAME="zinrai"
DO_SSH_KEY=${HOME}/.ssh/id_rsa
DO_CLIENT_ID="1234567890"
DO_API_KEY="abcdefghijklmn"

Vagrant

$ vagrant up
Bringing machine 'default' up with 'digital_ocean' provider...
==> default: Using existing SSH key: Vagrant
==> default: Creating a new droplet...
==> default: Assigned IP address: 1.2.3.4
==> default: Private IP address: 10.1.1.1
==> default: Creating user account: zinrai...

$ vagrant status
Current machine states:

default                   active (digital_ocean)

active

$ vagrant halt
==> default: Powering off the droplet...

$ vagrant destroy
]]>
Fri, 04 Jul 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/07/01/centos_65_jenkins_install.html http://d.zinrai.info/blog/html/2014/07/01/centos_65_jenkins_install.html <![CDATA[CentOS 6.5 に Jenkins インストール]]> CentOS 6.5 に Jenkins インストール
$ uname -srv
Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013

$ cat /etc/redhat-release
CentOS release 6.5 (Final)
% wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
% rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
% yum install java-1.7.0-openjdk
% yum install jenkins
% service jenkins start

起動スクリプトの/etc/init.d/jenkinsを眺めてみたら、/etc/sysconfig/jenkinsにJenkinsの設定が書かれていた。

]]>
Tue, 01 Jul 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/30/centos_65_fluentd_plugin.html http://d.zinrai.info/blog/html/2014/06/30/centos_65_fluentd_plugin.html <![CDATA[td-agent で外部プラグインを使ってみる]]> td-agent で外部プラグインを使ってみる

fluentdに組込まれているプラグインを標準プラグイン、それ以外を外部プラグイン呼ぶことにする。今回は、いくつかの外部プラグインを使ってみる。

$ uname -srv
Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

fluent-plugin-forest

標準プラグインだではタグごとにmatchを書かなければならないが、これを使うと冗長な記述をテンプレートとしてまとめることができる。tagというプレースホルダを使えるようになる。

% /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-forest

fluent-plugin-config-expander

for文が書けたり、hostnameというプレースホルダを使用できる。

% /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-config-expander

上記のプラグインを使った場合の設定はこんな感じ

% vi /etc/td-agent/td-agent.conf
<source>
  type config_expander
  <config>
    type tail
    path /var/log/secure
    pos_file /var/log/td-agent/secure.pos
    tag ${hostname}/syslog.secure
    format none
  </config>
</source>

<match *.**>
  type forest
  subtype s3

  <template>
    aws_key_id AWS_KEY_ID
    aws_sec_key AWS_SEC_KEY
    s3_bucket BUCKET_NAME
    s3_endpoint s3-ap-northeast-1.amazonaws.com
    path ${tag}/%Y/%m/%d/
    buffer_path /var/log/td-agent/s3

    time_slice_format %Y-%m-%d-%H-%M-%S
    time_slice_wait 5m
    utc

    buffer_chunk_limit 256m
  </template>
</match>
]]>
Mon, 30 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/29/centos_65_td_agent_out_s3.html http://d.zinrai.info/blog/html/2014/06/29/centos_65_td_agent_out_s3.html <![CDATA[td-agent で S3 にログを送る]]> td-agent で S3 にログを送る

td-agent(fluentd)を使って、/var/log/secureをS3に投げてみる。今回は標準のプラグインのみを使用する。

$ uname -srv
Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

本家のドキュメントだとインストールスクリプト(シェルスクリプト)をダウンロードして実行し、問答無用でtd-agentをインストールするよう書かれている。シェルスクリプトの中身は/etc/yum.repo.d/td.repoを配置して、GPG Keyをインポートして、td-agentをインストールしているだけ。

% vi /etc/yum.repo.d/td.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasuredata.com/redhat/$basearch
enabled=0
gpgcheck=1
gpgkey=http://packages.treasuredata.com/GPG-KEY-td-agent
% rpm --import http://packages.treasuredata.com/GPG-KEY-td-agent
$ yum info --enablerepo=treasuredata td-agent
Available Packages
Name        : td-agent
Arch        : x86_64
Version     : 1.1.20
Release     : 0
Size        : 64 M
Repo        : treasuredata
Summary     : td-agent
URL         : http://treasure-data.com/
License     : APL2
Description :
% yum install --enablerepo=treasuredata td-agent
% vi /etc/td-agent/td-agent.conf
<source>
  type tail
  path /var/log/secure
  pos_file /var/log/td-agent/secure.pos
  tag syslog.secure
  format none
</source>

<match *.*>
  type s3

  aws_key_id ${AWS_KEY_ID}
  aws_sec_key ${AWS_SEC_KEY}
  s3_bucket ${BUCKET_NAME}
  s3_endpoint s3-ap-northeast-1.amazonaws.com
  path %Y/%m/%d/secure_
  buffer_path /var/log/td-agent/s3

  time_slice_format %Y%m%d%H
  time_slice_wait 5m
  utc

  buffer_chunk_limit 256m
</match>

/var/log/secureのPermissionは600でそのままだとtd-agentが読み込めずにログ(/var/log/td-agent/td-agent.log)に「Permission denied」とか吐くので、secureログのPermissionを644にする。

% chmod 644 /var/log/secure
% service td-agent start

td-agent.confを書き換え設定を反映させたければreloadする。

% service td-agent reload
]]>
Sun, 29 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/28/debian_wheezy_apt_cacher_ng.html http://d.zinrai.info/blog/html/2014/06/28/debian_wheezy_apt_cacher_ng.html <![CDATA[apt-cacher-ng でapt用のキャッシュプロキシを構築する]]> apt-cacher-ng でapt用のキャッシュプロキシを構築する

squidではなくapt-cacher-ngを使ってapt用のキャッシュプロキシを構築してみる。

$ uname -srv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2

$ cat /etc/debian_version
7.5

server

$ apt-cache show apt-cacher-ng
Package: apt-cacher-ng
Version: 0.7.11-1
Installed-Size: 1175
Maintainer: Eduard Bloch <blade@debian.org>
Architecture: amd64
Depends: libbz2-1.0, libc6 (>= 2.10), libgcc1 (>= 1:4.1.1), liblzma5 (>= 5.1.1alpha+20120614), libstdc++6 (>= 4.6), libwrap0 (>= 7.6-4~), zlib1g (>= 1:1.1.4), debconf (>= 0.5) | debconf-2.0, adduser
Pre-Depends: dpkg (>= 1.15.6)
Recommends: perl (>> 5.8), ed
Suggests: doc-base, libfuse2 (>= 2.5)
Conflicts: logrotate (<< 3.8.0)
Description-en: caching proxy server for software repositories
 Apt-Cacher NG is a caching proxy for downloading packages from Debian-style
 software repositories (or possibly from other types).
 .
 The main principle is that a central machine hosts the proxy for a local
 network, and clients configure their APT setup to download through it.
 Apt-Cacher NG keeps a copy of all useful data that passes through it, and when
 a similar request is made, the cached copy of the data is delivered without
 being re-downloaded.
 .
 Apt-Cacher NG has been designed from scratch as a replacement for
 apt-cacher, but with a focus on maximizing throughput with low system
 resource requirements. It can also be used as replacement for apt-proxy and
 approx with no need to modify clients' sources.list files.
Homepage: http://www.unix-ag.uni-kl.de/~bloch/acng/
Description-md5: b88e5e2d04c76e8d4500fb60880c7d76
Tag: admin::package-management, implemented-in::c, interface::daemon,
 network::server, network::service, protocol::http, role::program,
 suite::debian, use::downloading, use::proxying,
 works-with::software:package, works-with::software:source
Section: net
Priority: optional
Filename: pool/main/a/apt-cacher-ng/apt-cacher-ng_0.7.11-1_amd64.deb
Size: 419640
MD5sum: 85463208862ad21c4bbf7b7dc740bf4a
SHA1: 3218bf36939cefedb87f286961719fc8128b9e5a
SHA256: 5cb620e0c45509a68f3499a52c2810afac4893c851ffc34b4f31711cbe3c045c
% apt-get install apt-cacher-ng

/etc/init.d/apt-cacher-ngを眺めてみると/etc/defautl/apt-cacher-ngファイルを読み込んでいて、/etc/apt-cacher-ngディレクトリにある設定ファイルを読み込んでいた。

$ ls /etc/apt-cacher-ng/
acng.conf                backends_debvol          security.conf
backends_debian          backends_ubuntu
backends_debian.default  backends_ubuntu.default
$ service apt-cacher-ng start

特になにも設定せずに起動すると3142でListenする。(3142でListenするようにacng.confに書かれている。)「http://${IP_ADDRESS}:3142/」にアクセスすると、キャッシュのヒット率などを確認できる。

client

/etc/apt/apt.confか/etc/apt/apt.conf.dにプロキシの設定をする。

% vi /etc/apt/apt.conf.d/02proxy
Acquire::http::Proxy "http://192.168.0.10:3142";
Acquire::ftp::Proxy "ftp://192.168.0.10:3142";

これでパッケージ配布サーバから同じパッケージを何度も取ってこなくてよくなり、配布サーバに優しい環境ができた。

]]>
Sat, 28 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/27/centos_65_clamav.html http://d.zinrai.info/blog/html/2014/06/27/centos_65_clamav.html <![CDATA[CentOS 6.5 で ClamAV を使ってみた]]> CentOS 6.5 で ClamAV を使ってみた
$ uname -srv
Linux 2.6.32-431.20.3.el6.x86_64 #1 SMP Thu Jun 19 21:14:45 UTC 2014

$ cat /etc/redhat-release
CentOS release 6.5 (Final)
% yum install http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ cat /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

EPELだとclamavとclamdにパッケージが分かれている。それぞれのパッケージに入っているものは表のようになっている。

clamav    
  clamscan 単体で動作するウィルススキャン用コマンド
  freshclam ウィルス定義ファイルを更新するためのコマンド
clamd    
  clamd ウィルススキャンデーモン
  clamdscan clamdクライアント

clamdとclamdscanはサーバ、クライアントモデルになっている。clamdがウィルス定義ファイルをメモリに展開しデーモンとして常駐、clamdscanで問い合わせるという形になっている。clamscanはスキャンのたびにウィルス定義ファイルを読み込むが、clamdはメモリに展開しているので高速に動作する。

clamav

$ yum info --enablerepo=epel clamav
Available Packages
Name        : clamav
Arch        : x86_64
Version     : 0.98.3
Release     : 1.el6
Size        : 1.4 M
Repo        : epel
Summary     : Anti-virus software
URL         : http://www.clamav.net/
License     : GPLv2
Description : Clam AntiVirus is a GPL anti-virus toolkit for UNIX. The main
            : purpose of this software is the integration with mail servers
            : (attachment scanning). The package provides a flexible and
            : scalable multi-threaded daemon, a command line scanner, and a
            : tool for automatic updating via Internet.
            :
            : The programs are based on a shared library distributed with the
            : Clam AntiVirus package, which you can use with your own software.
            : Most importantly, the virus database is kept up to date
% yum --enablerepo=epel install clamav
$ rpm -ql clamav
/etc/freshclam.conf
/usr/bin/clambc
/usr/bin/clamscan
/usr/bin/clamsubmit
/usr/bin/freshclam
/usr/bin/sigtool
/usr/lib64/libclamav.so.6
/usr/lib64/libclamav.so.6.1.22
/usr/share/doc/clamav-0.98.3
/usr/share/doc/clamav-0.98.3/AUTHORS
/usr/share/doc/clamav-0.98.3/BUGS
/usr/share/doc/clamav-0.98.3/COPYING
/usr/share/doc/clamav-0.98.3/ChangeLog
/usr/share/doc/clamav-0.98.3/FAQ
/usr/share/doc/clamav-0.98.3/INSTALL
/usr/share/doc/clamav-0.98.3/NEWS
/usr/share/doc/clamav-0.98.3/README
/usr/share/doc/clamav-0.98.3/clamav-mirror-howto.pdf
/usr/share/doc/clamav-0.98.3/clamdoc.pdf
/usr/share/doc/clamav-0.98.3/freshclam.conf
/usr/share/doc/clamav-0.98.3/phishsigs_howto.pdf
/usr/share/doc/clamav-0.98.3/signatures.pdf
/usr/share/man/man1/clamscan.1.gz
/usr/share/man/man1/clamsubmit.1.gz
/usr/share/man/man1/freshclam.1.gz
/usr/share/man/man1/sigtool.1.gz
/usr/share/man/man5/freshclam.conf.5.gz
$ clamscan -r /home/vagrant/
/home/vagrant/.ssh/authorized_keys: OK
/home/vagrant/.bash_logout: OK
/home/vagrant/.bashrc: OK
/home/vagrant/.bash_history: OK
/home/vagrant/.lesshst: OK
/home/vagrant/.vbox_version: OK
/home/vagrant/.bash_profile: OK

----------- SCAN SUMMARY -----------
Known viruses: 3473278
Engine version: 0.98.3
Scanned directories: 4
Scanned files: 7
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 5.791 sec (0 m 5 s)

他にもログをファイルに書き出したりするオプションもある。clamscan(1)を眺めてみるといい。

clamd

$ yum info --enablerepo=epel clamd
Name        : clamd
Arch        : x86_64
Version     : 0.98.3
Release     : 1.el6
Size        : 159 k
Repo        : epel
Summary     : The Clam AntiVirus Daemon
URL         : http://www.clamav.net/
License     : GPLv2
Description : The Clam AntiVirus Daemon
% yum install --enablerepo=epel clamd
$ rpm -ql clamd
/etc/clamd.conf
/etc/clamd.d
/etc/logrotate.d/clamav
/etc/rc.d/init.d/clamd
/usr/bin/clamconf
/usr/bin/clamdscan
/usr/bin/clamdtop
/usr/sbin/clamd
/usr/share/clamav/README.clamd-wrapper
/usr/share/clamav/clamd-wrapper
/usr/share/doc/clamd-0.98.3
/usr/share/doc/clamd-0.98.3/clamd.conf
/usr/share/man/man1/clambc.1.gz
/usr/share/man/man1/clamconf.1.gz
/usr/share/man/man1/clamdscan.1.gz
/usr/share/man/man1/clamdtop.1.gz
/usr/share/man/man5/clamd.conf.5.gz
/usr/share/man/man8/clamd.8.gz
/var/lib/clamav
/var/log/clamav
/var/log/clamav/clamd.log
/var/run/clamav
% service clamd start
% clamdscan /root
clamdscan /root
/root: lstat() failed: Permission denied. ERROR

インストール時の設定だと「Permission denied」となりスキャンできない。そこで、clamd.confとclamd.conf(5)を眺めてみた。

User STRING
       Run  the  daemon as a specified user (the process must be
       started by root).
       Default: disabled
$ diff -u clamd.conf.orig clamd.conf
--- clamd.conf.orig     2014-06-27 02:23:44.790917776 +0000
+++ clamd.conf  2014-06-27 02:24:19.483912097 +0000
@@ -192,7 +192,7 @@

 # Run as another user (clamd must be started by root for this option to work)
 # Default: don't drop privileges
-User clam
+#User clam

 # Initialize supplementary group access (clamd must be started by root).
 # Default: no
% service clamd restart

デフォルトは「User clam」になっておりclamユーザで動作する。「the process must be started by root」と書かれている通りrootユーザで動かすためにコメントアウトする。これでclamdを再起動すればスキャンできるようになる。

freshclam

proxyの設定もできたりする。freshclam.conf(5)

$ diff -u freshclam.conf.org freshclam.conf
--- freshclam.conf.org  2014-06-16 01:20:57.641926268 +0000
+++ freshclam.conf      2014-06-16 01:21:43.073926648 +0000
@@ -118,8 +118,8 @@

 # Proxy settings
 # Default: disabled
-#HTTPProxyServer myproxy.com
-#HTTPProxyPort 1234
+HTTPProxyServer 192.168.0.1
+HTTPProxyPort 3128
 #HTTPProxyUsername myusername
 #HTTPProxyPassword mypass

clamavインストール時に/etc/cron.dailyにfreshclamという名前のシェルスクリプトが配置され、ウィルス定義ファイルの更新は毎日行われる。あとはこのシェルスクリプトに「yum update –enablerepo=epel clamav clamd」でも仕込んでおけばClamAVあ本体のほうも最新に保てると思う。(EPELが小まめにClamAVを更新してくれていれば)

]]>
Fri, 27 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/26/debian_sid_vagrant_kvm.html http://d.zinrai.info/blog/html/2014/06/26/debian_sid_vagrant_kvm.html <![CDATA[Debian sid で vagrant-kvm を使ってみた]]> Debian sid で vagrant-kvm を使ってみた

Vagrant KVM Providerであるvagrant-kvmを使ってみた。ruby-libvirt(gem)をビルドするのにruby2.0-devが必要になる。ruby2.0-devはtesting,unstableにしか存在しなかったのでsidを使った。vagrant-kvm用に作られたboxを使ってvagrant upするところまではやってみた。

$ uname -srv
Linux 3.14-1-amd64 #1 SMP Debian 3.14.7-1 (2014-06-16)

$ cat /etc/debian_version
jessie/sid
% apt-get install -y qemu qemu-kvm libvirt-bin
% apt-get install -y nfs-kernel-server nfs-common rpcbind
% apt-get install -y redir dnsmasq-base bridge-utils
% apt-get install -y build-essential libxml2-dev libxslt1-dev libvirt-dev ruby2.0-dev
% gpasswd -a zinrai libvirt
$ wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.6.3_x86_64.deb
% dpkg -i vagrant_1.6.3_x86_64.deb
% wget https://vagrant-kvm-boxes.s3.amazonaws.com/precise64-kvm.box
$ vagrant plugin install vagrant-kvm
$ wget https://vagrant-kvm-boxes.s3.amazonaws.com/precise64-kvm.box
$ vagrant box add precise64 precise64-kvm.box

$ vagrant box list
precise64 (kvm, 0)
$ mkdir precise64
$ cd precise64
$ vagrant init precise64
$ vagrant up

特にハマることなく動いた。Vagrantfileについてはまた後日。

]]>
Thu, 26 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/25/debian_sid_install.html http://d.zinrai.info/blog/html/2014/06/25/debian_sid_install.html <![CDATA[Debian sid インストール]]> Debian sid インストール

wheezyからsidにdist-upgradeする。

wheezy

$ uname -srv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2

$ cat /etc/debian_version
7.5
$ diff -u sources.list.orig sources.list
--- sources.list.orig   2014-06-23 21:52:33.706037290 +0900
+++ sources.list        2014-06-23 21:53:03.154059993 +0900
@@ -4,12 +4,12 @@

 # deb cdrom:[Debian GNU/Linux 7.5.0 _Wheezy_ - Official amd64 CD Binary-1 20140426-13:37]/ wheezy main

-deb http://ftp.jp.debian.org/debian/ wheezy main
-deb-src http://ftp.jp.debian.org/debian/ wheezy main
+deb http://ftp.jp.debian.org/debian/ sid main
+deb-src http://ftp.jp.debian.org/debian/ sid main

-deb http://security.debian.org/ wheezy/updates main
-deb-src http://security.debian.org/ wheezy/updates main
+#deb http://security.debian.org/ wheezy/updates main
+#deb-src http://security.debian.org/ wheezy/updates main

 # wheezy-updates, previously known as 'volatile'
-deb http://ftp.jp.debian.org/debian/ wheezy-updates main
-deb-src http://ftp.jp.debian.org/debian/ wheezy-updates main
+#deb http://ftp.jp.debian.org/debian/ wheezy-updates main
+#deb-src http://ftp.jp.debian.org/debian/ wheezy-updates main
% apt-get update
% apt-get upgrade
% apt-get dist-upgrade
% reboot

sid

$ uname -srv
Linux 3.14-1-amd64 #1 SMP Debian 3.14.7-1 (2014-06-16)

$ cat /etc/debian_version
jessie/sid
]]>
Wed, 25 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/24/debian_wheezy_libvirtd_conf_unix_sock_auth_unix.html http://d.zinrai.info/blog/html/2014/06/24/debian_wheezy_libvirtd_conf_unix_sock_auth_unix.html <![CDATA[一般ユーザでvirt-managerを使う]]> 一般ユーザでvirt-managerを使う
$ uname -srv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2

$ cat /etc/debian_version
7.5

Debianではユーザをlibvirtグループに追加するだけ。

% gpasswd -a zinrai libvirt

これだけだと中身カラッポすぎるので、なんでなのかをlibvirt本家ドキュメントとlibvirtのDebianディレクトリで調べてみた。

$ wget http://ftp.de.debian.org/debian/pool/main/libv/libvirt/libvirt_0.9.12.3-1.debian.tar.gz
$ tar zvxf libvirt_0.9.12.3-1.debian.tar.gz
$ cat debian/patches/debian/Allow-libvirt-group-to-access-the-socket.patch
From: Guido Guenther <agx@sigxcpu.org>
Date: Thu, 26 Jun 2008 20:01:38 +0200
Subject: Allow libvirt group to access the socket

---
 daemon/libvirtd.conf |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/daemon/libvirtd.conf b/daemon/libvirtd.conf
index 50eda1b..21cfcce 100644
--- a/daemon/libvirtd.conf
+++ b/daemon/libvirtd.conf
@@ -78,7 +78,7 @@
 # without becoming root.
 #
 # This is restricted to 'root' by default.
-#unix_sock_group = "libvirt"
+unix_sock_group = "libvirt"

 # Set the UNIX socket permissions for the R/O socket. This is used
 # for monitoring VM status only
@@ -95,7 +95,7 @@
 #
 # If not using PolicyKit and setting group ownership for access
 # control then you may want to relax this to:
-#unix_sock_rw_perms = "0770"
+unix_sock_rw_perms = "0770"

 # Set the name of the directory in which sockets will be found/created.
 #unix_sock_dir = "/var/run/libvirt"
@@ -126,7 +126,7 @@
 #
 # To restrict monitoring of domains you may wish to enable
 # an authentication mechanism here
-#auth_unix_ro = "none"
+auth_unix_ro = "none"

 # Set an authentication scheme for UNIX read-write sockets
 # By default socket permissions only allow root. If PolicyKit
@@ -135,7 +135,7 @@
 #
 # If the unix_sock_rw_perms are changed you may wish to enable
 # an authentication mechanism here
-#auth_unix_rw = "none"
+auth_unix_rw = "none"

 # Change the authentication scheme for TCP sockets.
 #

オリジナルソースではコメントアウトされているが、debパッケージ作成時にパッチが当たり、libvirtグループに所属しているユーザはlibvirtのUNIX domain socketへの読み書き実行権限が付与される設定になる。auth_unix_{ro,rw}はパスワード認証やKerberos認証を使えたりするが、デフォルトではこれらの認証方法は使わないようになっている。

]]>
Tue, 24 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/23/debian_wheezy_qemu_nbd.html http://d.zinrai.info/blog/html/2014/06/23/debian_wheezy_qemu_nbd.html <![CDATA[qemu-nbd を使ってディスクイメージをマウントする]]> qemu-nbd を使ってディスクイメージをマウントする

KVMで使っているqcow2ディスクイメージをqemu-nbd(8)でマウントしてみる。

$ uname -srv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2

$ cat /etc/debian_version
7.5
$ modinfo nbd
filename:       /lib/modules/3.2.0-4-amd64/kernel/drivers/block/nbd.ko
license:        GPL
description:    Network Block Device
depends:
intree:         Y
vermagic:       3.2.0-4-amd64 SMP mod_unload modversions
parm:           nbds_max:number of network block devices to initialize (default: 16) (int)
parm:           max_part:number of partitions per device (default: 0) (int)
parm:           debugflags:flags for controlling debug output (int)
% modprobe nbd max_part=16
% qemu-nbd -c /dev/nbd0 test.qcow2
% fdisk -l /dev/nbd0
Disk /dev/nbd0: 214.7 GB, 214748364800 bytes
255 heads, 63 sectors/track, 26108 cylinders, total 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000da898

     Device Boot      Start         End      Blocks   Id  System
/dev/nbd0p1   *        2048   415238143   207618048   83  Linux
/dev/nbd0p2       415240190   419428351     2094081    5  Extended
/dev/nbd0p5       415240192   419428351     2094080   82  Linux swap / Solaris
% mount /dev/nbp0p1 /mnt
$ ls /mnt
bin  boot  dev  etc  home  initrd.img  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var  vmlinuz
% umount /mnt
% qemu-nbd -d /dev/nbd0
/dev/nbd0 disconnected
]]>
Mon, 23 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/22/debian_wheezy_qemu_img_create_rebase.html http://d.zinrai.info/blog/html/2014/06/22/debian_wheezy_qemu_img_create_rebase.html <![CDATA[qemu-img の使い方]]> qemu-img の使い方

KVMを使うときにqemu-img(8)でよく使うサブコマンドをメモしておく。

$ uname -srv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2

$ cat /etc/debian_version
7.5

ディスクイメージ作成

「GuestOSのディスク容量が足りない!!」とならないようにディスクイメージは多めに設定するようにしている。

% qemu-img create -f qcow2 debian_wheezy.qcow2 200G

差分ディスクイメージ作成

snapshotではなく差分をディスクイメージとして書き出すようにしている。差分ディスクイメージをGuestOSのディスクイメージに指定すればベースイメージの状態にいつでも戻すことができる。

% qemu-img create -b debian_wheezy.qcow2 -f qcow2 debian_wheezy.diff.qcow2

rebase

差分ディスクイメージをinfoすると、どのディスクイメージから作成された差分ディスクイメージなのかを示すbacking fileという項目が追加される。rebaseはbacking fileを変更することができる。

% qemu-img info debian_wheezy.qcow2
image: debian_wheezy.qcow2
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 1.4G
cluster_size: 65536
% qemu-img info debian_wheezy.diff.qcow2
image: debian_wheezy.diff.qcow2
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 13G
cluster_size: 65536
backing file: debian_wheezy.qcow2
% cp debian_wheezy.qcow2 debian_wheezy.rebase.qcow2
% qemu-img rebase -b debian_wheezy.rebase.qcow2 debian_wheezy.diff.qcow2

commit

commitを使うと差分ディスクイメージをbacking fileへマージすることがきる。backing fileに指定されているディスクイメージをコピーして、コピーしたディスクイメージをrebaseしてcommitすれば元のbacking fileを汚すことなく差分のマージされたディスクイメージを作ることができたりする。

$ qemu-img info debian_wheezy.diff.qcow2
image: debian_wheezy.diff.qcow2
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 1.0G
cluster_size: 65536
backing file: debian_wheezy.rebase.qcow2
qemu-img commit -f qcow2 debian_wheezy.diff.qcow2

思っていたより書き起こすのに時間が掛かってしまった。info時の情報がおかしいのは途中でディスクイメージを作り直したため。

]]>
Sun, 22 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/21/debian_wheezy_wpasupplicant.html http://d.zinrai.info/blog/html/2014/06/21/debian_wheezy_wpasupplicant.html <![CDATA[Debian wheezy で wpasupplicant を使う]]> Debian wheezy で wpasupplicant を使う

たまにやる無線LANの設定に時間を割かれないようにメモしておく。自分はwicdやnetwork-managerよりもこちらのほうがしっくりきている。

$ uname -srv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2

$ cat /etc/debian_version
7.5
$ apt-cache show wpasupplicant
Package: wpasupplicant
Source: wpa (1.0-3)
Version: 1.0-3+b2
Installed-Size: 1364
Maintainer: Debian/Ubuntu wpasupplicant Maintainers <pkg-wpa-devel@lists.alioth.debian.org>
Architecture: amd64
Depends: libc6 (>= 2.4), libdbus-1-3 (>= 1.1.4), libncurses5 (>= 5.5-5~), libnl-3-200 (>= 3.2.7), libnl-genl-3-200 (>= 3.2.7), libpcsclite1 (>= 1.0.0), libreadline5 (>= 5.2), libssl1.0.0 (>= 1.0.0), libtinfo5, lsb-base (>= 3.0-6), adduser, initscripts (>= 2.88dsf-13.3)
Suggests: wpagui, libengine-pkcs11-openssl
Description-en: client support for WPA and WPA2 (IEEE 802.11i)
 WPA and WPA2 are methods for securing wireless networks, the former
 using IEEE 802.1X, and the latter using IEEE 802.11i. This software
 provides key negotiation with the WPA Authenticator, and controls
 association with IEEE 802.11i networks.
Multi-Arch: foreign
Homepage: http://w1.fi/wpa_supplicant/
Description-md5: db096b22f8ec5f5c7a8ec614d12ca20a
Tag: admin::configuring, implemented-in::c, network::client,
 network::configuration, protocol::ssl, role::program,
 security::cryptography, uitoolkit::ncurses, use::configuring
Section: net
Priority: optional
Filename: pool/main/w/wpa/wpasupplicant_1.0-3+b2_amd64.deb
Size: 607788
MD5sum: 9bfeaab049b5ec37a790edd0c9135394
SHA1: 5283d6c97f994a028338e4c86922fb664ee53051
SHA256: d64c9958245cef38bef65acad696b34066177dfe319b29876106e1738f9b10d6
% apt-get install wireless-tools wpasupplicant

interfaces(5)にパスワード直書きすることもできるけど気持ち悪いのでwpa_passphrase(8)を使っている。wpa_passphrase(8)をコマンドラインで実行すると履歴に残ってしまうのでシェルスクリプトにしている。

$ vi wpa_conf.sh
#!/bin/bash
wpa_passphrase hogehoge fugafuga
$ ./wpa_conf.sh
network={
        ssid="hogehoge"
        #psk="fugafuga"
        psk=b276f31c7d3c1862c991617334abe708b16c1dcc85c1f1cf5ceae1c15bb75572
}

wpa_passphrase(8)を実行すると上記のような設定が標準出力される。あとはこれをコピーしてinterfaces(5)から読み込む設定をするだけ。

$ vi /etc/wpa_supplicant/hoge.conf

network={
        scan_ssid=1 <- アクセスポイントがステルスの場合は必須
        ssid="hogehoge"
        psk=b276f31c7d3c1862c991617334abe708b16c1dcc85c1f1cf5ceae1c15bb75572
}

scan_ssidなどの説明は/usr/share/doc/wpasupplicant/README.Debian.gzに書いてある。

% vi /etc/network/interfaces
iface hogehoge inet dhcp
wpa-conf /etc/wpa_supplicant/hogehoge.conf
ifup wlan0=hogehoge
ifdown wlan0

interface(5)に設定を書いて、ifup(8),ifdown(8)をたたくだけなのでとても楽だ。

]]>
Sat, 21 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/20/centos_65_munin_node_plugin_enable.html http://d.zinrai.info/blog/html/2014/06/20/centos_65_munin_node_plugin_enable.html <![CDATA[Munin node のプラグイン有効化]]> Munin node のプラグイン有効化

Forward Proxy Server(Squid)にmunin-nodeをインストールして監視下に置いた。今回はSquid用のプラグインを有効にしてみる。といってもコマンドを1回叩いてmunin-nodeを再起動するだけ。

$ uname -srv
Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013

$ cat /etc/redhat-release
CentOS release 6.5 (Final)
% munin-node-configure

プラグインが有効になっているか無効になっているかを調べられる。

% munin-node-configure --suggest

プラグインが有効にできるかを教えてくれる。(MySQLはインストールされていないからMySQLのプラグインは有効にできないよとか)

% munin-node-configure --shell squid_
ln -s '/usr/share/munin/plugins/squid_cache' '/etc/munin/plugins/squid_cache'
ln -s '/usr/share/munin/plugins/squid_objectsize' '/etc/munin/plugins/squid_objectsize'
ln -s '/usr/share/munin/plugins/squid_requests' '/etc/munin/plugins/squid_requests'
ln -s '/usr/share/munin/plugins/squid_traffic' '/etc/munin/plugins/squid_traffic'

/usr/share/munin/pluginsにある各種プラグインを/etc/munin/pluginsにシンボリックリンクしてmunin-nodeを再起動すればプラグインは有効になる。–shellオプションを使うと/etc/munin/pluginsにシンボリックリンクするためのコマンドが標準出力される。ここではsquidに関係するものだけ出力するように、squid_を指定している。引数をなにも指定しなければ有効にできるプラグインが全て標準出力される。あとはパイプしてshに流すだけ。

% munin-node-configure --shell squid_ | sh
% service munin-node restart
$ munin-run squid_cache
Maximum.value 4292608
Current.value 951580

$ munin-run squid_objectsize
objectsize.value 179087.36

munin-runコマンドで有効にしたプラグインが値を取得できているか確認できる。

]]>
Fri, 20 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/19/centos_65_munin_node_setup.html http://d.zinrai.info/blog/html/2014/06/19/centos_65_munin_node_setup.html <![CDATA[Munin 監視対象nodeの追加]]> Munin 監視対象nodeの追加

CentOS 6.5 で Munin を使ってみる」は1台で完結する環境だったが、今回は以前に構築したForward Proxy Server(Squid)をMuninの監視下に置いてみる。

munin-server 192.168.0.1
munin-node 192.168.0.2
$ uname -srv
Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

munin-server

$ diff -u munin.conf.orig munin.conf
--- munin.conf.orig     2014-06-16 15:57:47.764255564 +0000
+++ munin.conf  2014-06-17 03:01:15.042610267 +0000
@@ -5,10 +5,10 @@
 # must be writable by the user running munin-cron.  They are all
 # defaulted to the values you see here.
 #
-#dbdir /var/lib/munin
-#htmldir /var/www/html/munin
-#logdir /var/log/munin
-#rundir  /var/run/munin
+dbdir  /var/lib/munin
+htmldir /var/www/html/munin
+logdir /var/log/munin
+rundir  /var/run/munin

 # Where to look for the HTML templates
 #
@@ -37,7 +37,7 @@
 # Since 2.0, munin-graph has been rewritten to use the cgi code.
 # It is single threaded *by design* now.
 #
-graph_strategy cron
+graph_strategy cgi

 # munin-cgi-graph is invoked by the web server up to very many times at the
 # same time.  This is not optimal since it results in high CPU and memory
@@ -66,7 +66,7 @@
 # - moving to CGI for HTML means you cannot have graph generated by cron.
 # - cgi html has some bugs, mostly you still have to launch munin-html by hand
 #
-html_strategy cron
+html_strategy cgi

 # munin-update runs in parallel.
 #
@@ -99,6 +99,11 @@
     address 127.0.0.1
     use_node_name yes

+[proxy-server]
+    address 192.168.0.2
+    use_node_name yes
+
+
 #
 # A more complex example of a host tree
 #

munin-node

% yum install --enablerepo=epel munin-node
$ diff -u munin-node.conf.org munin-node.conf
--- munin-node.conf.org 2014-06-17 02:32:57.919105797 +0000
+++ munin-node.conf     2014-06-17 02:34:30.910104181 +0000
@@ -44,6 +44,8 @@
 allow ^127\.0\.0\.1$
 allow ^::1$

+allow ^192\.168\.0\.1$
+
 # If you have installed the Net::CIDR perl module, you can use one or more
 # cidr_allow and cidr_deny address/mask patterns.  A connecting client must
 # match any cidr_allow, and not match any cidr_deny.  Note that a netmask
]]>
Thu, 19 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/18/centos_65_munin_setup.html http://d.zinrai.info/blog/html/2014/06/18/centos_65_munin_setup.html <![CDATA[CentOS 6.5 で Munin を使ってみる]]> CentOS 6.5 で Munin を使ってみる

nginxのインストールは完了したので、1台にMunin-serverとMunin-nodeをインストールしてモニタリングする環境を構築する。

$ uname -srv
Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013

$ cat /etc/redhat-release
CentOS release 6.5 (Final)
% yum install http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ yum info --enablerepo=epel munin
Available Packages
Name        : munin
Arch        : noarch
Version     : 2.0.21
Release     : 1.el6
Size        : 195 k
Repo        : epel
Summary     : Network-wide graphing framework (grapher/gatherer)
URL         : http://munin-monitoring.org/
License     : GPLv2
Description : Munin is a highly flexible and powerful solution used to create
            : graphs of virtually everything imaginable throughout your network,
            : while still maintaining a rattling ease of installation and
            : configuration.
            :
            : This package contains the grapher/gatherer. You will only need one
            : instance of it in your network. It will periodically poll all the
            : nodes in your network it's aware of for data, which it in turn
            : will use to create graphs and HTML pages, suitable for viewing
            : with your graphical web browser of choice.
            :
            : Munin is written in Perl, and relies heavily on Tobi Oetiker's
            : excellent RRDtool.
            :
            : Creaete a munin web user after installing:
            : htpasswd -bc /etc/munin/munin-htpasswd MUNIN_WEB_USER PASSWORD
% yum install --enablerepo=epel munin munin-node munin-common munin-nginx

Munin 設定

$ cd /etc/munin
% cp munin.conf munin.conf.org
% cp munin-node.conf munin-node.conf.org

munin.conf(5)を眺めてみると以下のように書かれていた。

graph_strategy value
           Deprecated. (Graphs are now always drawn via CGI.)

graph_strategyは廃止でグラフは常にCGIで描かれているようだ。munin.conf(5)にはhtml_strategyについての記述はなかったが、munin.confにはhtml_strategyが設定されていた。なんでなのかはよくわからない。

$ diff -u munin.conf.org munin.conf
--- munin.conf.org      2014-06-16 15:57:47.764255564 +0000
+++ munin.conf  2014-06-17 01:30:28.002698093 +0000
@@ -5,10 +5,10 @@
 # must be writable by the user running munin-cron.  They are all
 # defaulted to the values you see here.
 #
-#dbdir /var/lib/munin
-#htmldir /var/www/html/munin
-#logdir /var/log/munin
-#rundir  /var/run/munin
+dbdir  /var/lib/munin
+htmldir /var/www/html/munin
+logdir /var/log/munin
+rundir  /var/run/munin

 # Where to look for the HTML templates
 #
@@ -37,7 +37,7 @@
 # Since 2.0, munin-graph has been rewritten to use the cgi code.
 # It is single threaded *by design* now.
 #
-graph_strategy cron
+graph_strategy cgi

 # munin-cgi-graph is invoked by the web server up to very many times at the
 # same time.  This is not optimal since it results in high CPU and memory
@@ -66,7 +66,7 @@
 # - moving to CGI for HTML means you cannot have graph generated by cron.
 # - cgi html has some bugs, mostly you still have to launch munin-html by hand
 #
-html_strategy cron
+html_strategy cgi

 # munin-update runs in parallel.
 #

nginx 設定

必要のないconfがincludeされないようにリネームしておく。

$ cd /etc/nginx/conf.d
$ ls
default.conf  example_ssl.conf  munin.conf

% cp munin.conf munin.conf.orig
% mv default.conf default.conf.orig
% mv exsample_ssl.conf exsample_ssl.conf.orig

Munin 起動

% service munin-fcgi-graph start
% service munin-fcgi-html start
% service munin-node  start
% service nginx start

% chkconfig munin-fcgi-graph on
% chkconfig munin-fcgi-html on
% chkconfig munin-node on
% chkconfig nginx on
]]>
Wed, 18 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/17/centos_65_nginx_install.html http://d.zinrai.info/blog/html/2014/06/17/centos_65_nginx_install.html <![CDATA[CentOS 6.5 に nginx をインストール]]> CentOS 6.5 に nginx をインストール
$ uname -a
Linux proxy-client01 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release
CentOS release 6.5 (Final)
% yum install http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
% rpm --import http://nginx.org/keys/nginx_signing.key
$ cat /etc/yum.repos.d/nginx.repo
# nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=1
enabled=0
$ yum info --enablerepo=nginx nginx
Available Packages
Name        : nginx
Arch        : x86_64
Version     : 1.6.0
Release     : 1.el6.ngx
Size        : 335 k
Repo        : nginx
Summary     : High performance web server
URL         : http://nginx.org/
License     : 2-clause BSD-like license
Description : nginx [engine x] is an HTTP and reverse proxy server, as well as
            : a mail proxy server.
% yum install --enablerepo=nginx nginx
]]>
Tue, 17 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/16/centos_65_aide.html http://d.zinrai.info/blog/html/2014/06/16/centos_65_aide.html <![CDATA[AIDEを使ってみた]]> AIDEを使ってみた

ファイルやディレクトリの整合性をチェックするAIDEを使ってみた。

uname -a
Linux proxy-client01 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

cat /etc/redhat-release
CentOS release 6.5 (Final)
$ yum info aide
Available Packages
Name        : aide
Arch        : x86_64
Version     : 0.14
Release     : 3.el6_2.2
Size        : 123 k
Repo        : base
Summary     : Intrusion detection environment
URL         : http://sourceforge.net/projects/aide
License     : GPLv2+
Description : AIDE (Advanced Intrusion Detection Environment) is a file
            : integrity checker and intrusion detection program.
% yum install -y aide

使い方や設定はaide(1),aide.conf(5)を眺めてみるといい。

aide.db.gz 過去のある時点のスナップショット
aide.db.new.gz –init、–updateした時点のスナップショット

aide.db.gzは、–init時に生成されるaide.db.new.gzをコピーする。aide.conf(5)のreport_urlでログをファイルに書き出す設定がされている。ログファイルは追記ではなく上書きされる。cron(8)などを使うときにはログファイルの扱いに気を付けたほうがよさそう。

% aide -v
Aide 0.14

Compiled with the following options:

WITH_MMAP
WITH_POSIX_ACL
WITH_SELINUX
WITH_PRELINK
WITH_XATTR
WITH_LSTAT64
WITH_READDIR64
WITH_ZLIB
WITH_GCRYPT
WITH_AUDIT
CONFIG_FILE = "/etc/aide.conf"

% aide --init
$ cd /var/lib/aide/
% cp aide.db.new.gz aide.db.gz
% yum install mlocate

checkオプションはaide.db.gzとの差分をstdoutするだけ。

% aide --check
AIDE found differences between database and filesystem!!
Start timestamp: 2014-06-15 08:28:41

Summary:
  Total number of files:        19859
  Added files:                  32
  Removed files:                0
  Changed files:                28


---------------------------------------------------
Added files:
---------------------------------------------------

added: /etc/cron.daily/mlocate.cron
added: /etc/updatedb.conf
added: /usr/share/locale/hu/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/sr@latin/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/pl/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/bg/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/it/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/fr/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/nl/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/ja/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/es/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/pt_BR/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/sr/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/zh_CN/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/ca/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/sv/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/pt/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/de/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/da/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/ms/LC_MESSAGES/mlocate.mo
added: /usr/share/locale/cs/LC_MESSAGES/mlocate.mo
added: /usr/share/man/man1/locate.1.gz
added: /usr/share/man/man8/updatedb.8.gz
added: /usr/share/man/man5/mlocate.db.5.gz
added: /usr/share/man/man5/updatedb.conf.5.gz
added: /usr/share/doc/mlocate-0.22.2
added: /usr/share/doc/mlocate-0.22.2/AUTHORS
added: /usr/share/doc/mlocate-0.22.2/COPYING
added: /usr/share/doc/mlocate-0.22.2/NEWS
added: /usr/share/doc/mlocate-0.22.2/README
added: /usr/bin/updatedb
added: /usr/bin/locate

---------------------------------------------------
Changed files:
---------------------------------------------------

changed: /etc/gshadow-
changed: /etc/group-
changed: /etc/group
changed: /etc/gshadow
changed: /usr/share/locale/hu/LC_MESSAGES
changed: /usr/share/locale/sr@latin/LC_MESSAGES
changed: /usr/share/locale/pl/LC_MESSAGES
changed: /usr/share/locale/bg/LC_MESSAGES
changed: /usr/share/locale/it/LC_MESSAGES
changed: /usr/share/locale/fr/LC_MESSAGES
changed: /usr/share/locale/nl/LC_MESSAGES
changed: /usr/share/locale/ja/LC_MESSAGES
changed: /usr/share/locale/es/LC_MESSAGES
changed: /usr/share/locale/pt_BR/LC_MESSAGES
changed: /usr/share/locale/sr/LC_MESSAGES
changed: /usr/share/locale/zh_CN/LC_MESSAGES
changed: /usr/share/locale/ca/LC_MESSAGES
changed: /usr/share/locale/sv/LC_MESSAGES
changed: /usr/share/locale/pt/LC_MESSAGES
changed: /usr/share/locale/de/LC_MESSAGES
changed: /usr/share/locale/da/LC_MESSAGES
changed: /usr/share/locale/ms/LC_MESSAGES
changed: /usr/share/locale/cs/LC_MESSAGES
changed: /usr/share/man/man1
changed: /usr/share/man/man8
changed: /usr/share/man/man5
changed: /usr/share/doc
changed: /usr/bin

--------------------------------------------------
Detailed information about changes:
---------------------------------------------------


File: /etc/gshadow-
  Size     : 414                              , 425
  Mtime    : 2014-03-07 11:53:23              , 2014-03-07 11:54:59
  Ctime    : 2014-03-07 11:54:59              , 2014-06-15 08:28:32
  MD5      : cvx+ZXNhPL78HfMjAbnH9g==         , 7hfWtwz10Tdya557L4uVZA==
  RMD160   : u42DRpXf1noceXiFwThBoVrSKDs=     , xE16Is6e+0GZw1cIQ1F+FHEZTJU=
  SHA256   : NJPbsAoNwx3SUna9m2BcyPBdUbaeNrZK , +hEhuoo1WSgYv6i5VPRKMrTDtIQ/7/5R

File: /etc/group-
  Size     : 507                              , 521
  Mtime    : 2014-03-07 11:53:23              , 2014-03-07 11:54:59
  Ctime    : 2014-03-07 11:54:59              , 2014-06-15 08:28:32
  MD5      : MB8H+hstzr+hQ06tfwzt6Q==         , yTc/3lZVr0mPv+1Ycp/wtA==
  RMD160   : 1zqmuSo3YJ0GGfxyXk0NbcPbtgM=     , RbVuRqJWClm7vQBZtHGULs1OhhU=
  SHA256   : MiK+60AuFGpcxHGosswMwtIHBO9UxRiu , ZlxOVsf/Pl/NGak3/0AgjRbI/ZNxp+d5

File: /etc/group
  Size     : 521                              , 535
  Mtime    : 2014-03-07 11:54:59              , 2014-06-15 08:28:32
  Ctime    : 2014-03-07 11:54:59              , 2014-06-15 08:28:32
  Inode    : 394246                           , 393881
  MD5      : yTc/3lZVr0mPv+1Ycp/wtA==         , +1LvvAILb+nxLPcanGE5cQ==
  RMD160   : RbVuRqJWClm7vQBZtHGULs1OhhU=     , YbvTQiKi/vb/lHr+RzusZ5ygFuo=
  SHA256   : ZlxOVsf/Pl/NGak3/0AgjRbI/ZNxp+d5 , +Qg4WQ9k1FqzIsYKkDpkbxUgVK2Z8jF+

File: /etc/gshadow
  Size     : 425                              , 437
  Mtime    : 2014-03-07 11:54:59              , 2014-06-15 08:28:32
  Ctime    : 2014-03-07 11:54:59              , 2014-06-15 08:28:32
  Inode    : 393784                           , 393879
  MD5      : 7hfWtwz10Tdya557L4uVZA==         , 1wlrkrrGfjwLPjDe8yQPBA==
  RMD160   : xE16Is6e+0GZw1cIQ1F+FHEZTJU=     , Gu97aK52mdun+fpgto6xqRVoiMk=
  SHA256   : +hEhuoo1WSgYv6i5VPRKMrTDtIQ/7/5R , kr8w3IB3iDb1NAP0wSUS6mXYILzVU30L

Directory: /usr/share/locale/hu/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/sr@latin/LC_MESSAGES
  Mtime    : 2014-06-14 13:08:59              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:08:59              , 2014-06-15 08:28:32

Directory: /usr/share/locale/pl/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/bg/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/it/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/fr/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/nl/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/ja/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/es/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/pt_BR/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/sr/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/zh_CN/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/ca/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/sv/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/pt/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/de/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/da/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/locale/ms/LC_MESSAGES
  Mtime    : 2014-06-14 13:08:59              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:08:59              , 2014-06-15 08:28:32

Directory: /usr/share/locale/cs/LC_MESSAGES
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/man/man1
  Mtime    : 2014-06-15 08:24:53              , 2014-06-15 08:28:32
  Ctime    : 2014-06-15 08:24:53              , 2014-06-15 08:28:32

Directory: /usr/share/man/man8
  Mtime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:25              , 2014-06-15 08:28:32

Directory: /usr/share/man/man5
  Mtime    : 2014-06-15 08:24:53              , 2014-06-15 08:28:32
  Ctime    : 2014-06-15 08:24:53              , 2014-06-15 08:28:32

Directory: /usr/share/doc
  Mtime    : 2014-06-15 08:24:53              , 2014-06-15 08:28:32
  Ctime    : 2014-06-15 08:24:53              , 2014-06-15 08:28:32
  Linkcount: 44                               , 45

Directory: /usr/bin
  Mtime    : 2014-06-14 13:09:27              , 2014-06-15 08:28:32
  Ctime    : 2014-06-14 13:09:27              , 2014-06-15 08:28:32

updateオプションはaide.db.new.gzを生成する。

% aide --update
]]>
Mon, 16 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/15/centos_65_mysql_community_server.html http://d.zinrai.info/blog/html/2014/06/15/centos_65_mysql_community_server.html <![CDATA[CentOS 6.5 MySQL 5.6 インストール]]> CentOS 6.5 MySQL 5.6 インストール

MySQL5.6をyum(8)できるようにした。

$ uname -a
Linux proxy-client02 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

インストール

% yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
$ yum info mysql-community-server
Available Packages
Name        : mysql-community-server
Arch        : x86_64
Version     : 5.6.19
Release     : 2.el6
Size        : 52 M
Repo        : mysql56-community
Summary     : A very fast and reliable SQL database server
URL         : http://www.mysql.com/
License     : Copyright (c) 2000, 2014, Oracle and/or its affiliates. All
            : rights reserved. Under GPLv2 license as shown in the Description
            : field.
Description : The MySQL(TM) software delivers a very fast, multi-threaded,
            : multi-user, and robust SQL (Structured Query Language) database
            : server. MySQL Server is intended for mission-critical, heavy-load
            : production systems as well as for embedding into mass-deployed
            : software. MySQL is a trademark of Oracle and/or its affiliates
            :
            : The MySQL software has Dual Licensing, which means you can use
            : the MySQL software free of charge under the GNU General Public
            : License (http://www.gnu.org/licenses/). You can also purchase
            : commercial MySQL licenses from Oracle and/or its affiliates if
            : you do not wish to be bound by the terms of the GPL. See the
            : chapter "Licensing and Support" in the manual for further info.
            :
            : The MySQL web site (http://www.mysql.com/) provides the latest
            : news and information about the MySQL software.  Also please see
            : the documentation and the manual for more information.
            :
            : This package includes the MySQL server binary as well as related
            : utilities to run and administer a MySQL server.
% yum install mysql-community-server

my.cnf

$ diff -u my.cnf.org my.cnf
--- my.cnf.org  2014-06-14 16:26:43.920377328 +0000
+++ my.cnf      2014-06-15 06:04:20.169191216 +0000
@@ -26,6 +26,8 @@
 # Recommended in standard MySQL setup
 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

+character-set-server = utf8
+
 [mysqld_safe]
 log-error=/var/log/mysqld.log
 pid-file=/var/run/mysqld/mysqld.pid

起動してcharacter_setやstatusを見てみる。

$ mysql -u root -p

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.6.19, for Linux (x86_64) using  EditLine wrapper

Connection id:          3
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.6.19 MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 1 hour 40 min 43 sec

Threads: 1  Questions: 10  Slow queries: 0  Opens: 67  Flush tables: 1  Open tables: 60  Queries per second avg: 0.001
--------------
]]>
Sun, 15 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/14/freebsd_10_poudriere.html http://d.zinrai.info/blog/html/2014/06/14/freebsd_10_poudriere.html <![CDATA[poudriereで自前のpkgリポジトリを作る]]> poudriereで自前のpkgリポジトリを作る

以前ブログで書いたようなことをやってくれるツール(poudriere)があるということを知ったので使ってみた。

% pkg update

% pkg search -o poudriere
ports-mgmt/poudriere
ports-mgmt/poudriere-devel

% pkg search -d poudriere
poudriere-3.0.16:
poudriere-devel-3.0.99.20140517_1:

% pkg install poudriere

poudriere(8)にサブコマンドとオプションについての説明がしっかり書かれているので、これを読めばハマることはあまりなさそう。poudriere(8)はZFSを使うのでZFSのpoolを事前に作成しておく必要がある。

% cd /usr/local/etc
% cp poudriere.conf poudriere.conf.org
$ diff -u poudriere.conf.org poudriere.conf
--- poudriere.conf.org  2014-05-25 15:21:34.000000000 +0900
+++ poudriere.conf      2014-05-25 15:27:09.000000000 +0900
@@ -10,6 +10,7 @@
 # poudriere.
 #
 #ZPOOL=tank
+ZPOOL=zpool_raidz

 ### NO ZFS
 # To not use ZFS, define NO_ZFS=yes
@@ -26,7 +27,7 @@
 #
 # Also not that every protocols supported by fetch(1) are supported here, even
 # file:///
-FREEBSD_HOST=_PROTO_://_CHANGE_THIS_
+FREEBSD_HOST=ftp://ftp.jp.FreeBSD.org

 # By default the jails have no /etc/resolv.conf, you will need to set
 # REVOLV_CONF to a file on your hosts system that will be copied has
@@ -136,6 +137,7 @@
 #
 # Cleanout the restricted packages
 # NO_RESTRICTED=yes
+NO_RESTRICTED=yes

 # By default MAKE_JOBS is disabled to allow only one process per cpu
 # Use the following to allow it anyway

ports

poudriere(8)用のportsを展開する。

% poudriere ports -c
% poudriere ports -u

jail

poudriere(8)用のjailを作成する。

% poudriere jail -c -j 10amd64 -v 10.0-RELEASE -a amd64
% poudriere jail -d -j 10amd64

% poudriere jail -l
JAILNAME             VERSION              ARCH    METHOD
10amd64              10.0-RELEASE         amd64   ftp

% poudriere jail -u -j 10amd64

bulk

下記のようにテキストファイルにビルドしたいパッケージを記述して読み込ませるだけで、あとは勝手にパッケージをビルドしてくれる。

$ cat pkg_list.txt
sysutils/tmux
% poudriere bulk -f pkg_list.txt -j 10amd64
% poudriere bulk -c -f pkg_list.txt -j 10amd64

options

bulkを実行する前にコンパイルオプションを指定したい場合はoptionsサブコマンドを使えばいい。

% poudriere options -f pkg_list.txt -j 10amd64
% poudriere options -n -f pkg_list.txt -j 10amd64
% poudriere options -c -f pkg_list.txt -j 10amd64
% poudriere options -C -f pkg_list.txt -j 10amd64
% poudriere options -r -f pkg_list.txt -j 10amd64

packagesは下記のディレクトに配置される。あとはWEBサーバを動かせば自前のpkgリポジトリの出来上がり。便利すぎる...。

% ls /usr/local/poudriere/data/packages/

https://fossil.etoilebsd.net/poudriere/doc/trunk/doc/index.wiki

]]>
Sat, 14 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/13/centos65_socks_proxy_dante.html http://d.zinrai.info/blog/html/2014/06/13/centos65_socks_proxy_dante.html <![CDATA[danteでSocks Proxy]]> danteでSocks Proxy

会社で使う用事があったのでメモ。設定はここに載せているものとは違う。

$ uname -a
Linux proxy-server 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release
CentOS release 6.5 (Final)
% rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

「enabled = 0」にして–enablerepoしなければrpmforgeを見に行かないようにしておく。

% vi /etc/yum.repos.d/rpmforge.repo
### Name: RPMforge RPM Repository for RHEL 6 - dag
### URL: http://rpmforge.net/
[rpmforge]
name = RHEL $releasever - RPMforge.net - dag
baseurl = http://apt.sw.be/redhat/el6/en/$basearch/rpmforge
mirrorlist = http://mirrorlist.repoforge.org/el6/mirrors-rpmforge
#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
enabled = 0
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1

Server

$ yum --enablerepo=rpmforge info dante-server
Installed Packages
Name        : dante-server
Arch        : x86_64
Version     : 1.4.0
Release     : 1.el6.rf
Size        : 951 k
Repo        : installed
From repo   : rpmforge
Summary     : free Socks v4/v5 server implementation
URL         : http://www.inet.no/dante/
License     : BSD-type
Description : This package contains the socks proxy daemon and its
            : documentation. The sockd is the server part of the Dante socks
            : proxy package and allows socks clients to connect through it to
            : the network.
% yum -enablerepo=rpmforge install dante-server

sockd.conf(5)を眺めて設定してみる。sockd.conf(5)はサーバ設定、ルール、ルートの3つの構成になっている。socks serverに関係するsocks-ruleとsocks clientに関係するclient-ruleの2つがあり、socks-ruleなのかclient-ruleなのかを調べながら設定することになる。ルール部では、ClientからServerへの接続可否、Serverからインターネット側への接続可否、パケットをプロトコルごとに制限できたりする。ルールは下記の表のようになっている。今回は動作する最低限の設定だけをした(client passとpassのみ)。

client pass/block clientからsocks serverへ接続可否ルール
socks pass/block socks serverから先の接続可否ルール
pass 許可するパケット
block 許可しないパケット
$ diff -u /etc/sockd.conf.org /etc/sockd.conf
--- /etc/sockd.conf.org 2014-06-13 17:08:02.910132544 +0000
+++ /etc/sockd.conf     2014-06-13 17:47:31.482392599 +0000
@@ -39,18 +39,19 @@
 #  Routes:

 # the server will log both via syslog, to stdout and to /var/log/sockd.log
-#logoutput: syslog stdout /var/log/sockd.log
-logoutput: stderr
+logoutput: /var/log/sockd.log
+#logoutput: stderr

 # The server will bind to the address 10.1.1.1, port 1080 and will only
 # accept connections going to that address.
 #internal: 10.1.1.1 port = 1080
 # Alternatively, the interface name can be used instead of the address.
-#internal: eth0 port = 1080
+internal: eth1 port = 1080

 # all outgoing connections from the server will use the IP address
 # 195.168.1.1
 #external: 192.168.1.1
+external: eth1

 # list over acceptable methods, order of preference.
 # A method not set here will never be selected.
@@ -61,9 +62,10 @@

 # methods for socks-rules.
 #method: username none #rfc931
+socksmethod: none

 # methods for client-rules.
-#clientmethod: none
+clientmethod: none

 #or if you want to allow rfc931 (ident) too
 #method: username rfc931 none
@@ -80,7 +82,7 @@
 #user.privileged: sockd

 # when running as usual, it will use the unprivileged userid of "sockd".
-#user.unprivileged: sockd
+user.unprivileged: nobody

 # If you compiled with libwrap support, what userid should it use
 # when executing your libwrap commands?  "libwrap".
@@ -168,9 +170,14 @@
 # This is identical to above, but allows clients without a rfc931 (ident)
 # too.  In practice this means the socks server will try to get a rfc931
 # reply first (the above rule), if that fails, it tries this rule.
-#client pass {
-#        from: 10.0.0.0/8 port 1-65535 to: 0.0.0.0/0
-#}
+client pass {
+        from: 10.8.8.0/24 port 1-65535 to: 0.0.0.0/0
+        log: disconnect connect error
+}
+pass {
+        from: 10.8.8.0/24 to: 0.0.0.0/0
+        log: disconnect connect error
+}


 # drop everyone else as soon as we can and log the connect, they are not

Client

% yum -enablerepo=rpmforge install dante

環境変数を使う場合

$ export SOCKS_SERVER=192.168.0.1:1080
$ export SOCKS_LOGOUTPUT=socks.log
$ export SOCKS_DEBUG=1

設定ファイルに書く場合

$ diff -u /etc/socks.conf.org /etc/socks.conf
--- /etc/socks.conf.org 2014-06-13 17:20:17.081206329 +0000
+++ /etc/socks.conf     2014-06-13 17:21:03.865199065 +0000
@@ -17,3 +17,7 @@
 #        proxyprotocol: socks_v4         # server supports socks v4.
 #        proxyprotocol: http             # server supports http.
 #}
+route {
+        from: 0.0.0.0/0   to: 0.0.0.0/0   via: 10.8.8.251 port = 1080
+        proxyprotocol: socks_v5
+}

socks.conf(5)を眺めてみると、resolveprotocolというパラメータ見付かる。設定されていないければClientがUDPで名前解決を行う。「resolveprotocol: fake」を設定するとSocks Serverに名前解決もしてもらうようになる。

あまり情報がないので本家ドキュメントやsockd.conf(5),socks.conf(5)を眺めてみることをお勧めする。

]]>
Fri, 13 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/12/centos65_forward_proxy_squid.html http://d.zinrai.info/blog/html/2014/06/12/centos65_forward_proxy_squid.html <![CDATA[squidでForward Proxy Server]]> squidでForward Proxy Server

yum(8)で取得するrpmをキャッシュさせたくて、squidでForward Proxy Serverを構築してみた。

% uname -a
Linux proxy-server 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

% cat /etc/redhat-release
CentOS release 6.5 (Final)

squid

$ yum info squid
Available Packages
Name        : squid
Arch        : x86_64
Epoch       : 7
Version     : 3.1.10
Release     : 20.el6_5.3
Size        : 1.7 M
Repo        : updates
Summary     : The Squid proxy caching server
URL         : http://www.squid-cache.org
License     : GPLv2 and (LGPLv2+ and Public Domain)
Description : Squid is a high-performance proxy caching server for Web clients,
            : supporting FTP, gopher, and HTTP data objects. Unlike traditional
            : caching software, Squid handles all requests in a single,
            : non-blocking, I/O-driven process. Squid keeps meta data and especially
            : hot objects cached in RAM, caches DNS lookups, supports non-blocking
            : DNS lookups, and implements negative caching of failed requests.
            :
            : Squid consists of a main server program squid, a Domain Name System
            : lookup program (dnsserver), a program for retrieving FTP data
            : (ftpget), and some management and client tools.
% yum install squid

yum(8)で取得するrpmをキャッシュさせたいのでキャッシュするファイルの最大サイズを大きめに設定する。

% diff -u squid.conf.org squid.conf
--- squid.conf.org      2014-06-12 13:55:43.444802617 +0000
+++ squid.conf  2014-06-13 01:35:22.999614814 +0000
@@ -65,7 +65,11 @@
 hierarchy_stoplist cgi-bin ?

 # Uncomment and adjust the following to add a disk cache directory.
-#cache_dir ufs /var/spool/squid 100 16 256
+cache_mem 1024 MB
+cache_dir ufs /var/spool/squid 4192 16 256
+
+maximum_object_size 128 MB
+maximum_object_size_in_memory 10 MB

 # Leave coredumps in the first cache dir
 coredump_dir /var/spool/squid
$ service squid start

squidclient(1)を使って、どれくれいキャッシュがヒットしているか調べてみた。

% squidclient -p 3128 mgr:client_list
Cache Clients:
Address: 192.168.0.2
Currently established connections: 0
    ICP  Requests 0
    HTTP Requests 180
        TCP_HIT                  106  59%
        TCP_MISS                  70  39%
        TCP_REFRESH_UNMODIFI       4   2%

Address: ::1
Name:    localhost
Currently established connections: 1
    ICP  Requests 0
    HTTP Requests 2
        TCP_MISS                   2 100%

TOTALS
ICP : 0 Queries, 0 Hits (  0%)
HTTP: 182 Requests, 110 Hits ( 60%)
]]>
Thu, 12 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/11/debian_wheezy_mysql_community_server.html http://d.zinrai.info/blog/html/2014/06/11/debian_wheezy_mysql_community_server.html <![CDATA[Debian wheezy MySQL 5.6 インストール]]> Debian wheezy MySQL 5.6 インストール

MySQL5.6をapt-get(8)できるように設定する。

$ uname -a
Linux zinrai 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2 x86_64 GNU/Linux

$ cat /etc/debian_version
7.5
% dpkg -i mysql-apt-config_0.1.5-1debian7_all.deb

$ cat /etc/apt/sources.list.d/mysql.list
### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out this entry, but any other modifications may be lost.
deb http://repo.mysql.com/apt/ stable mysql-5.6
% apt-get update
% apt-get install mysql-community-server

% service mysql start
% mysql -u root -p

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql> use test;
Database changed

mysql> show tables;
Empty set (0.00 sec)
]]>
Wed, 11 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/10/debian_wheezy_virtualbox_apt_line.html http://d.zinrai.info/blog/html/2014/06/10/debian_wheezy_virtualbox_apt_line.html <![CDATA[Debian wheezy VirtualBox apt-line 設定]]> Debian wheezy VirtualBox apt-line 設定

更新のたびにdebパッケージをダウンロードしてインストールするのは面倒なのでVirtualBoxが公開しているapt-lineを設定して、apt-get(8)できるようにした。

$ uname -a
Linux zinrai 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2 x86_64 GNU/Linux

$ cat /etc/debian_version
7.5
% vi /etc/apt/sources.list
# virtualbox
deb http://download.virtualbox.org/virtualbox/debian wheezy contrib
% wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | apt-key add -
% apt-get update
% apt-get install virtualbox4.3
]]>
Tue, 10 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/09/debian_wheezy_nfsv4_client.html http://d.zinrai.info/blog/html/2014/06/09/debian_wheezy_nfsv4_client.html <![CDATA[Debian wheezy NFSv4 Client]]> Debian wheezy NFSv4 Client

NFS Serverを構築したので、ClientからServerへ接続してみる。

% uname -a
Linux zinrai 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2 x86_64 GNU/Linux

% cat /etc/debian_version
7.5
% apt-get install nfs-common

% service nfs-common status
all daemons running

% service nfs-common start
% service nfs-common stop

mount(8)

% mount -t nfs4 192.168.0.1:/mnt/nfs /home/zinrai/nfs

fstab(5)

nfs(5)を眺めながらfstab(5)を設定してみる。

% vi /etc/fstab
192.168.0.1:/mnt/nfs /home/zinrai/nfs nfs4 rw 0 0

% mount -a
% umount /home/zinrai/nfs
]]>
Mon, 09 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/08/freebsd_nfsv4_server.html http://d.zinrai.info/blog/html/2014/06/08/freebsd_nfsv4_server.html <![CDATA[FreeBSD 10 NFSv4 Server]]> FreeBSD 10 NFSv4 Server

FreeBSDでNFSv4サーバを構築してみる。nfsv4(4),exports(5)を眺めながら構築してみた。

$ uname -a
FreeBSD zinrai.localnet 10.0-RELEASE-p3 FreeBSD 10.0-RELEASE-p3 #0: Tue May 13 18:31:10 UTC 2014     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
% vi /etc/rc.conf
nfs_server_enable="YES"
nfsv4_server_enable="YES"
nfsuserd_enable="YES"
nfsd_enable="YES"
rpcbind_enable="YES"
mountd_enable="YES"
# NFSv3
rpc_statd_enable="YES"
rpc_lockd_enable="YES"

nfsv4(4)にはnfs_server_enable,nfsv4_server_enable,nfsuserd_enableをrc.conf(5)に設定するよう書かれている。/etc/rc.dディレクトリでnfs_server_enableをgrepしするとnfdsがマッチした。/etc/rc.d/nfsd(起動スクリプト)を眺めてみると、依存するmountd(8),rpcbind(8)を起動してくれている。ただrc.conf(5)に関係するものをすべて書いておいたほうがどのサービスが動いているのかがわかりやすいのでこうしている。exports(5)を書き換えて設定を反映させたいときはmountd(8)を再起動しなければいけないので、service(8)での明示的な起動と停止ができるこちらのほうが便利である。

% vi /etc/exports
V4: / -network 192.168.0.1 -mask 255.255.255.0
/mnt/nfs -network 192.168.0.1 -mask 255.255.255.0
% showmount -e
Exports list on localhost:
/mnt/nfs                   192.168.0.1
]]>
Sun, 08 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/06/07/debian_wheezy_direnv_xbuild.html http://d.zinrai.info/blog/html/2014/06/07/debian_wheezy_direnv_xbuild.html <![CDATA[direnv + xbuildで環境構築]]> direnv + xbuildで環境構築

direnvを使うと、ディレクトリに環境変数を設定したファイルを置いておけば、そのディレクトリがカレントになったときに設定した環境変数を有効することができる。AWSのACCESS_KEYやSECRET_KEYなどの切り替えが捗りそう。*envでPATHを.zshrcなどに設定しなければいけないことに抵抗があったので、いい感じ。

$ uname -a
Linux zinrai 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2 x86_64 GNU/Linux

$ cat /etc/debian_version
7.5

xbuild

Pythonを入れてみる。

% apt-get install -y libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl

$ git clone https://github.com/tagomoris/xbuild.git
$ xbuild/python-install 2.7.6 $HOME/opt/python-2.7.6

direnv

direnvのMakefileを眺めてみるとデフォルトは/usr/local/binにdirenvを配置するようになっている。削除については特に書かれていない。dpkg(1),apt(8)管理外のソフトに勝手にこういう場所に配置して欲しくないのでStowを使うことにする。

% apt-get install -y golang

$ git clone https://github.com/zimbatm/direnv.git
$ cd direnv
$ make
% make install DESTDIR=/usr/local/stow/direnv
$ cd /usr/local/stow
% stow -v direnv
$ type direnv
direnv is /usr/local/bin/direnv

zshの場合は.zshrcに以下の設定をしておく。

$ vi $HOME/.zshrc
type direnv > /dev/null
if [ $? -eq 0 ]; then
  eval "$(direnv hook zsh)"
fi

$ source $HOME/.zshrc

インストールと設定は完了したので実際に使ってみる。環境変数の設定は.envrcファイルに書く。

$ mkdir -p lang/python-2.7.6
$ cd lang/python-2.7.6

$ vi .envrc
PATH=$HOME/opt/python-2.7.6/bin:$PATH

$ direnv allow .
$  type python
python is /home/zinrai/opt/python-2.7.6/bin/python
$ wget https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz
$ tar zvxf virtualenv-1.11.6.tar.gz
$ python virtualenv-1.11.6/virtualenv.py venv
$ source venv/bin/activate
$ type python
python is /home/zinrai/lang/python2.7.6/venv/bin/python

試しにTinkererでも入れてみる。

% apt-get install libxml2-dev libxslt-dev

$ pip install tinkerer
]]>
Sat, 07 Jun 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/05/05/centos_snort_pulledpork.html http://d.zinrai.info/blog/html/2014/05/05/centos_snort_pulledpork.html <![CDATA[snort ルールセット自動更新]]> snort ルールセット自動更新

前回は自分でルールを書いていたが、既知の不正侵入や攻撃を検知するためのルールがまとまったもの(ルールセット)がsnort.orgから配布されている。ルールセットは大きく分けて2つある。

  • Sourcefire VRT Certified Rules
    SroucefireのVulnerability Research Team(VRT)がメンテナンスをしているオフィシャルなルールセット。
    頻繁に更新が行われている。
    • Subscriber Release
      最新のルールセット(有償)
    • Registered User Release
      「Subscriber Release」より30日遅れのルールセット。snort.orgに登録すればダウンロードできる。
  • Community Rules
    オープンソースコミュニティが作成したルールセットで、VRTが動作確認を行っている。

pulledporkを使うとルールセットのダウンロード、展開、指定のディレクトリに配置を自動でやってくれる。今回は「Sourcefire VRT Certified Rules」の「Registered User Release」を使用する。

RPM作成

OpenSUSE用のSRPMを見付けたのでダウンロードしてSPECファイルを参考にした。rpm作成に使用したSPECファイルはGistに置いた。

$ rpmbuild -ba rpmbuild/SPECS/pulledpork.spec

pulledpork

% diff -u pulledpork.conf.org pulledpork.conf
--- pulledpork.conf.org	2014-05-06 20:09:14.774046736 +0900
+++ pulledpork.conf	2014-05-06 23:26:04.791047913 +0900
@@ -16,14 +16,15 @@
 # i.e. rule_url=http://x.y.z/|a.tar.gz|123,http://z.y.z/|b.tar.gz|456
 # note that the url, rule file, and oinkcode itself are separated by a pipe |
 # i.e. url|tarball|123456789, 
-rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz|<oinkcode>
+#rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz|<oinkcode>
+rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz|123456789
 # NEW Community ruleset:
-rule_url=https://s3.amazonaws.com/snort-org/www/rules/community/|community-rules.tar.gz|Community
+#rule_url=https://s3.amazonaws.com/snort-org/www/rules/community/|community-rules.tar.gz|Community
 # NEW For IP Blacklisting! Note the format is urltofile|IPBLACKLIST|<oinkcode>
 # This format MUST be followed to let pulledpork know that this is a blacklist
-rule_url=http://labs.snort.org/feeds/ip-filter.blf|IPBLACKLIST|open
+#rule_url=http://labs.snort.org/feeds/ip-filter.blf|IPBLACKLIST|open
 # URL for rule documentation! (slow to process)
-rule_url=https://www.snort.org/reg-rules/|opensource.gz|<oinkcode>
+#rule_url=https://www.snort.org/reg-rules/|opensource.gz|<oinkcode>
 #rule_url=https://rules.emergingthreatspro.com/|emerging.rules.tar.gz|open
 # THE FOLLOWING URL is for etpro downloads, note the tarball name change!
 # and the et oinkcode requirement!
@@ -69,14 +70,14 @@
 # rules? (this value has changed as of 0.4.0, previously we copied 
 # all of the rules, now we are creating a single large rules file
 # but still keeping a separate file for your so_rules!
-rule_path=/usr/local/etc/snort/rules/snort.rules
+rule_path=/etc/snort/rules/snort.rules
 
 # What path you want the .rules files to be written to, this is UNIQUE
 # from the rule_path and cannot be used in conjunction, this is to be used with the
 # -k runtime flag, this can be set at runtime using the -K flag or specified
 # here.  If specified here, the -k option must also be passed at runtime, however
 # specifying -K <path> at runtime forces the -k option to also be set
-# out_path=/usr/local/etc/snort/rules/
+out_path=/etc/snort/rules/
 
 # If you are running any rules in your local.rules file, we need to
 # know about them to properly build a sid-msg.map that will contain your
@@ -84,10 +85,10 @@
 # files that are local to your system here by adding a comma and more paths...
 # remember that the FULL path must be specified for EACH value.
 # local_rules=/path/to/these.rules,/path/to/those.rules
-local_rules=/usr/local/etc/snort/rules/local.rules
+local_rules=/etc/snort/rules/local.rules
 
 # Where should I put the sid-msg.map file?
-sid_msg=/usr/local/etc/snort/sid-msg.map
+sid_msg=/etc/snort/sid-msg.map
 
 # New for by2 and more advanced msg mapping.  Valid options are 1 or 2
 # specify version 2 if you are running barnyard2.2+.  Otherwise use 1
@@ -110,11 +111,11 @@
 sorule_path=/usr/local/lib/snort_dynamicrules/
 
 # Path to the snort binary, we need this to generate the stub files
-snort_path=/usr/local/bin/snort
+snort_path=/usr/sbin/snort
 
 # We need to know where your snort.conf file lives so that we can
 # generate the stub files
-config_path=/usr/local/etc/snort/snort.conf
+config_path=/etc/snort/snort.conf
 
 ##### Deprecated - The stubs are now  categorically written to the  single rule file!
 # sostub_path=/usr/local/etc/snort/rules/so_rules.rules
@@ -128,7 +129,7 @@
 # FreeBSD-7-3, FreeBSD-8-1
 # OpenBSD-4-8
 # Slackware-13-1
-distro=FreeBSD-8.1
+distro=RHEL-6-0
 
 #######  This next section is optional, but probably pretty useful to you.
 #######  Please read thoroughly!
% pulledpork -c /etc/pulledpork/pulledpork.conf

    http://code.google.com/p/pulledpork/
      _____ ____
     `----,\    )
      `--==\\  /    PulledPork v0.7.0 - Swine Flu!
       `--==\\/
     .-~~~~-.Y|\\_  Copyright (C) 2009-2013 JJ Cummings
  @_/        /  66\_  cummingsj@gmail.com
    |    \   \   _(")
     \   /-| ||'--'  Rules give me wings!
      \_\  \_\\
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Checking latest MD5 for snortrules-snapshot-2961.tar.gz....
        No Match
        Done
Rules tarball download of snortrules-snapshot-2961.tar.gz....
        They Match
        Done!
Prepping rules from snortrules-snapshot-2961.tar.gz for work....
        Done!
Reading rules...
Setting Flowbit State....
        Enabled 35 flowbits
        Done
Writing /etc/snort/rules/snort.rules....
        Done
Generating sid-msg.map....
        Done
Writing v1 /etc/snort/sid-msg.map....
        Done
Writing /var/log/sid_changes.log....
        Done
Rule Stats...
        New:-------21332
        Deleted:---0
        Enabled Rules:----5240
        Dropped Rules:----0
        Disabled Rules:---16091
        Total Rules:------21331
No IP Blacklist Changes

Done
Please review /var/log/sid_changes.log for additional details
Fly Piggy Fly!
]]>
Mon, 05 May 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/05/04/centos_snort_install.html http://d.zinrai.info/blog/html/2014/05/04/centos_snort_install.html <![CDATA[CentOS 6.5 snort インストール]]> CentOS 6.5 snort インストール

使う用事ができたのでインストールして簡単なルールを書いて動作確認してみる。

$ uname -a
Linux localhost.localdomain 2.6.32-431.11.2.el6.x86_64 #1 SMP Tue Mar 25 19:59:55 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/centos-release
CentOS release 6.5 (Final)
$ yum info snort
Name        : snort
Arch        : x86_64
Epoch       : 1
Version     : 2.9.6.1
Release     : 1
Size        : 15 M
Repo        : installed
Summary     : An open source Network Intrusion Detection System (NIDS)
URL         : http://www.snort.org/
License     : GPL
Description : Snort is an open source network intrusion detection system, capable of
            : performing real-time traffic analysis and packet logging on IP networks.
            : It can perform protocol analysis, content searching/matching and can be
            : used to detect a variety of attacks and probes, such as buffer overflows,
            : stealth port scans, CGI attacks, SMB probes, OS fingerprinting attempts,
            : and much more.
            :
            : Snort has three primary uses. It can be used as a straight packet sniffer
            : like tcpdump(1), a packet logger (useful for network traffic debugging,
            : etc), or as a full blown network intrusion detection system.
            :
            : You MUST edit /etc/snort/snort.conf to configure snort before it will work!
            :
            : There are 5 different packages available. All of them require the base
            : snort rpm (this one). Additionally, you may need to chose a different
            : binary to install if you want database support.
            :
            : If you install a different binary package /usr/sbin/snort should end up
            : being a symlink to a binary in one of the following configurations:
            :
            :         plain                Snort (this package, required)
            :
            : Please see the documentation in /usr/share/doc/snort-2.9.6.1 for more
            : information on snort features and configuration.
$ yum info daq
Name        : daq
Arch        : x86_64
Version     : 2.0.2
Release     : 1
Size        : 961 k
Repo        : installed
Summary     : Data Acquisition Library
URL         : http://www.snort.org/
License     : GNU General Public License
Description : Data Acquisition library for Snort.
Name        : libdnet
Arch        : x86_64
Version     : 1.12
Release     : 6.el6
Size        : 65 k
Repo        : installed
From repo   : epel
Summary     : Simple portable interface to lowlevel networking routines
URL         : http://code.google.com/p/libdnet/
License     : BSD
Description : libdnet provides a simplified, portable interface to several
            : low-level networking routines, including network address
            : manipulation, kernel arp(4) cache and route(4) table lookup and
            : manipulation, network firewalling (IP filter, ipfw, ipchains,
            : pf, ...), network interface lookup and manipulation, raw IP
            : packet and Ethernet frame, and data transmission.

rpmbuild

snort本家のCentOS用のRPMがうまくインストールできなかったので、snort本家が配布しているSRPMをrebuildした。

% yum install rpm-build rpmdevtools
$ rpmdev-setuptree
$ curl -o snort-2.9.6.1-1.src.rpm -O -L http://www.snort.org/downloads/2909
$ curl -o daq-2.0.2-1.src.rpm -O -L http://www.snort.org/downloads/2900

daq

% yum install flex bison
$ rpmbuild --rebuild daq-2.0.2-1.src.rpm
% rpm -ivh rpmbuild/RPMS/x86_64/daq-2.0.2-1.x86_64.rpm

snort

% rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
% yum-config-manager --disable epel

% yum --enablerepo=epel install libdnet-devel
% yum install autoconf automake pcre-devel libpcap-devel gcc openssl-devel

$ rpmbuild --rebuild snort-2.9.6.1-1.src.rpm
% rpm -ivh rpmbuild/RPMS/x86_64/snort-2.9.6.1-1.x86_64.rpm

snort 設定

$ diff -u snort.conf.org snort.conf
--- snort.conf.org	2014-05-04 23:52:08.958045878 +0900
+++ snort.conf	2014-05-05 20:00:07.720036619 +0900
@@ -246,7 +246,7 @@
 dynamicengine /usr/lib64/snort-2.9.6.1_dynamicengine/libsf_engine.so
 
 # path to dynamic rules libraries
-dynamicdetection directory /usr/local/lib/snort_dynamicrules
+#dynamicdetection directory /usr/local/lib/snort_dynamicrules
 
 ###################################################
 # Step #5: Configure preprocessors
@@ -499,12 +499,12 @@
    check_crc
 
 # Reputation preprocessor. For more information see README.reputation
-preprocessor reputation: \
-   memcap 500, \
-   priority whitelist, \
-   nested_ip inner, \
-   whitelist $WHITE_LIST_PATH/white_list.rules, \
-   blacklist $BLACK_LIST_PATH/black_list.rules 
+#preprocessor reputation: \
+#   memcap 500, \
+#   priority whitelist, \
+#   nested_ip inner, \
+#   whitelist $WHITE_LIST_PATH/white_list.rules, \
+#   blacklist $BLACK_LIST_PATH/black_list.rules 
 
 ###################################################
 # Step #6: Configure output plugins
@@ -538,123 +538,7 @@
 ###################################################
 
 # site specific rules
-include $RULE_PATH/local.rules
-
-include $RULE_PATH/app-detect.rules
-include $RULE_PATH/attack-responses.rules
-include $RULE_PATH/backdoor.rules
-include $RULE_PATH/bad-traffic.rules
-include $RULE_PATH/blacklist.rules
-include $RULE_PATH/botnet-cnc.rules
-include $RULE_PATH/browser-chrome.rules
-include $RULE_PATH/browser-firefox.rules
-include $RULE_PATH/browser-ie.rules
-include $RULE_PATH/browser-other.rules
-include $RULE_PATH/browser-plugins.rules
-include $RULE_PATH/browser-webkit.rules
-include $RULE_PATH/chat.rules
-include $RULE_PATH/content-replace.rules
-include $RULE_PATH/ddos.rules
-include $RULE_PATH/dns.rules
-include $RULE_PATH/dos.rules
-include $RULE_PATH/experimental.rules
-include $RULE_PATH/exploit-kit.rules
-include $RULE_PATH/exploit.rules
-include $RULE_PATH/file-executable.rules
-include $RULE_PATH/file-flash.rules
-include $RULE_PATH/file-identify.rules
-include $RULE_PATH/file-image.rules
-include $RULE_PATH/file-java.rules
-include $RULE_PATH/file-multimedia.rules
-include $RULE_PATH/file-office.rules
-include $RULE_PATH/file-other.rules
-include $RULE_PATH/file-pdf.rules
-include $RULE_PATH/finger.rules
-include $RULE_PATH/ftp.rules
-include $RULE_PATH/icmp-info.rules
 include $RULE_PATH/icmp.rules
-include $RULE_PATH/imap.rules
-include $RULE_PATH/indicator-compromise.rules
-include $RULE_PATH/indicator-obfuscation.rules
-include $RULE_PATH/indicator-scan.rules
-include $RULE_PATH/indicator-shellcode.rules
-include $RULE_PATH/info.rules
-include $RULE_PATH/malware-backdoor.rules
-include $RULE_PATH/malware-cnc.rules
-include $RULE_PATH/malware-other.rules
-include $RULE_PATH/malware-tools.rules
-include $RULE_PATH/misc.rules
-include $RULE_PATH/multimedia.rules
-include $RULE_PATH/mysql.rules
-include $RULE_PATH/netbios.rules
-include $RULE_PATH/nntp.rules
-include $RULE_PATH/oracle.rules
-include $RULE_PATH/os-linux.rules
-include $RULE_PATH/os-mobile.rules
-include $RULE_PATH/os-other.rules
-include $RULE_PATH/os-solaris.rules
-include $RULE_PATH/os-windows.rules
-include $RULE_PATH/other-ids.rules
-include $RULE_PATH/p2p.rules
-include $RULE_PATH/phishing-spam.rules
-include $RULE_PATH/policy-multimedia.rules
-include $RULE_PATH/policy-other.rules
-include $RULE_PATH/policy.rules
-include $RULE_PATH/policy-social.rules
-include $RULE_PATH/policy-spam.rules
-include $RULE_PATH/pop2.rules
-include $RULE_PATH/pop3.rules
-include $RULE_PATH/protocol-dns.rules
-include $RULE_PATH/protocol-finger.rules
-include $RULE_PATH/protocol-ftp.rules
-include $RULE_PATH/protocol-icmp.rules
-include $RULE_PATH/protocol-imap.rules
-include $RULE_PATH/protocol-nntp.rules
-include $RULE_PATH/protocol-pop.rules
-include $RULE_PATH/protocol-rpc.rules
-include $RULE_PATH/protocol-scada.rules
-include $RULE_PATH/protocol-services.rules
-include $RULE_PATH/protocol-snmp.rules
-include $RULE_PATH/protocol-telnet.rules
-include $RULE_PATH/protocol-tftp.rules
-include $RULE_PATH/protocol-voip.rules
-include $RULE_PATH/pua-adware.rules
-include $RULE_PATH/pua-other.rules
-include $RULE_PATH/pua-p2p.rules
-include $RULE_PATH/pua-toolbars.rules
-include $RULE_PATH/rpc.rules
-include $RULE_PATH/rservices.rules
-include $RULE_PATH/scada.rules
-include $RULE_PATH/scan.rules
-include $RULE_PATH/server-apache.rules
-include $RULE_PATH/server-iis.rules
-include $RULE_PATH/server-mail.rules
-include $RULE_PATH/server-mssql.rules
-include $RULE_PATH/server-mysql.rules
-include $RULE_PATH/server-oracle.rules
-include $RULE_PATH/server-other.rules
-include $RULE_PATH/server-samba.rules
-include $RULE_PATH/server-webapp.rules
-include $RULE_PATH/shellcode.rules
-include $RULE_PATH/smtp.rules
-include $RULE_PATH/snmp.rules
-include $RULE_PATH/specific-threats.rules
-include $RULE_PATH/spyware-put.rules
-include $RULE_PATH/sql.rules
-include $RULE_PATH/telnet.rules
-include $RULE_PATH/tftp.rules
-include $RULE_PATH/virus.rules
-include $RULE_PATH/voip.rules
-include $RULE_PATH/web-activex.rules
-include $RULE_PATH/web-attacks.rules
-include $RULE_PATH/web-cgi.rules
-include $RULE_PATH/web-client.rules
-include $RULE_PATH/web-coldfusion.rules
-include $RULE_PATH/web-frontpage.rules
-include $RULE_PATH/web-iis.rules
-include $RULE_PATH/web-misc.rules
-include $RULE_PATH/web-php.rules
-include $RULE_PATH/x11.rules
 
 ###################################################
 # Step #8: Customize your preprocessor and decoder alerts
$ vi /etc/snort/rules/icmp.rules
alert icmp any any -> any any
% service snortd start

pingを送受信したときにアラートを掃くルールを書いて、/var/log/snort/alertにアラートが吐かれることを確認した。

]]>
Sun, 04 May 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/05/03/debian_wheezy_ntp_server.html http://d.zinrai.info/blog/html/2014/05/03/debian_wheezy_ntp_server.html <![CDATA[NTPサーバ 構築]]> NTPサーバ 構築

stratum1のNTPサーバを探してNTPサーバを構築してみた。

$ cat /etc/debian_version
7.5

$ uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
% apt-cache show ntp
Package: ntp
Version: 1:4.2.6.p5+dfsg-2
Installed-Size: 1238
Maintainer: Debian NTP Team <pkg-ntp-maintainers@lists.alioth.debian.org>
Architecture: amd64
Depends: adduser, lsb-base (>= 3.2-13), netbase, libc6 (>= 2.12), libcap2 (>= 2.10), libedit2 (>= 2.11-20080614-1), libopts25 (>= 1:5.12), libssl1.0.0 (>= 1.0.0)
Pre-Depends: dpkg (>= 1.15.7.2)
Recommends: perl
Suggests: ntp-doc
Breaks: dhcp3-client (<< 4.1.0-1)
Description-en: Network Time Protocol daemon and utility programs
 NTP, the Network Time Protocol, is used to keep computer clocks
 accurate by synchronizing them over the Internet or a local network,
 or by following an accurate hardware receiver that interprets GPS,
 DCF-77, NIST or similar time signals.
 .
 This package contains the NTP daemon and utility programs.  An NTP
 daemon needs to be running on each host that is to have its clock
 accuracy controlled by NTP.  The same NTP daemon is also used to
 provide NTP service to other hosts.
 .
 For more information about the NTP protocol and NTP server
 configuration and operation, install the package "ntp-doc".
Homepage: http://support.ntp.org/
Description-md5: 220487bd9eceed70fec6b929cb922fd3
Tag: admin::benchmarking, admin::configuring, implemented-in::c,
 interface::commandline, interface::daemon, network::server,
 network::service, protocol::TODO, role::program, scope::utility,
 use::monitor, use::timekeeping
Section: net
Priority: optional
Filename: pool/main/n/ntp/ntp_4.2.6.p5+dfsg-2_amd64.deb
Size: 561700
MD5sum: 508a6082b9aa647949a4f6aab81f51c4
SHA1: f41ab7b089503b2d4a4a67f289b5d8222f0e8912
SHA256: bd2d31f80e7dd070228664f8b48496505395ead795e4ef190cf7bff9931af332
% apt-get install ntp

ntp.nict.jpがIPv6のほうを見に行ってしまっていたのでntp.conf(5),ntpd(8)を眺めてみてIPv4を見に行くように設定した。

$ diff -u /etc/ntp.conf.org /etc/ntp.conf
--- /etc/ntp.conf.org   2014-05-04 06:58:03.118951714 +0900
+++ /etc/ntp.conf       2014-05-04 06:59:49.198747483 +0900
@@ -18,10 +18,13 @@
 # pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
 # pick a different set every time it starts up.  Please consider joining the
 # pool: <http://www.pool.ntp.org/join.html>
-server 0.debian.pool.ntp.org iburst
-server 1.debian.pool.ntp.org iburst
-server 2.debian.pool.ntp.org iburst
-server 3.debian.pool.ntp.org iburst
+#server 0.debian.pool.ntp.org iburst
+#server 1.debian.pool.ntp.org iburst
+#server 2.debian.pool.ntp.org iburst
+#server 3.debian.pool.ntp.org iburst
+server -4 ntp.nict.jp
+server -4 ats1.e-timing.ne.jp
+server -4 ntp.shoshin.co.jp

 # Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
 # details.  The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
@@ -42,6 +45,7 @@
 # Clients from this (example!) subnet have unlimited access, but only if
 # cryptographically authenticated.
 #restrict 192.168.123.0 mask 255.255.255.0 notrust
+restrict 192.168.0.0 mask 255.255.255.0


 # If you want to provide time to your local subnet, change the next line.
% service ntp restart
$ ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 133.243.238.243 .NICT.           1 u   22   64    1   10.702   -3.196   0.000
 61.114.187.55   .PPS.            1 u   21   64    1   10.119   -2.076   0.000
 210.168.211.231 .CDMA.           1 u   20   64    1   12.140   -0.344   0.000
]]>
Sat, 03 May 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/04/22/freebsd_92_jail_rc_conf.html http://d.zinrai.info/blog/html/2014/04/22/freebsd_92_jail_rc_conf.html <![CDATA[FreeBSD 9.2 jail構築]]> FreeBSD 9.2 jail構築

ezjail,qjailなどjailを管理するツールはあるけれどrc.conf(5)にjailの設定を書いて管理する方法を考えてみた。

rc.conf(5)はsh(1)によって読み込まれているので、指定したディレクトリに個々のjailの設定を置いてrc.conf(5)にsourceすればいい感じではないかと思ったのでやってみた。jail.conf(5)あるけどついカッとなってやってみた。後悔はしていない。

が出来上がっている前提で話を進めていく。

$ uname -a
FreeBSD hoge.localnet 9.2-RELEASE FreeBSD 9.2-RELEASE #0 r256370: Sat Oct 12 22:47:21 JST 2013     root@hoge.localnet:/usr/obj/usr/src/9.2.0/sys/VIMAGE  amd64
% mkdir /usr/local/etc/rc.jail
% vi /etc/rc.conf
jail_enable="YES"

for JAIL in /usr/local/etc/rc.jail/*.conf; do
  . $JAIL
done
% vi /usr/local/etc/rc.jail/testjail.conf
. /usr/local/etc/rc.jail/jail_install.sh

NAME="testjail"
IFACE="6"
IPADDR="192.168.0.6"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.254"

JAILROOT="/jails/${NAME}"

if [ ! -d ${JAILROOT} ]; then
  zfs create jails/${NAME}
  jail_install ${JAILROOT}
fi

export jail_${NAME}_devfs_enable="YES"
export jail_${NAME}_devfs_ruleset="devfsrules_jail2"
export jail_${NAME}_nama="${NAME}"
export jail_${NAME}_hostname="${NAME}.localnet"
export jail_${NAME}_rootdir="${JAILROOT}"
export jail_${NAME}_parameters="vnet"

export jail_${NAME}_exec_prestart0="ifconfig epair${IFACE} create up"
export jail_${NAME}_exec_prestart1="ifconfig vswitch0 addm epair${IFACE}a"
export jail_${NAME}_exec_prestart2="mount -t nullfs -o ro /jails/ports /jails/${NAME}/usr/ports"

export jail_${NAME}_exec_poststart0="ifconfig epair${IFACE}b vnet ${NAME}"
export jail_${NAME}_exec_poststart1="jexec ${NAME} ifconfig lo0 127.0.0.1 up"
export jail_${NAME}_exec_poststart2="jexec ${NAME} ifconfig epair${IFACE}b ${IPADDR} netmask ${NETMASK} up"
export jail_${NAME}_exec_poststart3="jexec ${NAME} route add default ${GATEWAY}"

export jail_${NAME}_exec_start0="sh /etc/rc"

export jail_${NAME}_exec_stop0="sh /etc/rc.shutdown"

export jail_${NAME}_exec_poststop0="ifconfig vswitch0 deletem epair${IFACE}a"
export jail_${NAME}_exec_poststop1="ifconfig epair${IFACE}a destroy"
export jail_${NAME}_exec_poststop2="umount /jails/${NAME}/usr/ports"
% vi /etc/devfs.rules
[devfsrules_jail2=5]
add include $devfsrules_jail

add path mem unhide
add path kmem unhide
% vi /usr/local/etc/rc.jail/jail_install.sh
jail_install() {
  local JAILROOT=$1

  for FILE in /usr/local/etc/rc.jail/*.txz; do
    tar xfzp $FILE -C $JAILROOT
  done

  cp /etc/resolv.conf $JAILROOT/etc
  cp /etc/localtime $JAILROOT/etc
  mkdir $JAILROOT/usr/ports
}

bsdinstall(8)にjailというサブコマンドが用意されていてkernelを含まない環境を指定したディレクトリに展開してくれるけど、毎回ファイルをネットから取りに行くのと、インタラクティブなのがつらかったので、ファイルを取得するところだけ眺めてみた。

$ cat `which bsdinstall`
exec "/usr/libexec/bsdinstall/$VERB" "$@" 2>> "$BSDINSTALL_LOG"
$ cd /usr/libexec/bsdinstall
$ file `ls` | grep -v "ELF"
adduser:        POSIX shell script, ASCII text executable
auto:           POSIX shell script, ASCII text executable
checksum:       POSIX shell script, ASCII text executable
config:         POSIX shell script, ASCII text executable
docsinstall:    POSIX shell script, ASCII text executable
hostname:       POSIX shell script, ASCII text executable
jail:           POSIX shell script, ASCII text executable
keymap:         POSIX shell script, ASCII text executable
mirrorselect:   POSIX shell script, ASCII text executable, with very long lines
mount:          POSIX shell script, ASCII text executable
netconfig:      POSIX shell script, ASCII text executable
netconfig_ipv4: POSIX shell script, ASCII text executable
netconfig_ipv6: POSIX shell script, ASCII text executable
rootpass:       POSIX shell script, ASCII text executable
script:         POSIX shell script, ASCII text executable
services:       POSIX shell script, ASCII text executable
time:           POSIX shell script, ASCII text executable
umount:         POSIX shell script, ASCII text executable
wlanconfig:     POSIX shell script, ASCII text executable
$ cat mirrorselect
_UNAME_R=`uname -r`

case ${_UNAME_R} in
        *-CURRENT|*-STABLE|*-PRERELEASE)
                RELDIR="snapshots"
                ;;
        *)
                RELDIR="releases"
                ;;
esac

BSDINSTALL_DISTSITE="$MIRROR/pub/FreeBSD/${RELDIR}/`uname -m`/`uname -p`/${_UNAME_R}"

mirrorselectで展開されるアドレスアクセスしてbase.txzと必要なファイルをダウンロードする。

]]>
Tue, 22 Apr 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/03/29/debian_wheezy_ruby_build_rbenv.html http://d.zinrai.info/blog/html/2014/03/29/debian_wheezy_ruby_build_rbenv.html <![CDATA[rbenv + ruby-build]]> rbenv + ruby-build

最近使い始めてglobal,local,shellの理解がぼんやりしていたのでメモ

$ uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.4 (wheezy)
Release:        7.4
Codename:       wheezy
% apt-get install libreadline6-dev zlib1g-dev libssl-dev build-essential
$ git clone https://github.com/sstephenson/rbenv.git $HOME/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

$ vi $HOME/.bashrc
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

$ . .bashrc

rbenv

サブコマンドがいろいろあるけれど、自分はこれだけ覚えていればいいかなと思っている。

$ rbenv
rbenv 0.4.0-89-g14bc162

install

$ rbenv install 1.9.3-p392
$ rbenv install 2.0.0-p353

uninstall

$ rbenv uninstall 1.9.3-p392
$ rbenv uninstall 2.0.0-p353

rehash

rbenvを使うとPATHに~/.rbenv/shimsが追加される。gemでインストールした実行ファイルは~/.rbenv/versions/x.y.x/binに格納される。rehashを実行するとgemでインストールした実行ファイルを呼び出すための実行ファイルが~/.rbenv/shimsに生成される。自分はbundlerを使っているので、bundler自体をインストールしたときにしか使っていない。

$ gem install bundler
$ rbenv rehash

rubyのversionの切り替えには以下の3つが使われている。ここがrbenvの肝だと思う。

~/.rbenv/version デフォルトで使用するversionが書かれている。
.ruby-version カレントディレクトリにこのファイルがある場合はここに書かれているversionが優先される。
RBENV_VERSION この環境変数がセットされている場合はここに書かれているversionが優先される。

RBENV_VERSION > .ruby-version > ~/.rbenv/versionとなっている。

global

$ rbenv global 1.9.3-p392

local

カレントディレクトリに.ruby-versionが生成される。–unsetオプションでカレントディレクトリの.ruby-versionは削除される。

$ rbenv local 1.9.3-p392
$ rbenv local --unset

shell

RBENV_VERSIONがセットされる。–unsetオプションでRBENV_VERSIONはunsetされる。

$ rbenv shell 1.9.3-p392
$ rbenv shell --unset
]]>
Sat, 29 Mar 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/03/28/debian_wheezy_packer_vagrant_box_build.html http://d.zinrai.info/blog/html/2014/03/28/debian_wheezy_packer_vagrant_box_build.html <![CDATA[Packerを使ってVagrantのBOX作成]]> Packerを使ってVagrantのBOX作成

ではOpscodeが配布しているBOXを使用していたが、今回はPackerを使い自前のBOXを作成してみる。

$ uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.4 (wheezy)
Release:        7.4
Codename:       wheezy

Packer

インストール

$ wget https://dl.bintray.com/mitchellh/packer/0.5.2_linux_amd64.zip
$ mkdir -p $HOME/opt/local/bin
$ unzip 0.5.2_linux_amd64.zip -d 0.5.2_linux_amd64
$ cd 0.5.2_linux_amd64
$ mv `ls` $HOME/opt/local/bin
$ vi .bashrc
PATH=$HOME/opt/local/bin:$PATH
$ . .bashrc
$ packer -v
Packer v0.5.2

テンプレート作成

ryuzee / sandbox-devopsにPackerのテンプレートがあったのでForkしてCentOS 6.5のテンプレートを弄ってBOXを作成してみた。BOXの作り方は「Creating a Base Box」を参考にした。

$ git clone https://github.com/zinrai/sandbox-devops.git
$ cd sandbox-devops/packer-vagrantbox/CentOS-6.5-x86_64
$ git diff master packer_vagrantbox
$ diff --git a/packer-vagrantbox/CentOS-6.5-x86_64/Vagrantfile b/packer-vagrantbox/CentOS-6.5-x86_64/Vagrantfile
index f0c350c..d15ec59 100644
--- a/packer-vagrantbox/CentOS-6.5-x86_64/Vagrantfile
+++ b/packer-vagrantbox/CentOS-6.5-x86_64/Vagrantfile
@@ -1,3 +1,3 @@
 Vagrant.configure("2") do |config|
-    config.vm.base_mac = "{{ .BaseMacAddress }}"
+    #config.vm.base_mac = "{{ .BaseMacAddress }}"
 end

古い設定が残っていたのでコメントアウトした。

$ diff --git a/packer-vagrantbox/CentOS-6.5-x86_64/machine.json b/packer-vagrantbox/CentOS-6.5-x86_64/machine.json
index b9418c1..76d6013 100644
--- a/packer-vagrantbox/CentOS-6.5-x86_64/machine.json
+++ b/packer-vagrantbox/CentOS-6.5-x86_64/machine.json
@@ -2,7 +2,7 @@
   "builders":[{
     "type": "virtualbox-iso",
     "guest_os_type": "RedHat_64",
-    "iso_url": "http://mozilla.ftp.iij.ad.jp/pub/linux/centos/6/isos/x86_64/CentOS-6.5-x86_64-minimal.iso",
+    "iso_url": "http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.5/isos/x86_64/CentOS-6.5-x86_64-minimal.iso",
     "iso_checksum": "0d9dc37b5dd4befa1c440d2174e88a87",
     "iso_checksum_type": "md5",
     "ssh_username": "vagrant",

iso_urlに書かれていたURLにアクセスしてみるとForbiddenだったので、変更した。

$ diff --git a/packer-vagrantbox/CentOS-6.5-x86_64/virtualbox.sh b/packer-vagrantbox/CentOS-6.5-x86_64/virtualbox.sh
index 2b6cd8c..d4dc928 100644
--- a/packer-vagrantbox/CentOS-6.5-x86_64/virtualbox.sh
+++ b/packer-vagrantbox/CentOS-6.5-x86_64/virtualbox.sh
@@ -29,7 +29,3 @@ sudo sh /mnt/VBoxLinuxAdditions.run
 sudo umount /mnt
 #rm -rf /home/vagrant/VBoxGuestAdditions*.iso
 sudo /etc/rc.d/init.d/vboxadd setup
-
-sudo su -c "curl -L https://www.opscode.com/chef/install.sh | bash"
-which chef-solo
-sleep 5

Chef Soloインストールの部分は削除した。

BOX作成

$ packer validate machine.json
Template validated successfully.
$ packer build machine.json
$ ls
CentOS-6.5-x86_64-ja.box  Vagrantfile  ks.cfg  machine.json  packer_cache  virtualbox.sh
$ vagrant box add CentOS-6.5-x86_64-ja CentOS-6.5-x86_64-ja.box
$ vagrant box list
CentOS-6.5-x86_64-ja (virtualbox)
$ mkdir centos65
$ cd centos65
$ vagrant init CentOS-6.5-x86_64-ja
$ vagrant up
]]>
Fri, 28 Mar 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/03/25/debian_wheezy_vsftpd_serverspec.html http://d.zinrai.info/blog/html/2014/03/25/debian_wheezy_vsftpd_serverspec.html <![CDATA[serverspecを使ってみる]]> serverspecを使ってみる

で構築した環境をserverspecを使ってテストしてみる。

vsftpdのテスト項目

  • インストールされているか
  • 自動起動は設定されているか
  • 起動しているか
  • ポート21番でListenしているか
  • vsftpd.confファイルは存在するか
  • vsftpd.confファイルはChefに書いてあるpermissionになっているか(600)
  • vsftpd.confファイルはChefに書いてあるownerになっているか(root)
  • vsftpd.confファイルはChefに書いてあるgroupになっているか(root)
  • vsftpd.confにanon_root=/var/vsftpdは設定されているか
  • anon_rootで指定しているディレクトリは存在するか(/var/vsftpd)
  • anon_rootで指定しているディレクトリはChefに書いてあるpermissionになっているか(755)
  • anon_rootで指定しているディレクトリはChefに書いてあるownerになっているか(root)
  • anon_rootで指定しているディレクトリはChefに書いてあるgroupになっているか(root)

の13項目をテストする。

serverspec

$ uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.4 (wheezy)
Release:        7.4
Codename:       wheezy
$ vi Gemfile
source 'https://rubygems.org'

gem 'serverspec'
$ bundle install --path vendor/bundle
$ cat Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    serverspec (0.16.0)
      highline
      net-ssh
      rspec (~> 2.13)
      specinfra (>= 0.7.1)
$ bundle exec serverspec-init
$ vi spec/vsftpd/vsftpd_spec.rb
require 'spec_helper'

describe package('vsftpd') do
  it { should be_installed }
end

describe service('vsftpd') do
  it { should be_enabled }
  it { should be_running }
end

describe port(21) do
  it { should be_listening }
end

describe file('/etc/vsftpd/vsftpd.conf') do
  it { should be_file }
  it { should be_mode 600 }
  it { should be_owned_by 'root' }
  it { should be_grouped_into 'root' }
  its(:content) { should match /anon_root=\/var\/vsftpd/ }
end

describe file('/var/vsftpd') do
  it { should be_directory }
  it { should be_mode 755 }
  it { should be_owned_by 'root' }
  it { should be_grouped_into 'root' }
end
$ bundle exec rake spec
/home/hoge/.rbenv/versions/2.0.0-p353/bin/ruby -S rspec spec/vsftpd/vsftpd_spec.rb
.............

Finished in 1.17 seconds
13 examples, 0 failures

日本語で長々と書いていたものが、Resourceを指定してResourceが持っているマッチャーを使いshould be_hogehoge argと書けば表現できていい感じ。

]]>
Tue, 25 Mar 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/03/22/debian_wheezy_chef_solo_vsftpd_install.html http://d.zinrai.info/blog/html/2014/03/22/debian_wheezy_chef_solo_vsftpd_install.html <![CDATA[Chef Soloでvsftpdのインストールと設定]]> Chef Soloでvsftpdのインストールと設定
  • 某スイッチのアップグレードのためにFTPサーバを立てなければいけなくて、vsftpdでanonymous FTPのディレクトリを設定するのに手間取ったのでメモしておきたい。
  • 前回はTemplate Resourceを使わなかったので使ってみたい。

ということでChef Soloでvsftpdをインストール、Template Resource使った設定ファイルの設置まで行う。

前回と同じくVagrantを使う。作ったCookbookはGithubに置くようにした。

Vagrant

$ vagrant -v
Vagrant 1.4.3
$ vi Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.hostname = "vsftpd"
  config.vm.box = "opscode_centos-6.4"

  config.vm.network :public_network, :ip => "192.168.0.1", :netmask => "255.255.255.0", :bridge => "eth0"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
end

今回はforward portではなくbridgeするようにした。

$ vagrant up
$ vagrant ssh-config --host vsftpd >> ~/.ssh/config

vsftpd

$ cat /etc/centos-release
CentOS release 6.4 (Final)
$ man -k vsftpd
vsftpd               (8)  - Very Secure FTP Daemon
vsftpd.conf [vsftpd] (5)  - config file for vsftpd

$ man vsftpd.conf

anon_root
              This option represents a directory which vsftpd will try to change into after  an
              anonymous login. Failure is silently ignored.

              Default: (none)

anonymous FTPは有効になっているけれどディレクトリは設定されていないのでanon_rootを設定する。

$ vsftpd -v
vsftpd: version 2.2.2
$ cat /etc/vsftpd.conf.org
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
$ diff -u vsftpd.conf vsftpd.conf.org
--- vsftpd.conf 2014-03-22 09:37:23.935013981 +0000
+++ vsftpd.conf.org     2014-03-22 09:10:03.970016338 +0000
@@ -1,5 +1,4 @@
 anonymous_enable=YES
-anon_root=/var/vsftpd
 local_enable=YES
 write_enable=YES
 local_umask=022

Chef Solo

anon_rootの設定を追加してanonymous FTP用のディレクトリを作成すればいいということがわかったのでCookbookに落し込んでいく。

$ uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.4 (wheezy)
Release:        7.4
Codename:       wheezy
$ bundle exec knife solo prepare vsftpd
$ vi Berksfile

site :opscode

cookbook "yum", "3.0.6"
cookbook "vsftpd", path: "./site-cookbooks/vsftpd"
$ bundle exec knife cookbook create vsftpd -o ./site-cookbooks
$ bundle exec berks install --path ./cookbooks
$ vi site-cookbooks/vsftpd/recipes/default.rb
%w(vsftpd).each do |pkg|
  package pkg do
    action :install
  end
end

directory '/var/vsftpd' do
  owner 'root'
  group 'root'
  mode '0755'
  action :create
end

template "vsftpd.conf" do
  path "/etc/vsftpd/vsftpd.conf"
  source "vsftpd.conf.erb"
  owner "root"
  group "root"
  mode "600"
end

service "vsftpd" do
  action [:enable, :start]
end
$ vi site-cookbooks/vsftpd/templates/default/vsftpd.conf.erb
anonymous_enable=YES
anon_root=/var/vsftpd
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
$ vi nodes/vsftpd.json
{"run_list":[
    "recipe[vsftpd]"
  ]
}
$ bundle exec berks install --path ./cookbooks
$ bundle exec knife solo cook vsftpd nodes/vsftpd.json
$ ftp 192.168.0.1

などしてFTPサーバにアクセスできれば成功している。

]]>
Sat, 22 Mar 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/03/21/debian_wheezy_chef_solo_jenkins_install.html http://d.zinrai.info/blog/html/2014/03/21/debian_wheezy_chef_solo_jenkins_install.html <![CDATA[Chef SoloでJenkinsをインストール]]> Chef SoloでJenkinsをインストール

社内で詳しい人の助けを借りてChef SoloでJenkinsをインストールしてみた。

Vagrant

今回は「Debian wheezyでVagrantを使てみた」で追加したBOXを使う。

$ vi Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.hostname = "jenkins"
  config.vm.box = "opscode_centos-6.4"

  config.vm.network :private_network, ip: "192.168.11.11"
  config.vm.network :forwarded_port, guest: 8080, host: 8080

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end

  #config.omnibus.chef_version = "11.10.4"
end

vagrant-omnibusプラグイン使えば、Vagrantの管理下にある仮想マシンに指定したversionのChef Soloをインストールすることができるが、ここではvagrant-omnibusは使わず別の方法でChef Soloを仮想マシンにインストールする。

下記のコマンドを実行するとssh jenkinsでVagrant管理下のマシンに接続できるようになる設定を掃き出してくれるので.ssh/configにリダイレクトしておく。

$ vagrant ssh-config --host jenkins >> ~/.ssh/config

Chef Solo

Chef SoloはDebianで動かした。

$ uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.4 (wheezy)
Release:        7.4
Codename:       wheezy
% apt-get install libxml2-dev libxslt1-dev build-essential openssh-client rsync
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]

Gemfile

$ bundle install --path vendor/bundle
$ vi Gemfile
source 'https://rubygems.org'

gem 'berkshelf'
gem 'chef'
gem 'knife-solo'
gem 'rake'
berkshelf cookbooksの依存関係を管理してくれるツール
knife-solo ホストのrecipeをサーバへrsyncしChef Soloを実行。結果をホストに出力してくれるknifeプラグイン

Gemfile.lock

2014/03/20の時点でのGemfile.lockは以下のようになっている。

$ cat Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    activesupport (3.2.17)
      i18n (~> 0.6, >= 0.6.4)
      multi_json (~> 1.0)
    addressable (2.3.5)
    akami (1.2.1)
      gyoku (>= 0.4.0)
      nokogiri
    berkshelf (2.0.14)
      activesupport (~> 3.2.0)
      addressable (~> 2.3.4)
      buff-shell_out (~> 0.1)
      chozo (>= 0.6.1)
      faraday (~> 0.8.0)
      faraday (~> 0.8.5)
      hashie (>= 2.0.2)
      minitar (~> 0.5.4)
      rbzip2 (~> 0.2.0)
      retryable (~> 1.3.3)
      ridley (~> 1.5.0)
      solve (>= 0.5.0)
      thor (~> 0.18.0)
    buff-config (0.4.0)
      buff-extensions (~> 0.3)
      varia_model (~> 0.1)
    buff-extensions (0.5.0)
    buff-ignore (1.1.1)
    buff-ruby_engine (0.1.0)
    buff-shell_out (0.1.1)
      buff-ruby_engine (~> 0.1.0)
    builder (3.2.2)
    celluloid (0.14.1)
      timers (>= 1.0.0)
    celluloid-io (0.14.1)
      celluloid (>= 0.14.1)
      nio4r (>= 0.4.5)
    chef (11.10.4)
      chef-zero (~> 1.7, >= 1.7.2)
      diff-lcs (~> 1.2, >= 1.2.4)
      erubis (~> 2.7)
      highline (~> 1.6, >= 1.6.9)
      json (>= 1.4.4, <= 1.8.1)
      mime-types (~> 1.16)
      mixlib-authentication (~> 1.3)
      mixlib-cli (~> 1.4)
      mixlib-config (~> 2.0)
      mixlib-log (~> 1.3)
      mixlib-shellout (~> 1.3)
      net-ssh (~> 2.6)
      net-ssh-multi (~> 1.1)
      ohai (~> 6.0)
      pry (~> 0.9)
      puma (~> 1.6)
      rest-client (>= 1.0.4, < 1.7.0)
      yajl-ruby (~> 1.1)
    chef-zero (1.7.3)
      hashie (~> 2.0)
      json
      mixlib-log (~> 1.3)
      moneta (< 0.7.0)
      rack
    chozo (0.6.1)
      activesupport (>= 3.2.0)
      hashie (>= 2.0.2)
      multi_json (>= 1.3.0)
    coderay (1.1.0)
    diff-lcs (1.2.5)
    erubis (2.7.0)
    faraday (0.8.9)
      multipart-post (~> 1.2.0)
    ffi (1.9.3)
    gssapi (1.0.3)
      ffi (>= 1.0.1)
    gyoku (1.1.1)
      builder (>= 2.1.2)
    hashie (2.0.5)
    highline (1.6.21)
    hitimes (1.2.1)
    httpclient (2.3.4.1)
    httpi (0.9.7)
      rack
    i18n (0.6.9)
    ipaddress (0.8.0)
    json (1.8.1)
    knife-solo (0.4.1)
      chef (>= 10.12)
      erubis (~> 2.7.0)
      net-ssh (>= 2.2.2, < 3.0)
    little-plugger (1.1.3)
    logging (1.8.2)
      little-plugger (>= 1.1.3)
      multi_json (>= 1.8.4)
    method_source (0.8.2)
    mime-types (1.25.1)
    mini_portile (0.5.2)
    minitar (0.5.4)
    mixlib-authentication (1.3.0)
      mixlib-log
    mixlib-cli (1.4.0)
    mixlib-config (2.1.0)
    mixlib-log (1.6.0)
    mixlib-shellout (1.3.0)
    moneta (0.6.0)
    multi_json (1.9.2)
    multipart-post (1.2.0)
    net-http-persistent (2.9.4)
    net-ssh (2.8.0)
    net-ssh-gateway (1.2.0)
      net-ssh (>= 2.6.5)
    net-ssh-multi (1.2.0)
      net-ssh (>= 2.6.5)
      net-ssh-gateway (>= 1.2.0)
    nio4r (1.0.0)
    nokogiri (1.6.1)
      mini_portile (~> 0.5.0)
    nori (1.1.5)
    ohai (6.20.0)
      ipaddress
      mixlib-cli
      mixlib-config
      mixlib-log
      mixlib-shellout
      systemu (~> 2.5.2)
      yajl-ruby
    pry (0.9.12.6)
      coderay (~> 1.0)
      method_source (~> 0.8)
      slop (~> 3.4)
    puma (1.6.3)
      rack (~> 1.2)
    rack (1.5.2)
    rake (10.1.1)
    rbzip2 (0.2.0)
    rest-client (1.6.7)
      mime-types (>= 1.16)
    retryable (1.3.5)
    ridley (1.5.3)
      addressable
      buff-config (~> 0.2)
      buff-extensions (~> 0.3)
      buff-ignore (~> 1.1)
      buff-shell_out (~> 0.1)
      celluloid (~> 0.14.0)
      celluloid-io (~> 0.14.0)
      erubis
      faraday (>= 0.8.4)
      hashie (>= 2.0.2)
      json (>= 1.7.7)
      mixlib-authentication (>= 1.3.0)
      net-http-persistent (>= 2.8)
      net-ssh
      nio4r (>= 0.5.0)
      retryable
      solve (>= 0.4.4)
      varia_model (~> 0.1)
      winrm (~> 1.1.0)
    rubyntlm (0.1.1)
    savon (0.9.5)
      akami (~> 1.0)
      builder (>= 2.1.2)
      gyoku (>= 0.4.0)
      httpi (~> 0.9)
      nokogiri (>= 1.4.0)
      nori (~> 1.0)
      wasabi (~> 1.0)
    slop (3.5.0)
    solve (0.8.2)
    systemu (2.5.2)
    thor (0.18.1)
    timers (2.0.0)
      hitimes
    uuidtools (2.1.4)
    varia_model (0.3.2)
      buff-extensions (~> 0.2)
      hashie (>= 2.0.2)
    wasabi (1.0.0)
      nokogiri (>= 1.4.0)
    winrm (1.1.3)
      gssapi (~> 1.0.0)
      httpclient (~> 2.2, >= 2.2.0.2)
      logging (~> 1.6, >= 1.6.1)
      nokogiri (~> 1.5)
      rubyntlm (~> 0.1.1)
      savon (= 0.9.5)
      uuidtools (~> 2.1.2)
    yajl-ruby (1.2.0)

PLATFORMS
  ruby

DEPENDENCIES
  berkshelf
  chef
  knife-solo
  rake

cookbookの作成にはいっていくが、その前にサーバにChef Soloをインストールしておく。vagrant-omnibusではVagrantの管理下にあるマシンにしかChef Soloをインストールできないが、knife solo prepareを使えば指定したサーバにChef Soloをインストールすることができる。

$ bundle exec knife solo prepare jenkins

ディレクトリの構成は

cookbooks サードパーティのcookbooksを格納
site-cookbooks 自分で作成したcookbooksを格納

と使い分けるのがモダンなやり方のようだ。

$ vi Berksfile

site :opscode

cookbook "yum", "3.0.6"
cookbook "jenkins", path: "./site-cookbooks/jenkins"

Berksfileとsite-cookbooksは必ず一致させておく。

$ bundle exec knife cookbook create jenkins -o ./site-cookbooks/
$ bundle exec berks install --path ./cookbooks

berkshelfでcookbookを管理している場合は、site-cookbooks以下に変更を加えたら必ずberks installを実行する。

  • Node: Chefで管理するサーバ/マシン
  • Cookbook: Node対して行うオペレーションをまとめた単位
    • Recipe: Nodeに対して行うオペレーション
    • Attribute: cookbook内にあるパラメータ
    • Resource: オペレーションを抽象化したAPI

今回だと、RecipeにはJenkinsのrpmパッケージを取得してインストールして起動するまでをResourceを使って書き、Attributeには取得先のURLとパッケージバーションをパラメータとして設定して、これらがCookbookになっているという感じである。attributeにパラメータを設定して、recipeにオペレーションを書いて、nodes/jenkins.jsonに適用したいrecipeを書いて、Chef Soloを実行するまでが一連の流れになる。

$ vi site-cookbooks/jenkins/attributes/default.rb
default['jenkins']['rpm'] = "jenkins-1.555-1.1.noarch.rpm"
default['jenkins']['rpm_url'] = "http://pkg.jenkins-ci.org/redhat/#{node['jenkins']['rpm']}"
$ vi sites-cookbooks/jenkins/recipe/default.rb
%w(java-1.7.0-openjdk).each do |pkg|
  package pkg do
    action :install
  end
end

remote_file "/tmp/" + node["jenkins"]["rpm"] do
  source node["jenkins"]["rpm_url"]
  owner "root"
  group "root"
  mode "0755"
end

package "jenkins" do
  action :install
  source "/tmp/" + node["jenkins"]["rpm"]
end

service "jenkins" do
  action [:enable, :start]
end
$ vi nodes/jenkins.json
{"run_list":[
    "recipe[jenkins]"
  ]
}
$ bundle exec berks install --path ./cookbooks
$ bundle exec knife solo cook jenkins nodes/jenkins.json

最後のコマンドはjenkinsというサーバに対してnodes/jenkins.jsonに書かれた情報をもとにrecipeを適用するという意味である。

]]>
Fri, 21 Mar 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/03/20/debian_wheezy_virtualbox_vagrant.html http://d.zinrai.info/blog/html/2014/03/20/debian_wheezy_virtualbox_vagrant.html <![CDATA[Debian wheezyでVagrantを使てみた]]> Debian wheezyでVagrantを使てみた

巷で人気のVagrantで

  • BOXの追加
  • 仮想マシンの起動
  • プラグインのインストール
  • インストールしたプラグインの使用

までやってみた。

$ uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.4 (wheezy)
Release:        7.4
Codename:       wheezy

Virtualbox

インストール

$ wget http://download.virtualbox.org/virtualbox/4.3.8/virtualbox-4.3_4.3.8-92456~Debian~wheezy_amd64.deb
% dpkg -i virtualbox*.deb

Vagrant

インストール

$ wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.5.1_x86_64.deb
% dpkg -i vagrant*.deb

BOXの追加

今回はopscodeが公開しているBOXを使う。

$ wget http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.4_chef-provisionerless.box

$ vagrant box add opscode_centos-6.4 opscode_centos-6.4_chef-provisionerless.box
$ vagrant box list
opscode_centos-6.4 (virtualbox)

仮想マシンの起動

$ vi Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.hostname = "test"
  config.vm.box = "opscode_centos-6.4"

  config.vm.network :private_network, ip: "192.168.11.11"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
end
$ vagrant up

sahara

Vagrantで管理されている仮想マシンのある時点の状態を保存しておきロールバックしたりすることができるプラグイン

$ vagrant plugin install sahara
$ vagrant plugin list
sahara (0.0.16)

インストールするとVagrantにサブコマンドsandboxが追加される。

$ vagrant sandbox -h
Usage: vagrant plugin <command> [<args>]

Available subcommands:
     commit
     off
     on
     rollback
     status
commit 保存されて状態以降の変更を保存する。
off sandboxをoffにする。保存されちている状態以降の変更は保存される。
on onにした時点の仮想マシンの状態が保存される。
rollback 最後に保存した時点までロールバックする。
status sandbox状態かの確認
$ vagrant status
Current machine states:

default                   running (virtualbox)

$ vagrant sandbox status
[default] Sandbox mode is off

$ vagrant sandbox commit
$ vagrant sandbox off
$ vagrant sandbox on
$ vagrant sandbox rollback

sandboxをonにしてVagrantで管理している仮想マシンにアクセスして変更を加えたあとrollbackすると仮想マシンがon時の状態に戻る。

]]>
Thu, 20 Mar 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/02/26/debian_wheezy_schroot_aufs.html http://d.zinrai.info/blog/html/2014/02/26/debian_wheezy_schroot_aufs.html <![CDATA[schrootでaufsを使う]]> schrootでaufsを使う

schroot(1)でaufsを使いたいなと思いschroot.conf(5)を眺めてみたところunion-type,union-mount-optionsというオプションを見付けた。union-typeにaufsを指定し、union-mount-optionsにunion mountするときのオプションを書けばオプションをパースしてくれる。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.4 (wheezy)
Release:        7.4
Codename:       wheezy
% vi /etc/schroot/chroot.d/fuga.conf

[fuga]
type=directory
directory=/var/chroot/fuga
union-type=aufs
union-mount-options=br:/var/chroot/fuga:/var/chroot/wheezy=ro none /var/chroot/fuga
profile=fuga
users=hoge
root-groups=root
]]>
Wed, 26 Feb 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/02/25/debian_wheezy_synergy.html http://d.zinrai.info/blog/html/2014/02/25/debian_wheezy_synergy.html <![CDATA[Synergyでマウスとキーボードを共有]]> Synergyでマウスとキーボードを共有

最近、デスクトップPCの横にノートPCを置いて作業をるすことが多くなったのでsynergyを入れてみた。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.4 (wheezy)
Release:        7.4
Codename:       wheezy

$ apt-cache show synergy
Package: synergy
Version: 1.3.8-2

% apt-get install synergy

Server

$ vi $HOME/.synergy.conf

section: screens
  hoge:
  fuga:
end

section: links
  hoge:
    right = fuga
  fuga:
    left = hoge
end

section: aliases
  hoge:
    192.168.0.1
  fuga:
    192.168.0.2
end

section: options
  keystroke(alt+control+j) = switchToScreen(hoge)
  keystroke(alt+control+k) = switchToScreen(fuga)
end
$ synergys

Client

$ synergyc 192.168.0.1

synergys(1),synergyc(1)をforegroundで起動したいときは、どちらも「-f」オプションを付ける。

]]>
Tue, 25 Feb 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/02/07/debian_wheezy_openvpn.html http://d.zinrai.info/blog/html/2014/02/07/debian_wheezy_openvpn.html <![CDATA[OpenVPN サーバ構築]]> OpenVPN サーバ構築
$ uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.3 (wheezy)
Release:        7.3
Codename:       wheezy
% sysctl -p
net.ipv4.ip_forward = 1

サーバ

ルーティングモードとブリッジモードがあり、今回はブリッジモードで動かす。

% apt-get install openvpn openssl bridge-utils

% openvpn --version
OpenVPN 2.2.1 x86_64-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Jun 18 2013
Originally developed by James Yonan
Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
% cp -r /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn
% cd /etc/openvpn/easy-rsa/2.0
% . ./vars
% ./build-ca
% ./build-key-server server <- サーバ用の証明書
% ./build-dh

% ./build-key client01 <- クライアント用の証明書

% cd keys
% cp ca.crt server.crt server.key dh1024.pem /etc/openvpn
% vi /etc/openvpn/openvpn.conf
port 1194
proto tcp
dev tap0
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server-bridge 192.168.2.1 255.255.255.0 192.168.2.250 192.168.2.253
push "route 192.168.2.0 255.255.255.0"
duplicate-cn
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 4
% vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto br0
iface br0 inet static
address 192.168.2.1
netmask 255.255.255.0
gateway 192.168.2.254
bridge_ports eth0
up openvpn --mktun --dev tap0
up ifconfig tap0 up
up brctl addif br0 tap0
down brctl delif br0 tap0
down ifconfig tap0 down
down openvpn --rmtun --dev tap0
% update-rc.d openvpn defaults

クライアント

サーバ側で生成したクライアント用の証明書をクライアントPCにもってくる。

% apt-get install openvpn openssl

% vi /etc/openvpn/client.conf
client
dev tap
proto tcp
remote 10.0.0.1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client01.crt
key client01.key
ns-cert-type server
comp-lzo
verb 3
]]>
Fri, 07 Feb 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/02/06/debian_wheezy_kvm_zfs.html http://d.zinrai.info/blog/html/2014/02/06/debian_wheezy_kvm_zfs.html <![CDATA[KVMのGuestOSにZVOLを使う]]> KVMのGuestOSにZVOLを使う

ZFS on Linux (Debian wheezy)」で最後に書いたブロックデバイスとして見えないかを調べてみた。

ZVOL

ZFSの領域をブロックデバイスとして切り出すことができる機能

% zfs create -V 20G zfspool/disk2
% zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
zfspool        22.2G  1.76T   144K  /zfspool
zfspool/disk1   136K  1.76T   136K  /zfspool/disk1
zfspool/disk2  20.6G  1.78T    72K  -

% ls -l /dev/zvol/zfspool/
total 0
lrwxrwxrwx 1 root root 10 Feb  6 12:37 disk2 -> ../../zd16

sparse volume

上記だと20GBの領域がまるまる割り当てられてしまうので、thin provisioning的な機能はないかzfs(8)を眺めてみた。

man zfsして「thin provisioning」で検索して「 “sparse volume” (also known as “thin provisioning”)」の文の見付けて「sparse volume」で検索したらオプションを探し当てることができた。

Though not recommended, a "sparse volume" (also known as "thin provisioning") can be created by specifying the -s option to the  zfs  create  -V command,  or by changing the reservation after the volume has been created. A "sparse volume" is a volume where the reservation is less then the volume size. Consequently, writes to a sparse volume can fail with ENOSPC when the pool is low on space. For a sparse volume, changes to volsize are not reflected in the reservation.
-s

Creates a sparse volume with no reservation. See volsize in the Native Properties section for more information about sparse volumes.
% zfs create -s -V 50G zfspool/kvm1
% zfs get all zfspool/kvm1
NAME          PROPERTY              VALUE                  SOURCE
zfspool/kvm1  type                  volume                 -
zfspool/kvm1  creation              Thu Feb  6  1:13 2014  -
zfspool/kvm1  used                  1.57G                  -
zfspool/kvm1  available             1.76T                  -
zfspool/kvm1  referenced            1.57G                  -
zfspool/kvm1  compressratio         1.00x                  -
zfspool/kvm1  reservation           none                   default
zfspool/kvm1  volsize               50G                    local
zfspool/kvm1  volblocksize          8K                     -
zfspool/kvm1  checksum              on                     default
zfspool/kvm1  compression           off                    default
zfspool/kvm1  readonly              off                    default
zfspool/kvm1  copies                1                      default
zfspool/kvm1  refreservation        none                   default
zfspool/kvm1  primarycache          all                    default
zfspool/kvm1  secondarycache        all                    default
zfspool/kvm1  usedbysnapshots       8K                     -
zfspool/kvm1  usedbydataset         1.57G                  -
zfspool/kvm1  usedbychildren        0                      -
zfspool/kvm1  usedbyrefreservation  0                      -
zfspool/kvm1  logbias               latency                default
zfspool/kvm1  dedup                 off                    default
zfspool/kvm1  mlslabel              none                   default
zfspool/kvm1  sync                  standard               default
zfspool/kvm1  refcompressratio      1.00x                  -
zfspool/kvm1  written               8K                     -
zfspool/kvm1  snapdev               hidden                 default

KVM

ZVOLをKVMのGuestOSに使ってみる。

% apt-get install kvm virtinst virt-manager
% brctl addbr br1
% brctl addif br1 eth1
% ifconfig eth1 up
% ifconfig br1 up
#!/bin/bash

VM_NAME=$1
MEM=$2
IFACE=$3
OS=$4

DISKIMAGE="/dev/zvol/zfspool/$VM_NAME"

if [ "$OS" = "centos" ]; then
  # CentOS 6.4 amd64
  DIST='http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.4/os/x86_64/'
elif [ "$OS" = "precise" ]; then
  # Ubuntu 12.04 amd64
  DIST='http://ftp.riken.jp/Linux/ubuntu/dists/precise/main/installer-amd64/'
elif [ "$OS" = "squeeze" ]; then
  # Debian Squeeze amd64
  DIST='http://ftp.jp.debian.org/debian/dists/squeeze/main/installer-amd64/'
elif [ "$OS" = "wheezy" ]; then
  # Debian Wheezy amd64
  DIST='http://ftp.jp.debian.org/debian/dists/wheezy/main/installer-amd64/'
fi

virt-install --hvm --accelerate --nographics \
  --name $VM_NAME \
  --network bridge=$IFACE,model=virtio \
  --ram $MEM \
  --vcpus 1 \
  --cpu core2duo \
  --os-type linux \
  --location $DIST \
  --disk path=$DISKIMAGE,bus=virtio \
  --extra-args='console=tty0 console=ttyS0,115200n8'
% vm-install.sh kvm1 1024 br1 wheezy

% ls -l /dev/zvol/zfspool/
total 0
lrwxrwxrwx 1 root root 10 Feb  6 12:37 disk2 -> ../../zd16
lrwxrwxrwx 1 root root  9 Feb  6 12:12 kvm1 -> ../../zd0
lrwxrwxrwx 1 root root 11 Feb  6 12:12 kvm1-part1 -> ../../zd0p1
lrwxrwxrwx 1 root root 11 Feb  6 12:12 kvm1-part2 -> ../../zd0p2
lrwxrwxrwx 1 root root 11 Feb  6 12:12 kvm1-part5 -> ../../zd0p5

ZFSでスナップショットをとったりロールバックできる環境が出来上がった。LVM2やqemu-img(1)とおさらばヒャッハー。GuestOSを停止しないでロールバックしようとすると「devide busy」と怒られる。

% zfs snapshot zfspool/kvm1@snap1
% zfs list -t snapshot
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zfspool/kvm1@snap1   600K      -  1.57G  -

% zfs rollback zfspool/kvm1@snap1
]]>
Thu, 06 Feb 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2014/02/05/debian_wheezy_zfs.html http://d.zinrai.info/blog/html/2014/02/05/debian_wheezy_zfs.html <![CDATA[ZFS on Linux (Debian wheezy)]]> ZFS on Linux (Debian wheezy)

LinuxでもZFSがいい感じで動くという話を聞いたので使ってみた。

% uname -a
Linux hoge 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
% lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.3 (wheezy)
Release:        7.3
Codename:       wheezy
% wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_2%7Ewheezy_all.deb
% dpkg -i zfsonlinux_2~wheezy_all.deb
% apt-get update
% apt-get install debian-zfs

2TBのHDDをRAID1してみる。

% parted /dev/sda -s "mklabel gpt"
% parted /dev/sdc -s "mklabel gpt"

% zpool create zfspool mirror sda sdc
% zpool list -v
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zfspool  1.81T   556K  1.81T     0%  1.00x  ONLINE  -
  mirror  1.81T   556K  1.81T         -
    sda      -      -      -         -
    sdc      -      -      -         -
% zfs create zfspool/disk1
% zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
zfspool         692K  1.78T   136K  /zfspool
zfspool/disk1   136K  1.78T   136K  /zfspool/disk1

ブロックデバイスとして見えたらKVMのGuestOS用のディスクとして使えると思うので、その辺を調べてみる。

]]>
Wed, 05 Feb 2014 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/12/03/ubuntu_docker_ansible.html http://d.zinrai.info/blog/html/2013/12/03/ubuntu_docker_ansible.html <![CDATA[Ansibleを使ってみる]]> Ansibleを使ってみる

前回はDockerの使い方を調べたので、今回はDocker上のコンテナで巷で噂のAnsibleを動かしてみる。

コンテナ起動

% docker run -i -t -id --name test01 ubuntu:latest /bin/bash
% docker attach test01

コンテナイメージ作成

% lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04 LTS
Release:        12.04
Codename:       precise
  • Python,SSHインストール
  • SSH公開鍵 設定
  • sudo設定

起動したコンテナで上記の作業してコンテナイメージを作成する。

% apt-get install python2.7 python2.7-dev openssh-server vim sudo wget ca-certificates

% mkdir /var/run/sshd
% cd /etc/ssh
% cp sshd_config sshd_config.org
% diff -u sshd_config.org sshd_config
--- sshd_config.org     2013-12-05 05:51:00.924484160 +0000
+++ sshd_config 2013-12-05 05:51:37.676483746 +0000
@@ -29,7 +29,7 @@

 RSAAuthentication yes
 PubkeyAuthentication yes
-#AuthorizedKeysFile    %h/.ssh/authorized_keys
+AuthorizedKeysFile     %h/.ssh/authorized_keys

 # Don't read the user's ~/.rhosts and ~/.shosts files
 IgnoreRhosts yes
@@ -84,4 +84,4 @@
 # If you just want the PAM account and session checks to run without
 # PAM authentication, then enable this but set PasswordAuthentication
 # and ChallengeResponseAuthentication to 'no'.
-UsePAM yes
+UsePAM no

% /usr/sbin/sshd

% useradd -m -s /bin/bash zinrai
% usermod -a -G sudo zinrai
% passwd zinrai

% su - zinrai
$ ssh-keygen
$ cd .ssh
$ cp id_rsa.pub authorized_keys
% docker commit test01 ansible/test01
% docker run -i -t -d --name ansible01 ansible/test01 /bin/bash
% docker run -i -t -d --name ansible02 ansible/test01 /bin/bash

Ansible

  • Ansibleはvirtualenv上で動かす。
  • –ask-sudo-passオプションが使えるようにsshpassをインストール
$ wget https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.10.1.tar.gz
$ tar zvxf virtualenv-1.10.1.tar.gz
$ python virtualenv-1.10.1/virtualenv.py ansible
$ source ansible/bin/activate
$ pip install ansible
$ pip freeze
pip freeze
Jinja2==2.7.1
MarkupSafe==0.18
PyYAML==3.10
ansible==1.4.1
argparse==1.2.1
ecdsa==0.10
paramiko==1.12.0
pycrypto==2.6.1
wsgiref==0.1.2
% vi /etc/apt/source.list
deb http://archive.ubuntu.com/ubuntu precise main universe
deb-src http://archive.ubuntu.com/ubuntu/ precise main universe
deb http://archive.ubuntu.com/ubuntu/ precise-updates main universe
deb-src http://archive.ubuntu.com/ubuntu/ precise-updates main universe

% apt-get update
% apt-get install sshpass
$ mkdir playbook
$ cd playbook
$ vi hosts
[test]
172.17.0.10
172.17.0.11
$ vi setup.yml
---
- hosts: test
  remote_user: zinrai
  sudo: yes

  tasks:
  - name: Package Installed
    apt: pkg={{ item }} state=latest
    with_items:
    - less
    - perl-modules
$ ansible-playbook -i hosts setup.yml --ask-sudo-pass
sudo password:

PLAY [test] *******************************************************************

GATHERING FACTS ***************************************************************
ok: [172.17.0.10]
ok: [172.17.0.11]

TASK: [Package Installed] *****************************************************
changed: [172.17.0.10] => (item=less,perl-modules)
changed: [172.17.0.11] => (item=less,perl-modules)

PLAY RECAP ********************************************************************
172.17.0.10                : ok=2    changed=1    unreachable=0    failed=0
172.17.0.11                : ok=2    changed=1    unreachable=0    failed=0
]]>
Tue, 03 Dec 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/11/28/ubuntu_docker.html http://d.zinrai.info/blog/html/2013/11/28/ubuntu_docker.html <![CDATA[Dockerを使ってみる]]> Dockerを使ってみる

dotcloudがオープンソースで公開しているDockerというソフトウェアを知った。Linuxコンテナの実装の一つであるLXCを使いOSレベルの仮想化を行い、Aufsで「aufsを使ったchroot環境」のようにベースファイルを書き換えずに、更新が発生した部分は別ディレクトリに書き込み、この差分をGitっぽく管理できるフロントエンドなのかなというのが触ってみた印象だった。

$ uname -a
Linux asuna 3.8.0-33-generic #48~precise1-Ubuntu SMP Thu Oct 24 16:28:06 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.3 LTS
Release:        12.04
Codename:       precise

Docker インストール

$ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot

$ sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
$ sudo sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker
$ apt-cache search lxc-docker
lxc-docker - Linux container runtime
lxc-docker-0.5.3 - lxc-docker is a Linux container runtime
lxc-docker-0.6.0 - lxc-docker is a Linux container runtime
lxc-docker-0.6.1 - lxc-docker is a Linux container runtime
lxc-docker-0.6.2 - lxc-docker is a Linux container runtime
lxc-docker-0.6.3 - lxc-docker is a Linux container runtime
lxc-docker-0.6.4 - lxc-docker is a Linux container runtime
lxc-docker-0.6.5 - lxc-docker is a Linux container runtime
lxc-docker-0.6.6 - lxc-docker is a Linux container runtime
lxc-docker-0.6.7 - Linux container runtime
lxc-docker-0.7.0 - Linux container runtime
$ apt-cache show lxc-docker
Package: lxc-docker
Version: 0.7.0
License: unknown
Vendor:
Architecture: amd64
Maintainer: docker@dotcloud.com
Installed-Size: 0
Depends: lxc-docker-0.7.0
Homepage: http://www.docker.io/
Priority: extra
Section: default
Filename: pool/main/l/lxc-docker/lxc-docker_0.7.0_amd64.deb
Size: 1914
SHA256: c344f7f4a583b6bda2dcb1adab10b92580c260ed058b762c083230f7868c9ead
SHA1: 157a3335594693062b85887f0a0b34e8afe79f69
MD5sum: 96821dcce0250cc522dbee2e36263bc5
Description: Linux container runtime
 Docker complements LXC with a high-level API which operates at the process
 level. It runs unix processes with strong guarantees of isolation and
 repeatability across servers.
 Docker is a great building block for automating distributed systems:
 large-scale web deployments, database clusters, continuous deployment systems,
 private PaaS, service-oriented architectures, etc.

Docker 使い方

% docker -v
Docker version 0.7.0, build 0d078b6

pull

% docker pull ubuntu
Pulling repository ubuntu
8dbd9e392a96: Download complete
b750fe79269d: Download complete
27cf78414709: Download complete

https://index.docker.io/で公開されているコンテナイメージを取得しローカルに展開

images

% docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              12.04               8dbd9e392a96        7 months ago        128 MB (virtual 128 MB)
ubuntu              latest              8dbd9e392a96        7 months ago        128 MB (virtual 128 MB)
ubuntu              precise             8dbd9e392a96        7 months ago        128 MB (virtual 128 MB)
ubuntu              12.10               b750fe79269d        8 months ago        175.3 MB (virtual 350.6 MB)
ubuntu              quantal             b750fe79269d        8 months ago        175.3 MB (virtual 350.6 MB)

コンテナイメージを一覧する。コンテナを作成する際に使用するベースイメージ(Aufsで重ね、書き変わらない部分)。

run

% docker run -i -t -d --name ubuntu01 ubuntu:12.04 /bin/bash
% docker run -i -t -d --name ubuntu02 ubuntu:12.04 /bin/bash
% docker run -i -t -d --name ubuntu03 ubuntu:12.04 /bin/bash
% docker run -i -t -d -p 80 --name ubuntu04 ubuntu:12.04 /bin/bash
% docker run -i -t -d -p 80 -p 22 --name ubuntu05 ubuntu:12.04 /bin/bash

新規にコンテナを作成し起動する。start,stopというコマンドもあるが、これは作成したコンテナを起動・停止するために使用する。

ps

% docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES
1734fac49073        ubuntu:12.04        /bin/bash           51 seconds ago      Up 51 seconds       0.0.0.0:49159->22/tcp, 0.0.0.0:49160->80/tcp   ubuntu05
e54ec245fe2a        ubuntu:12.04        /bin/bash           2 minutes ago       Up 2 minutes        0.0.0.0:49158->80/tcp                          ubuntu04
fe54b9318dba        ubuntu:12.04        /bin/bash           8 hours ago         Up 8 hours                                                         ubuntu03
46d0ef544132        ubuntu:12.04        /bin/bash           8 hours ago         Up 8 hours                                                         ubuntu02
8fcfa5265233        ubuntu:12.04        /bin/bash           8 hours ago         Up 8 hours                                                         ubuntu01
  • 「-a」オプションで停止中のコンテナの情報を表示できる。
  • 「-q」オプションでコンテナIDのみを表示できる。

attach

% docker attach ubuntu01

起動しているコンテナにアッタッチする。「Ctrl-p Ctrl-q」でデタッチ

start

% docker start ubuntu05

停止しているコンテナを起動する。

stop

% docker stop ubuntu05

起動しているコンテナを停止する。

commit

% docker commit ubuntu02 python/ubuntu02
% docker run -i -t -d --name ubuntu06 python/ubuntu02 /bin/bash

変更を加えたコンテナからコンテナイメージを作成したい場合に使用する。例えば、コンテナにpythonをインストールし、commitすると、python入りのコンテナイメージが作られる。作ったコンテナイメージでrunすればpython入りコンテナが新たに起動する。

rm

% docker rm ubuntu05

コンテナを削除する。

rmi

% docker rmi python/ubuntu02

コンテナイメージを削除する。

export

% docker export ubuntu02 > ubuntu02.tar

コンテナはtarでアーカイブすることができる。

import

% docker import http://exsample.com/ubuntu02.tar ubuntu02
% cat ubuntu02.tar | docker import - ubuntu02:new

アーカイブは他のDockerにimportすることができる。「シェルスクリプトでDebian wheezyのインストール自動化」を使って実機やKVMなどの仮想マシンにも展開できそう。

環境を手軽に作れて差分で新たな環境を作ったりできてすごく便利。次は作成したコンテナでなにか動かしてみたいと思う。

]]>
Thu, 28 Nov 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/11/25/fabric_template_upload.html http://d.zinrai.info/blog/html/2013/11/25/fabric_template_upload.html <![CDATA[Fabric テンプレート アップロード]]> Fabric テンプレート アップロード

Fabric decorators task」でディストリビューションやOSごとにファイルを分割してタスクを書けるようにした。今回はインストールスルクリプトをテンプレート化してアップロードするタスクを書いてみる。

$ vi __init__.py
from fabric.api import env
from fabric.decorators import task

from . import debian
from . import centos
from . import gentoo
from . import freebsd

@task
def server():
  env.hosts = ['192.168.0.1']
  env.port = 22
  env.user = 'root'
$ vi debian.py
from fabric.decorators import task
from fabric.contrib.files import upload_template

@task
def upload(macaddress, disk, hostname, ipaddress, netmask, gateway,
    source_template, dest_template):

    upload_template(
      source_template,
      dest_template,
      context={
        'macaddress': macaddress,
        'disk': disk,
        'hostname': hostname,
        'ipaddress': ipaddress,
        'netmask': netmask,
        'gateway': gateway,
      },
      use_jinja=True,
    )
$ mkdir templates
$ vi templates/debian_template.conf
#!/bin/bash -x

# {{ macaddress }}

DISK=/dev/{{ disk }}
IFACE=$1
CWD=$2
CHROOT_DEBIAN="/mnt/$3"

dd if=/dev/zero of=$DISK bs=1024 count=1

parted $DISK -s 'mklabel msdos'
parted $DISK -s 'mkpart primary 1 500'
parted $DISK -s 'mkpart primary 501 35000'
parted $DISK -s 'mkpart extended 35001 -0'
parted $DISK -s 'mkpart logical 35001 38000'
parted $DISK -s 'mkpart logical 38001 -0'
parted $DISK -s 'set 1 boot on'

mkswap ${DISK}5
swapon ${DISK}5
mkfs.ext2 ${DISK}1
mkfs.ext4 ${DISK}2
mkfs.ext4 ${DISK}6

mkdir $CHROOT_DEBIAN

mount ${DISK}2 ${CHROOT_DEBIAN}

cp -Rp ${CWD}/wheezy/* $CHROOT_DEBIAN

mount ${DISK}1 ${CHROOT_DEBIAN}/boot
mount ${DISK}6 ${CHROOT_DEBIAN}/home

mount --rbind /dev ${CHROOT_DEBIAN}/dev
mount -t proc none ${CHROOT_DEBIAN}/proc
mount --rbind /sys ${CHROOT_DEBIAN}/sys

cat << EOF > ${CHROOT_DEBIAN}/etc/hostname
{{ hostname }}
EOF


cat << EOF > ${CHROOT_DEBIAN}/etc/resolv.conf
nameserver 8.8.8.8
EOF

cat << EOF > ${CHROOT_DEBIAN}/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address {{ ipaddress }}
netmask {{ netmask }}
gateway {{ gateway }}
EOF

cat << EOF > ${CHROOT_DEBIAN}/etc/fstab
${DISK}1               /boot           ext2            defaults        0 2
${DISK}2               /               ext4            defaults        0 1
${DISK}6               /home           ext4            defaults        0 2
${DISK}5               none            swap            sw              0 0
EOF

cat << EOF > ${CHROOT_DEBIAN}/tmp/debian_setup.sh
export DEBIAN_FRONTEND=noninteractive
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
grep -v rootfs /proc/mounts > /etc/mtab

apt-get install -y linux-image-`uname -r` grub2 openssh-server

grub-mkconfig -o /boot/grub/grub.cfg
grub-install --no-floppy --root-directory=/ $DISK
EOF

cat << 'EOF' > ${CHROOT_DEBIAN}/tmp/user_acount.sh
useradd -m -G sudo nanashi
printf 'nanashi:$6$oHUVG9WPkdiCoxCP$XsnO5TmowzdGWNkZHv9pPUmFqgsEojkfzUa1OQj2zUOWAChL5cdGkm.dhseF0z5Tz30IEDrxNzOcsflPUgHDs.' | chpasswd -e
printf 'root:$6$wAeDl/exZFEDC0Sl$UdvTamL.94EcWFcGIAYJSgsvzaFxSd.ZLRMkD.KI27L6jxUGsWqOdEJs6if0rTG/XuEfQ9TNzHbjI99YfxPLD1' | chpasswd -e
EOF

chroot ${CHROOT_DEBIAN} /bin/bash /tmp/debian_setup.sh
chroot ${CHROOT_DEBIAN} /bin/bash /tmp/user_acount.sh

rm ${CHROOT_DEBIAN}/tmp/debian_setup.sh
rm ${CHROOT_DEBIAN}/tmp/user_acount.sh

cd /
umount -l ${CHROOT_DEBIAN}/{boot,home,proc,dev,sys}
umount -l $CHROOT_DEBIAN
sleep 2
rmdir $CHROOT_DEBIAN
reboot

Pythonのweb frameworkのひとつFlaskに使用されているテンプレートエンジンJinjaが、Fabricでも使えるようなのでuse_jinja=Trueして使うことにする。{{ hoge }}で囲まれた部分が変数展開される。

$ fab -l
Available commands:

    server
    centos.cmd
    debian.upload
    freebsd.cmd
    gentoo.cmd
$ fab server debian.upload:macaddress="01:23:45:67:89:ab",disk="vda",hostname="hoge.localnet",ipaddress="192.168.0.50",netmask="255.255.255.0",gateway="192.168.0.254",source_template="templates/debian_template.conf",dest_template="/var/diskless/scripts/debian_template.conf"
]]>
Mon, 25 Nov 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/11/22/fabric_decorators_task.html http://d.zinrai.info/blog/html/2013/11/22/fabric_decorators_task.html <![CDATA[Fabric decorators task]]> Fabric decorators task

シェルスクリプトでLinuxをインストールする環境はできたが、サーバに接続してシェルスクリプトをコピー・編集するという状態である。Fabricを使いこの作業をホストから行えるようにしてみる。fabfile.pyひとつにタスクを書いていくのではなくディストリビューションやOSごとにファイルを分割してタスクを書いていく。

$ python -V
Python 2.7.3

$ fab --version
Fabric 1.8.0
Paramiko 1.12.0
$ mkdir fabfile
$ cd fabfile
$ touch __init__.py centos.py debian.py freebsd.py gentoo.py
$ vi __init__.py

from . import debian
from . import centos
from . import gentoo
from . import freebsd
$ vi centos.py

from fabric.decorators import task

@task
def cmd():
    pass
$ vi debian.py

from fabric.decorators import task

@task
def cmd():
    pass
$ vi gentoo.py

from fabric.decorators import task

@task
def cmd():
    pass
$ vi freebsd.py

from fabric.decorators import task

@task
def cmd():
    pass
$ fab -l
Available commands:

    centos.cmd
    debian.cmd
    freebsd.cmd
    gentoo.cmd
]]>
Fri, 22 Nov 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/11/01/freebsd_mfsbsd.html http://d.zinrai.info/blog/html/2013/11/01/freebsd_mfsbsd.html <![CDATA[virtioを組み込んだmfsBSDイメージ作成]]> virtioを組み込んだmfsBSDイメージ作成

シェルスクリプトでFreeBSD 9.1のインストール自動化」だとFreeBSD母艦が必要になるので、どうにかしてSyslinuxにまとめられないか調べてみたところmfsBSDというものを見付けた。今回は「9.1-RELEASE」のmfsBSDを作成した。

mfsBSDイメージ作成

% fetch http://mfsbsd.vx.sk/release/mfsbsd-2.1.tar.gz
% tar zvxf mfsbsd-2.1.tar.gz
% cd mfsbsd-2.1/conf
% cp rc.conf.sample rc.conf
% cp rc.local.sample rc.local
% cp loader.conf.sample loader.conf
% cd ..
% mkdir freebsd91
% cd freebsd91
% fetch http://ftp.jaist.ac.jp/pub/FreeBSD/releases/amd64/9.1-RELEASE/base.txz
% fetch http://ftp.jaist.ac.jp/pub/FreeBSD/releases/amd64/9.1-RELEASE/kernel.txz
% cd ..
% make RELEASE=9.1-RELEASE BASE=/path/freebsd91

% ls *.img
mfsbsd-9.1-RELEASE-amd64.img

mfsBSDのMakefileを眺めてみると「RELEASE」オプションを付けない場合、生成されるイメージファイル名にuname(1)が使われる。「RELEASE」オプションを付けてないとホストが「9.2-RELEASE」「10-CURRENT」のとき「9.1-RELEASE」のイメージファイルを作成するとホストのversionの付いたファイル名でイメージファイルが生成される。

VirtIOを有効にしている仮想環境でもmfsBSDを使えるようにしてみる。VirtIOのバイナリを作るのが面倒だったので配布されていないか調べてみたら見付けた。

% mkdir virtio
% cd virtio
% fetch http://people.freebsd.org/~kuriyama/virtio/9.1/virtio-kmod-9.1-0.250249.tbz
% tar Jxf virtio-kmod-9.1-0.250249.tbz

「BOOTMODULES」変数にモジュールをスペース区切り書いておけばイメージファイル作成時にモジュールが組込まれる。VirtIOモジュールのほうはkernel.txzを展開し、boot/kernelにコピーして再度圧縮しておく。

% cd /path/freebsd91
% tar zxpf kernel.txz

% cd /path/virtio/boot/modules
% cp `ls` /path/freebsd91/boot/kernel

% cd /path/freebsd91
% tar Jcvf kernel.txz boot
% diff -u Makefile Makefile.org
--- Makefile    2013-11-01 12:43:34.000000000 +0900
+++ Makefile.org        2013-11-01 01:34:12.000000000 +0900
@@ -73,7 +73,7 @@
 #
 DOFS=${TOOLSDIR}/doFS.sh
 SCRIPTS=mdinit mfsbsd interfaces packages
-BOOTMODULES=acpi ahci virtio virtio_pci virtio_blk virtio_balloon if_vtnet
+BOOTMODULES=acpi ahci
 MFSMODULES=geom_mirror geom_nop opensolaris zfs ext2fs snp smbus ipmi ntfs nullfs tmpfs
 #

Syslinux

これでDebian,CentOS,FreeBSDのディスクレスブート環境が出来上がった。

% vi /path/pxelinux.cfg/default

default menu.c32
label FreeBSD 9.1
kernel memdisk
append initrd=mfsbsd-9.1-RELEASE-amd64.img harddisk

9.2-RELEASEからVirtIOは標準で入っている。VirtIOを使いたければ、設定をloader.confに書くだけ。シェルスクリプトには下記のような変更を加えておけばいい。

% diff -u freebsd_install.conf freebsd_virtio.conf
--- freebsd_install.conf        2013-11-01 18:05:26.993246593 +0900
+++ freebsd_virtio.conf 2013-11-01 17:48:52.725299517 +0900
@@ -1,8 +1,8 @@
 #!/bin/sh -x

-# 01:23:45:67:89:ab
+# 01:23:45:67:89:cd

-DISK=ada0
+DISK=vtbd0
 IFACE=$1
 CWD=$2
 CHROOT_FREEBSD="/mnt/$3"
@@ -27,8 +27,16 @@
   tar xfzp $FILE
 done

+cat << EOF > ${CHROOT_FREEBSD}/boot/loader.conf
+virtio_load="YES"
+virtio_pci_load="YES"
+virtio_blk_load="YES"
+if_vtnet_load="YES"
+virtio_balloon_load="YES"
+EOF
+
 cat << EOF > ${CHROOT_FREEBSD}/etc/rc.conf
-hostname="freebsd-install.local"
+hostname="freebsd-virtio.local"
 keymap="us.iso.kbd"
 ifconfig_${IFACE}=" inet 192.168.2.200 netmask 255.255.255.0"
 defaultrouter="192.168.2.254"
]]>
Fri, 01 Nov 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/10/26/centos_diskless.html http://d.zinrai.info/blog/html/2013/10/26/centos_diskless.html <![CDATA[CentOS ディスクレスブートサーバ構築]]> CentOS ディスクレスブートサーバ構築

Proxy DHCPを使ったディスクレスブート環境構築」にCentOSのディスクレスブート環境を追加してみる。

% cat /etc/centos-release
CentOS release 6.4 (Final)

% uname -a
Linux localhost.localdomain 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
% yum groupinstall --releasever=6 --installroot=/var/diskless/centos6  Base -y
% yum upgrade --releasever=6 --installroot=/var/diskless/centos6 -y
% mount --rbind /dev /var/diskless/centos6/dev
% cd /var/diskless/centos6
% cp usr/share/zoneinfo/Asia/Tokyo etc/localtime
% chroot /var/diskless/centos6 passwd
% chroot /var/diskless/centos6 yum -y install kernel

% vi /var/diskless/centos6/etc/fstab
none    /tmp        tmpfs   defaults   0 0
tmpfs   /dev/shm    tmpfs   defaults   0 0
sysfs   /sys        sysfs   defaults   0 0
proc    /proc       proc    defaults   0 0

% vi /var/diskless/centos6/etc/resolv.conf
nameserver 8.8.8.8
% yum -y install dracut-network
% dracut initramfs-`uname -r`.img
% vi /etc/exports
/var/diskless/centos6 192.168.2.0/24(rw,sync,no_root_squash,no_all_squash)

% service rpcbind start
% service nfslock start
% service nfs start

あとはブートメニューにCentOSを追加するだけ。

% vi /var/diskless/pxelinux.cfg/default
default menu.c32
label Debian wheezy
kernel vmlinuz-3.2.0-4-amd64
append initrd=initrd.img-3.2.0-4-amd64 root=/dev/nfs ip=dhcp nfsroot=192.168.2.100:/var/diskless/wheezy rw

label CentOS 6.4
kernel vmlinuz-2.6.32-358.23.2.el6.x86_64
append initrd=initramfs-2.6.32-358.23.2.el6.x86_64.img root=nfs:192.168.2.101:/var/diskless/centos6 rw
]]>
Sat, 26 Oct 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/10/25/gentoo_emerge_sync_local_mirror.html http://d.zinrai.info/blog/html/2013/10/25/gentoo_emerge_sync_local_mirror.html <![CDATA[Gentoo Linux rsync ロカールミラー]]> Gentoo Linux rsync ロカールミラー

Gentoo Linuxマシンを複数台動かしている場合、それぞれのGentooマシンからemerge –syncするとリモートのミラーサーバに負荷が掛かるのでローカルにミラーサーバを構築し参照するようにした。

サーバ

% vi /etc/crontab
0 23 * * * root emerge-webrsync
% vi /etc/rsyncd.conf
# /etc/rsyncd.conf

# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help

# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
use chroot = yes
read only = yes
hosts allow = 192.168.2.0/24

# Simple example for enabling your own local rsync server
[gentoo-portage]
        path = /usr/portage
        comment = Gentoo Portage tree
        exclude = /distfiles /packages
% /etc/init.d/rsyncd start
% rc-update add rsyncd default

クライアント

% rsync 192.168.2.1::
gentoo-portage  Gentoo Portage tree

% rsync 192.168.2.1::gentoo-portage | head
drwxr-xr-x        4096 2013/10/25 10:30:12 .
-rw-r--r--         121 2013/01/01 09:31:01 header.txt
-rw-r--r--        3658 2013/01/01 09:31:01 skel.ChangeLog
-rw-r--r--        8147 2013/01/01 09:31:01 skel.ebuild
-rw-r--r--        1232 2013/03/06 06:31:01 skel.metadata.xml
drwxr-xr-x        4096 2013/10/17 09:31:02 app-accessibility
drwxr-xr-x       12288 2013/10/17 09:31:02 app-admin
drwxr-xr-x        4096 2013/10/17 09:31:02 app-antivirus
drwxr-xr-x        4096 2013/10/25 06:01:12 app-arch
drwxr-xr-x        4096 2013/10/25 06:01:13 app-backup
% vi /etc/portage/make.conf
SYNC="rsync://192.168.2.1/gentoo-portage"
% emerge --sync
]]>
Fri, 25 Oct 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/10/24/debian_wheezy_dnsmasq_proxy_dhcp.html http://d.zinrai.info/blog/html/2013/10/24/debian_wheezy_dnsmasq_proxy_dhcp.html <![CDATA[Proxy DHCPを使ったディスクレスブート環境構築]]> Proxy DHCPを使ったディスクレスブート環境構築

Proxy DHCPを使ってDHCPサーバとネットワークブートサーバを切り離し、ディスクレスブート環境を構築してみる。

DHCPサーバ,Proxy DHCPともにdnsmasq、OSはDebian wheezyを使用する。

% lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.2 (wheezy)
Release:        7.2
Codename:       wheezy

DHCPサーバ

% apt-get install dnsmasq
% vi /etc/dnsmasq.d/dhcp.conf
dhcp-range=192.168.2.230,192.168.2.253,2h
dhcp-option=3,192.168.2.254
% service dnsmasq restart

Proxy DHCP

% apt-get install dnsmasq
% vi /etc/dnsmasq.d/pxe.conf
dhcp-range=192.168.2.0,proxy
pxe-service=x86PC, "os install", pxelinux
enable-tftp
tftp-root=/var/diskless

Diskless Boot

% apt-get install syslinux nfs-kernel-server debootstrap
% debootstrap stable /var/diskless/wheezy http://ftp.jp.debian.org/debian
% chroot /var/diskless/Wheezy passwd root
% vi /etc/exports
/var/diskless/wheezy 192.168.2.0/24(rw,no_root_squash,no_subtree_check)
% mkdir /var/diskless
% cp /usr/lib/syslinux/menu.c32 /var/diskless
% cp /usr/lib/syslinux/pxelinux.0 /var/diskless
% cp /boot/initrd* /var/diskless
% cp /boot/vmlinuz* /var/diskless
% mkdir /var/diskless/pxelinux.cfg
% vi /var/diskless/pxelinux.cfg/default
default menu.c32
label Debian Wheezy
kernel vmlinuz-3.2.0-4-amd64
append initrd=initrd.img-3.2.0-4-amd64 root=/dev/nfs ip=dhcp nfsroot=192.168.2.100:/var/diskless/wheezy rw
% service dnsmasq restart
% service nfs-kernel-server restart
]]>
Thu, 24 Oct 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/10/22/debian_wheezy_openvswitch_bridge.html http://d.zinrai.info/blog/html/2013/10/22/debian_wheezy_openvswitch_bridge.html <![CDATA[Open vSwitchを使ってみる]]> Open vSwitchを使ってみる

bridgeをOpen vSwitchに変えてみた。

% lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.2 (wheezy)
Release:        7.2
Codename:       wheezy

bridge停止

% service networking stop

% brctl delif br0 eth0
% brctl delif br1 eth1
% brctl delbr br0
% brctl delbr br1

% modprobe -r bridge

Open vSwitch インストール

% apt-get install -y openvswitch-switch openvswitch-datapath-source openvswitch-brcompat module-assistant
% module-assistant auto-install openvswitch-datapath-source
% modprobe openvswitch_mod
% modprobe brcompat_mod
% service openvswitch-switch start
% vi /etc/default/openvswitch-switch
BRCOMPAT=yes
% vi /etc/modules
openvswitch_mod
brcompat_mod

Open vSwitch bridge設定

% ovs-vsctl add-br br0
% ovs-vsctl add-br br1
% ovs-vsctl add-port br0 eth0
% ovs-vsctl add-port br1 eth1
% ovs-vsctl show
2a8eb1c3-4273-42b3-9f84-108918d53d15
    Bridge "br0"
        Port "eth0"
            Interface "eth0"
        Port "br0"
            Interface "br0"
                type: internal
    Bridge "br1"
        Port "eth1"
            Interface "eth1"
        Port "br1"
            Interface "br1"
                type: internal
    ovs_version: "1.4.2"
% vi /etc/network/interfaces
auto eth0
iface eth0 inet manual
  up /sbin/ifconfig eth0 up
  down /sbin/ifconfig eth0 down

auto eth1
iface eth1 inet manual
  up /sbin/ifconfig eth1 up
  down /sbin/ifconfig eth1 down

libvirt

openvswitch-brcompat使わず仮想マシンをOpen vSwitchのbridgeに接続するには、<virtualport type=’openvswitch’>を追加する。

% libvirtd --version
libvirtd (libvirt) 0.9.12
% virsh edit vm01
<interface type='bridge'>
      <source bridge='br1'/>
      <virtualport type='openvswitch'>
      <model type='virtio'/>
</interface>
]]>
Tue, 22 Oct 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/10/17/freebsd_supervisor_uwsgi.html http://d.zinrai.info/blog/html/2013/10/17/freebsd_supervisor_uwsgi.html <![CDATA[Supervisorを使ってuWSGIを管理]]> Supervisorを使ってuWSGIを管理

uWSGIのプロセスをSupervisorを使って管理してみる。

% uname -a
FreeBSD uwsgi.localnet 9.2-RELEASE FreeBSD 9.2-RELEASE #0 r256370: Sat Oct 12 22:47:21 JST 2013

% python -V
Python 2.7.5

% supervisord -v
3.0b1

% uwsgi --version
1.9.18.1

uWSGI

% vi /path/app/dev.ini

[uwsgi]
http = :9090
workers = 3
virtualenv = /path/test
python-path = /path/app
wsgi = sample
callable = app
uid = www
gid = www
pidfile = /path/app/uwsgi.pid
logto = /path/app/uwsgi.log
log-format = %(addr) - %(user) [%(ltime)] "%(method) %(uri) %(proto)" %(status) %(size)`` "%(referer)" "%(uagent)"

Supervisor

% cd /usr/local/etc
% grep -v "^;" supervisord.conf.sample > supervisord.conf
% vi /usr/local/etc/supervisord.conf

[unix_http_server]
file=/var/run/supervisor/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisor/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files = /usr/local/etc/supervisord.d/*.ini
% vi /usr/local/etc/supervisord.d/uwsgi.ini

[program:uwsgi]
command = /path/bin/uwsgi /path/app/dev.ini
stopasgroup = true

子プロセスまでkillするにはstopasgroupオプションが必要

stopasgroupオプションを有効にしなければ、Supervisor経由でuWSGIを止められない。(stopasgroupオプションなしでは、Supervisorのstopを実行したときにuWSGIの親プロセスしかkillされず、子プロセスが残ったままになってしまう。)

% vi /etc/rc.conf
supervisord_enable="YES"
supervisord_flags="-c /usr/local/etc/supervisord.conf"
% service supervisord start
% supervisorctl status
uwsgi                            RUNNING    pid 58014, uptime 0:15:23

% supervisorctl stop uwsgi
% supervisorctl start uwsgi
]]>
Thu, 17 Oct 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/10/02/xdm_setting.html http://d.zinrai.info/blog/html/2013/10/02/xdm_setting.html <![CDATA[XDM 設定]]> XDM 設定

XDMのログイン画面はデフォルトだと寂しいので、ログイン毎に背景画像が代わるようにしている。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.1 (wheezy)
Release:        7.1
Codename:       wheezy
% cd /etc/X11/xdm
% cp xdm-config xdm-config.bak
% cp Xsetup Xsetup_0
% cp Xresources Xresources_0

xdm-config

% diff -u xdm-config xdm-config.bak
--- xdm-config  2013-10-03 00:28:33.000000000 +0900
+++ xdm-config.bak      2013-10-02 23:18:35.000000000 +0900
@@ -15,7 +15,7 @@
 DisplayManager.keyFile:                /etc/X11/xdm/xdm-keys
 DisplayManager.servers:                /etc/X11/xdm/Xservers
 DisplayManager.accessFile:     /etc/X11/xdm/Xaccess
-DisplayManager*resources:      /etc/X11/xdm/Xresources_0
+DisplayManager*resources:      /etc/X11/xdm/Xresources
 DisplayManager.willing:                su nobody -s /bin/sh -c /etc/X11/xdm/Xwilling
 ! All displays should use authorization, but we cannot be sure
 ! X terminals will be configured to support it, so those that do not will
@@ -25,7 +25,7 @@
 DisplayManager*chooser:                /usr/lib/X11/xdm/chooser
 DisplayManager*startup:                /etc/X11/xdm/Xstartup
 DisplayManager*session:                /etc/X11/xdm/Xsession
-DisplayManager*setup:          /etc/X11/xdm/Xsetup_0
+DisplayManager*setup:          /etc/X11/xdm/Xsetup
 DisplayManager*reset:          /etc/X11/xdm/Xreset
 DisplayManager*authComplain:   true

Xsetup_0

このファイルに指定したディレクトリにある画像をランダムに背景画像にするスクリプトを書く。

指定した範囲の値から一つ取り出す処理にathena-jot(1)、背景画像の設定にはxsetbg(1x)を使った。

% apt-get install athena-jot xloadimage
% vi /etc/X11/xdm/Xsetup_0
#!/bin/sh
#
# This script is run as root before showing login widget.

#xsetroot -solid rgb:8/8/8

IMGDIR=/home/hoge/gazo

IMG_COUNT=`ls $IMGDIR | wc -l`
LINE_NUM=`jot -r 1 1 $IMG_COUNT`

IMG=`ls $IMGDIR | awk 'NR == '$LINE_NUM' { print $1 }'`

if [ -x /usr/bin/xsetbg ]; then
  /usr/bin/xsetbg -fullscreen $IMGDIR/$IMG
fi

Xresources_0

% vi /etc/X11/xdm/Xresources_0
--- Xresources        2011-10-23 01:48:34.000000000 +0900
+++ Xresources_0      2013-10-03 01:50:27.000000000 +0900
@@ -15,34 +15,35 @@
  Ctrl<Key>Return: set-session-argument(failsafe) finish-field()\n\
  <Key>Return: set-session-argument() finish-field()

-xlogin*greeting: Welcome to CLIENTHOST
-xlogin*namePrompt: \040\040\040\040\040\040\040Login:
+xlogin*greeting: Hello World
+xlogin*namePrompt: Login:
 xlogin*fail: Login incorrect or forbidden by policy

 #if WIDTH > 800
-xlogin*greetFont: -adobe-helvetica-bold-o-normal--24-240-75-75-p-138-iso8859-1
-xlogin*font: -adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1
-xlogin*promptFont: -adobe-helvetica-bold-r-normal--18-180-75-75-p-103-iso8859-1
-xlogin*failFont: -adobe-helvetica-bold-r-normal--18-180-75-75-p-103-iso8859-1
-xlogin*greetFace:    Serif-24:bold:italic
-xlogin*face:                 Helvetica-18
-xlogin*promptFace:   Helvetica-18:bold
-xlogin*failFace:     Helvetica-18:bold
+xlogin*greetFont: -adobe-helvetica-bold-o-normal--10-100-75-75-p-60-iso8859-1
+xlogin*font: -adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1
+xlogin*promptFont: -adobe-helvetica-bold-r-normal--10-100-75-75-p-60-iso8859-1
+xlogin*failFont: -adobe-helvetica-bold-o-normal--10-100-75-75-p-60-iso8859-1
+xlogin*greetFace:       Serif-8:bold:italic
+xlogin*face:            Helvetica-8
+xlogin*promptFace:      Helvetica-8:bold
+xlogin*failFace:        Helvetica-8:bold
 #else
-xlogin*greetFont: -adobe-helvetica-bold-o-normal--17-120-100-100-p-92-iso8859-1
-xlogin*font: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1
-xlogin*promptFont: -adobe-helvetica-bold-r-normal--12-120-75-75-p-70-iso8859-1
-xlogin*failFont: -adobe-helvetica-bold-o-normal--14-140-75-75-p-82-iso8859-1
-xlogin*greetFace:    Serif-18:bold:italic
-xlogin*face:         Helvetica-12
-xlogin*promptFace:   Helvetica-12:bold
-xlogin*failFace:     Helvetica-14:bold
+xlogin*greetFont: -adobe-helvetica-bold-o-normal--10-100-75-75-p-60-iso8859-1
+xlogin*font: -adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1
+xlogin*promptFont: -adobe-helvetica-bold-r-normal--10-100-75-75-p-60-iso8859-1
+xlogin*failFont: -adobe-helvetica-bold-o-normal--10-100-75-75-p-60-iso8859-1
+xlogin*greetFace:       Serif-8:bold:italic
+xlogin*face:            Helvetica-8
+xlogin*promptFace:      Helvetica-8:bold
+xlogin*failFace:        Helvetica-8:bold
 #endif

 #ifdef COLOR
-xlogin*borderWidth: 1
-xlogin*frameWidth: 5
-xlogin*innerFramesWidth: 2
+xlogin*geometry: 180x120-0-0
+!xlogin*borderWidth: 1
+!xlogin*frameWidth: 5
+!xlogin*innerFramesWidth: 2
 xlogin*shdColor: grey30
 xlogin*hiColor: grey90
 xlogin*background: grey
@@ -59,13 +60,13 @@
 xlogin*hiColor: black
 #endif

-#if PLANES >= 8
-xlogin*logoFileName: /usr/share/X11/xdm/pixmaps/debian.xpm
-#else
-xlogin*logoFileName: /usr/share/X11/xdm/pixmaps/debianbw.xpm
-#endif
-xlogin*useShape: true
-xlogin*logoPadding: 10
+!#if PLANES >= 8
+!xlogin*logoFileName: /usr/share/X11/xdm/pixmaps/debian.xpm
+!#else
+!xlogin*logoFileName: /usr/share/X11/xdm/pixmaps/debianbw.xpm
+!#endif
+!xlogin*useShape: true
+!xlogin*logoPadding: 10


 XConsole.text.geometry:      480x130
]]>
Wed, 02 Oct 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/20/ssh_proxycommand.html http://d.zinrai.info/blog/html/2013/09/20/ssh_proxycommand.html <![CDATA[netcatを使わずに多段SSH]]> netcatを使わずに多段SSH

netcatを使い多段SSHをしている記事をよく見掛けるが、私はnetcatのプロセスが動くのが気持ち悪いのでこちらの方法で多段SSHをしている。いつからあるオプションなのかは知らないがCentOS 6.4のSSH(OpenSSH 5.3)ではすでに存在している。

ssh(1)より。

-W host:port
             Requests that standard input and output on the client be forwarded to host on
             port over the secure channel.  Implies -N, -T, ExitOnForwardFailure and
             ClearAllForwardings and works with Protocol version 2 only.
$ vi $HOME/.ssh/config
Host fumidai
  HostName 192.168.2.1
  User hoge
  Port 22
  IdentityFile ~/.ssh/id_rsa
Host server1
  Hostname 192.168.0.2
  User fuga
  Port 22
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand ssh fumidai -W %h:%p
$ ssh server1
]]>
Fri, 20 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/19/debian_wheezy_schroot_chroot.html http://d.zinrai.info/blog/html/2013/09/19/debian_wheezy_schroot_chroot.html <![CDATA[schrootを使って一般ユーザでchroot]]> schrootを使って一般ユーザでchroot

schrootはroot権限を持たない一般ユーザでもchrootできるようにするwrapperである。オプションや設定ひとつでホストの環境,環境変数を引き継ぐことができとても便利なツールだ。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.1 (wheezy)
Release:        7.1
Codename:       wheezy
% apt-get install schroot
% schroot --version
schroot (Debian sbuild) 1.6.4 (26 Oct 2012)
Written by Roger Leigh

Copyright © 2004–2012 Roger Leigh
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Configured features:
  DEVLOCK      Device locking
  PAM          Pluggable Authentication Modules
  PERSONALITY  Linux kernel Application Binary Interface switching
  UNION        Support for filesystem unioning

Available chroot types:
  BLOCKDEV     Support for ‘block-device’ chroots
  BTRFSSNAP    Support for ‘btrfs-snapshot’ chroots
  CUSTOM       Support for ‘custom’ chroots
  DIRECTORY    Support for ‘directory’ chroots
  FILE         Support for ‘file’ chroots
  LOOPBACK     Support for ‘loopback’ chroots
  LVMSNAP      Support for ‘lvm-snapshot’ chroots
  PLAIN        Support for ‘plain’ chroots
$ mkdir -p /var/chroot/wheezy
% debootstrap stable /var/chroot/wheezy http://ftp.jp.debian.org/debian
% find /etc/schroot
/etc/schroot
/etc/schroot/buildd
/etc/schroot/buildd/nssdatabases
/etc/schroot/buildd/copyfiles
/etc/schroot/buildd/fstab
/etc/schroot/desktop
/etc/schroot/desktop/nssdatabases
/etc/schroot/desktop/copyfiles
/etc/schroot/desktop/fstab
/etc/schroot/default
/etc/schroot/default/nssdatabases
/etc/schroot/default/copyfiles
/etc/schroot/default/fstab
/etc/schroot/setup.d
/etc/schroot/setup.d/05file
/etc/schroot/setup.d/00check
/etc/schroot/setup.d/70services
/etc/schroot/setup.d/50chrootname
/etc/schroot/setup.d/15killprocs
/etc/schroot/setup.d/99check
/etc/schroot/setup.d/15binfmt
/etc/schroot/setup.d/05lvm
/etc/schroot/setup.d/05btrfs
/etc/schroot/setup.d/05union
/etc/schroot/setup.d/10mount
/etc/schroot/setup.d/20copyfiles
/etc/schroot/setup.d/20nssdatabases
/etc/schroot/minimal
/etc/schroot/minimal/nssdatabases
/etc/schroot/minimal/copyfiles
/etc/schroot/minimal/fstab
/etc/schroot/sbuild
/etc/schroot/sbuild/nssdatabases
/etc/schroot/sbuild/copyfiles
/etc/schroot/sbuild/fstab
/etc/schroot/chroot.d
/etc/schroot/schroot.conf

ホストのfstabにschroot用の設定を書いていたり、ホストのfstabに設定を書くのがイケてないと言っている記事を見掛けるが、schroot(1),schroot.conf(5)を眺めたのだろうか。/etc/schroot以下の構成は上記のようになっている。ホストからchroot環境へコピーするファイル(passwd,resolv.confなど)やマウントするディレクトリの設定などは/etc/schroot以下にディレクトリを切り設定ファイルを書いていく(このディレクトリをプロファイルと呼ぶことにする)。下記はdefaultプロファイルの設定ファイルである。

$ cat /etc/schroot/default/copyfiles
# Files to copy into the chroot from the host system.
#
# <source and destination>
/etc/resolv.conf
$ cat /etc/schroot/default/nssdatabases
# System databases to copy into the chroot from the host system.
#
# <database name>
passwd
shadow
group
gshadow
services
protocols
networks
hosts
$ cat /etc/schroot/default/fstab
# fstab: static file system information for chroots.
# Note that the mount point will be prefixed by the chroot path
# (CHROOT_PATH)
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/proc           /proc           none    rw,bind        0       0
/sys            /sys            none    rw,bind        0       0
/dev            /dev            none    rw,bind         0       0
/dev/pts        /dev/pts        none    rw,bind         0       0
/home           /home           none    rw,bind         0       0
/tmp            /tmp            none    rw,bind         0       0

# It may be desirable to have access to /run, especially if you wish
# to run additional services in the chroot.  However, note that this
# may potentially cause undesirable behaviour on upgrades, such as
# killing services on the host.
#/run           /run            none    rw,bind         0       0
#/run/lock      /run/lock       none    rw,bind         0       0
#/dev/shm       /dev/shm        none    rw,bind         0       0
#/run/shm       /run/shm        none    rw,bind         0       0

プロファイルはprofileオプションを使い呼び出す。デフォルトではdefaultプロファイルが呼び出される。

% vi /etc/schroot/chroot.d/wheezy.conf
[wheezy]
type=directory
directory=/var/chroot/wheezy
profile=desktop
users=zinrai
root-groups=root

環境変数を引き継ぐ場合は「-p」オプションを付ける。

$ schroot -c wheezy -p bash
]]>
Thu, 19 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/11/debian_wheezy_cowbuilder_chroot.html http://d.zinrai.info/blog/html/2013/09/11/debian_wheezy_cowbuilder_chroot.html <![CDATA[cowbuilderを使ったsandbox環境]]> cowbuilderを使ったsandbox環境

今回もchrootネタである。cowbuilderを使うとホスト環境を汚さずにいろいろできる。

  • 気になるパッケージをとりあえずインストールして使ってみたい
  • Debianのパッケージが古く最新のソースをビルドして使ってみる
  • Texを使いたいがホスト環境には入れたくない

などのシーンで私は使っている。

lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.1 (wheezy)
Release:        7.1
Codename:       wheezy
% apt-get install cowbuilder
% cowbuilder --create --distribution wheezy --architecture amd64 --basepath  /var/cache/pbuilder/base_wheezy_amd64.cow

ベース環境を毎回取ってくるのはサーバに負荷がかかるので同じバージョンとアーキテクチャを使うときはコピーする。

% cd /var/cache/pbuilder
% cp -R base_wheezy_amd64.cow rails3_wheezy_amd64.cow
–distribution 作成するディストリビューションの指定。sidもしくはコードネームを選ぶ。(省略した場合のデフォルトはsid)
–architecture アーキテクチャの指定。(省略した場合のデフォルトはホストと同じ)
–basepath テンプレートのディレクトリパス(省略した場合のデフォルトは/var/cache/pbuilder/base.cow)

「–save」オプションを付けると変更を保存できる。オプションなしの場合はログアウトすると変更は消える。

% cowbuilder --login --save --basepath /var/cache/pbuilder/base_wheezy_amd64.cow

「–bindmount」オプションでホストのディレクトリをchroot環境にマウントできる。

% cowbuilder --login --save --bindmount /home/hoge/dir --basepath /var/cache/pbuilder/base_wheezy_amd64.cow

ほかにもいろいろオプションがあるのでcowbuilder(8)を眺めてみるといい。

]]>
Wed, 11 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/10/debian_wheezy_chroot_aufs.html http://d.zinrai.info/blog/html/2013/09/10/debian_wheezy_chroot_aufs.html <![CDATA[aufsを使ったchroot環境]]> aufsを使ったchroot環境

aufsとはLinuxにおけるunion mountの実装の1つである。union mountとは複数のファイルシステムを重ね合わせ一つのファイルシステムに見せる機能である。この機能はchroot環境と組み合わせると非常に勝手がいい。chroot環境をリードオンリーにし書き込み用のディレクトリと重ね合わせることでchroot環境を汚すことなく使うことができるようになる。

% lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.1 (wheezy)
Release:        7.1
Codename:       wheezy
% modinfo aufs
filename:       /lib/modules/3.2.0-4-amd64/kernel/fs/aufs/aufs.ko
staging:        Y
version:        3.2-20130204
description:    aufs -- Advanced multi layered unification filesystem
author:         Junjiro R. Okajima <aufs-users@lists.sourceforge.net>
license:        GPL
srcversion:     523C2808903A77806346A06
depends:
intree:         Y
vermagic:       3.2.0-4-amd64 SMP mod_unload modversions
parm:           brs:use <sysfs>/fs/aufs/si_*/brN (int)
% modprobe aufs
% debootstrap stable /hoge/wheezy http://ftp.jp.debian.org/debian
% mount -t aufs -o br:/hoge/rails:/hoge/wheezy=ro none /hoge/rails
% mount --rbind /dev /hoge/aufs_dir/dev
% mount -t proc none /hoge/aufs_dir/proc
% mount --rbind /sys /hoge/aufs_dir/sys
% chroot /hoge/aufs_dir /bin/bash

重ねるディレクトリを変えることで簡単にchroot環境を切り替えられる。

起動時にaufsを有効にしたければmodules(5)に書いておく。

% vi /etc/modules
aufs
]]>
Tue, 10 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/09/centos_chroot.html http://d.zinrai.info/blog/html/2013/09/09/centos_chroot.html <![CDATA[CentOSでchroot環境構築]]> CentOSでchroot環境構築

yum(8)では役割単位(Web,Mailサーバなど)でパッケージがグループ化されており、グループ名を指定することでグループに属しているパッケージをまとめてインストールできるようになっている。

グループ名はサブコマンドgrouplistで調べることができる。

# cat /etc/centos-release
CentOS release 6.4 (Final)
% yum grouplist
Loaded plugins: fastestmirror
Setting up Group Process
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Groups:
   E-mail server
Available Groups:
   Additional Development
   Backup Client
   Backup Server
   Base
   CIFS file server
   Client management tools
   Compatibility libraries
   ~~~~~~~~~~以下略~~~~~~~~~~

サブコマンドgroupifnoでグループに属しているパッケージを調べられる。

% yum groupinfo "E-mail Server"
Loaded plugins: fastestmirror
Setting up Group Process
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp

Group: E-mail server
 Description: Allows the system to act as a SMTP and/or IMAP e-mail server.
 Default Packages:
   dovecot
   postfix
   spamassassin
 Optional Packages:
   cyrus-imapd
   dovecot-mysql
   dovecot-pgsql
   dovecot-pigeonhole
   mailman
   sendmail
   sendmail-cf

BaseはCentOSのベースシステムがグループ化されている。

さらに「–installroot」オプションで指定したディレクトリにベースシステムを展開できる。

これを使えばCentOSのchroot環境を簡単に構築できる。

% yum -y --releasever=6 --installroot=/root/centos6 groupinstall "Base"
% cd /root/centos6
% cp usr/share/zoneinfo/Asia/Tokyo etc/localtime
% cp /etc/resolv.conf etc/
% chroot /root/centos6 ntpdate ntp.jst.mfeed.ad.jp
% chroot /root/centos6 hwclock --systohc

% mount --rbind /dev /root/centos6/dev
% mount -t proc none /root/centos6/proc
% mount --rbind /sys /root/centos6/sys

% chroot /root/centos6 /bin/bash

chroot環境のアップグレードは下記のようにすればいい。

% yum upgrade --releasever=6 --installroot=/root/centos6 -y
]]>
Mon, 09 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/08/gentoo_install_script.html http://d.zinrai.info/blog/html/2013/09/08/gentoo_install_script.html <![CDATA[Gentoo Linux インストールスクリプト]]> Gentoo Linux インストールスクリプト
  • 「そして私はOpenOfficeのビルドを諦めた」
  • 「俺たちはなにと戦っているのだ...」

などの名言で知られる(私調べ)Gentoo Linuxのインストールスクリプトを書いてみた。

  • 「Gentoo LiveCD」を使わなくてもGentooはインストール出来るよ
  • Gentooインストールまでの各種コマンドを間違いなく打ち込む自身がないよ
  • Gentoo怖くないよ

などが今回のモチベーションである。

シェルスクリプトでDebian wheezyのインストール自動化」で構築した環境にスクリプトを配置する。

その他に、stage3,portage, カーネルのコンフィグファイルをスクリプトのあるディレクトリに用意しておく。

実機,仮想環境(KVM)ともに動作することは確認した。Gentooを複数台セットアップする予定はいまのところない。

% cp /boot/config-* /var/scripts
% cd /var/scripts
% wget http://ftp.jaist.ac.jp/pub/Linux/Gentoo/snapshots/portage-20130830.tar.bz2
% wget http://ftp.jaist.ac.jp/pub/Linux/Gentoo/releases/amd64/current-stage3/stage3-amd64-20131010.tar.bz2
# vi /var/scripts/gentoo_install.conf
#!/bin/bash -x

# 01:23:45:67:89:ab

DATETIME=`date +"%m%d%H%M%Y"`

DISK="/dev/vda"
IFACE=$1
CWD=$2
CHROOT_GENTOO="/mnt/$3"

dd if=/dev/zero of=$DISK bs=1024 count=1

parted $DISK -s 'mklabel msdos'
parted $DISK -s 'mkpart primary 1 500'
parted $DISK -s 'mkpart primary 501 35000'
parted $DISK -s 'mkpart extended 35001 -0'
parted $DISK -s 'mkpart logical 35001 38000'
parted $DISK -s 'mkpart logical 38001 -0'
parted $DISK -s 'set 1 boot on'

mkswap ${DISK}5
swapon ${DISK}5
mkfs.ext2 ${DISK}1
mkfs.ext3 ${DISK}2
mkfs.ext3 ${DISK}6

mkdir $CHROOT_GENTOO

mount ${DISK}2 ${CHROOT_GENTOO}

tar xvjf ${CWD}/stage3-*.tar.bz2 -C ${CHROOT_GENTOO}
tar xvjf ${CWD}/portage-*.tar.bz2 -C ${CHROOT_GENTOO}/usr

mount ${DISK}1 ${CHROOT_GENTOO}/boot
mount ${DISK}6 ${CHROOT_GENTOO}/home

mount --rbind /dev ${CHROOT_GENTOO}/dev
mount -t proc none ${CHROOT_GENTOO}/proc
mount --rbind /sys ${CHROOT_GENTOO}/sys

cat << EOF > ${CHROOT_GENTOO}/etc/conf.d/hostname
HOSTNAME="gentoo.localnet"
EOF

cat << EOF > ${CHROOT_GENTOO}/etc/conf.d/hwclock
clock="local"
EOF

cat << EOF > ${CHROOT_GENTOO}/etc/conf.d/keymaps
KEYMAP="us"
EOF

cp -L /etc/resolv.conf ${CHROOT_GENTOO}/etc

cat << EOF > ${CHROOT_GENTOO}/etc/conf.d/net
config_${IFACE}="192.168.2.251/24"
routes_${IFACE}="default via 192.168.2.254"
EOF

cd ${CHROOT_GENTOO}/etc/init.d
ln -s net.lo net.${IFACE}

cat << EOF > ${CHROOT_GENTOO}/etc/fstab
${DISK}1               /boot           ext2            defaults        0 2
${DISK}2               /               ext3            defaults        0 1
${DISK}6               /home           ext3            defaults        0 2
${DISK}5               none            swap            sw              0 0
EOF

cat << EOF >> ${CHROOT_GENTOO}/etc/portage/make.conf
SYNC="rsync://ftp.jaist.ac.jp/pub/Linux/Gentoo"
GENTOO_MIRRORS="http://ftp.jaist.ac.jp/pub/Linux/Gentoo/ ftp://ftp.iij.ad.jp/pub/linux/gentoo/"
EOF

cp /var/scripts/config-* ${CHROOT_GENTOO}/root

cat << EOF > ${CHROOT_GENTOO}/tmp/gentoo_setup.sh
env-update
source /etc/profile

export CONFIG_PROTECT_MASK="/etc"

cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
echo "Asia/Tokyo" > /etc/timezone
date $DATETIME

echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen

emerge-webrsync

emerge rsyslog vixie-cron
rc-update add vixie-cron default
rc-update add rsyslog default
rc-update add sshd default
rc-update add net.${IFACE} default

emerge vim gentoo-sources

cd /usr/src/linux
cat <(egrep '(EXT2|EXT3|VIRTIO)' /root/config-* | sed 's/=m/=y/g') <(egrep -v '(EXT2|EXT3|VIRTIO)' /root/config-*) > .config

echo n | make oldconfig
make
make modules_install
make install

emerge --autounmask-write grub:2
emerge grub:2
mkdir /boot/grub
grub2-mkconfig -o /boot/grub/grub.cfg
grub2-install --no-floppy --root-directory=/ $DISK

grep -v rootfs /proc/mounts > /etc/mtab
EOF


cat << 'EOF' > ${CHROOT_DEBIAN}/tmp/user_acount.sh
useradd -m -G wheel nanashi
printf 'nanashi:$6$oHUVG9WPkdiCoxCP$XsnO5TmowzdGWNkZHv9pPUmFqgsEojkfzUa1OQj2zUOWAChL5cdGkm.dhseF0z5Tz30IEDrxNzOcsflPUgHDs.' | chpasswd -e
printf 'root:$6$wAeDl/exZFEDC0Sl$UdvTamL.94EcWFcGIAYJSgsvzaFxSd.ZLRMkD.KI27L6jxUGsWqOdEJs6if0rTG/XuEfQ9TNzHbjI99YfxPLD1' | chpasswd -e
EOF

chroot $CHROOT_GENTOO /bin/bash /tmp/gentoo_setup.sh
chroot $CHROOT_GENTOO /bin/bash /tmp/user_acount.sh

rm ${CHROOT_GENTOO}/tmp/gentoo_setup.sh
rm ${CHROOT_GENTOO}/tmp/user_acount.sh

cd /
umount -l ${CHROOT_GENTOO}/{boot,home,proc,dev,sys}
umount -l $CHROOT_GENTOO
sleep 2
rmdir $CHROOT_GENTOO
reboot
]]>
Sun, 08 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/07/debian_wheezy_pxeboot.html http://d.zinrai.info/blog/html/2013/09/07/debian_wheezy_pxeboot.html <![CDATA[シェルスクリプトでDebian wheezyのインストール自動化]]> シェルスクリプトでDebian wheezyのインストール自動化

みなさん、Debianのインストール作業はどうやっているだろうか。私は、OSのインストール作業なんてお金を貰わない限り手動でやりたくないので自動化している。OSの手動インストールをするだけでお金が発生するのであれば喜んでやらせていただく所存である。RedHat系の「Kickstart」と同じような仕組みの「preseed」というものがDebianにも存在するが、これを使わずに「pxeboot + debootstrap + シェルスクリプト」でインストールの自動化をしている。

pxeboot

# apt-get install debootstrap syslinux dnsmasq nfs-kernel-server

dnsmasq

DNSサーバ以外にもDHCP,TFTPサーバとしても使える便利なdnsmasq

# vi /etc/dnsmasq.d/pxe.conf
enable-tftp
tftp-root=/var/lib/tftpboot
dhcp-range=192.168.2.200,192.168.2.250,2h
dhcp-option=3,192.168.2.254
dhcp-boot=pxelinux.0

NFS

# vi /etc/exports
/var/lib/tftpboot/wheezy 192.168.2.0/24(rw,no_root_squash,no_subtree_check)

debootstrap

# mkdir -p /var/lib/tftpboot/wheezy
# debootstrap stable /var/lib/tftpboot/wheezy http://ftp.jp.debian.org/debian
# chroot /var/lib/tftpboot/wheezy passwd root
# chroot /var/lib/tftpboot/wheezy/ apt-get install linux-image-`uname -r` parted build-essential bzip2 grub2 debootstrap nfs-common

syslinux

# cp /boot/initrd* /var/lib/tftpboot
# cp /boot/vmlinuz* /var/lib/tftpboot

# cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot
# mkdir /var/lib/tftpboot/pxelinux.cfg

# vi /var/lib/tftpboot/pxelinux.cfg/default
default Debian
prompt 1
timeout 10
label Debian
kernel vmlinuz-3.2.0-4-amd64
append initrd=initrd.img-3.2.0-4-amd64 root=/dev/nfs ip=dhcp nfsroot=192.168.2.253:/var/lib/tftpboot/wheezy rw
# service dnsmasq start
# service nfs-kernel-server start

Debianインストールスクリプト

仕組みは「シェルスクリプトでFreeBSD 9.1のインストール自動化」と同じである。

debootstrapで取得した最小構成のWheezyをコピーするスクリプトを書いただけ。

パッケージインストール時にダイアログが表示され入力待ちにならないよう環境変数「DEBIAN_FRONTEND=noninteractive」を設定しておくのがポイントである。

この環境変数は解決方法はないかとdebconf(1)を眺めていたら

Debconf is a configuration system for Debian packages. For a debconf overview and documentation for sysadmins, see debconf(7) (in the debconf-doc package).

書かれており、説明に従いdebconf-docをインストールし、debconf(7)を眺めたところ見付けた。

os_install.shはconfファイルが1つだとうまく動いてくれないのでダミーのconfファイルを1つ作っておく。

# touch /var/scripts/dummy.conf
# mkdir -p /var/scripts/wheezy
# debootstrap stable /var/scripts/wheezy http://ftp.jp.debian.org/debian
# vi /var/scripts/os_install.sh
#!/bin/sh

get_conf() {
  if [ "$OS" = "FreeBSD" ]; then
    local MACADDR="`ifconfig | awk '/ether/ {print $NF}'`"
  elif [ "$OS" = "Linux" ]; then
    local MACADDR="`ifconfig | awk '/HWaddr/ {print $NF}'`"
  fi

  for a in $MACADDR; do
    grep -r $MACADDR ${CWD}/*.conf | awk -F: '{print $1}'
  done
}

CWD=`dirname $0`

OS=`uname`
CONFFILE=`get_conf`

if [ -z "$CONFFILE" ]; then
  printf 'Script Not Found\n'
  exit 1
fi

if [ "$OS" = "FreeBSD" ]; then
  IFACE=`netstat -nr | awk '{if($1 ~ /^default$/) print $6}'`
  MOUNTNAME=`sha256 -q $CONFFILE`
elif [ "$OS" = "Linux" ]; then
  IFACE=`netstat -nr | awk '{if($4 ~ /^UG$/) print $8}'`
  MOUNTNAME=`sha256sum $CONFFILE | awk '{print $1}'`
fi

$CONFFILE $IFACE $CWD $MOUNTNAME
# vi /var/scripts/debian_install.conf
#!/bin/bash -x

# 01:23:45:67:89:ab

DISK="/dev/vda"
IFACE=$1
CWD=$2
CHROOT_DEBIAN="/mnt/$3"

dd if=/dev/zero of=$DISK bs=1024 count=1

parted $DISK -s 'mklabel msdos'
parted $DISK -s 'mkpart primary 1 500'
parted $DISK -s 'mkpart primary 501 35000'
parted $DISK -s 'mkpart extended 35001 -0'
parted $DISK -s 'mkpart logical 35001 38000'
parted $DISK -s 'mkpart logical 38001 -0'
parted $DISK -s 'set 1 boot on'

mkswap ${DISK}5
swapon ${DISK}5
mkfs.ext2 ${DISK}1
mkfs.ext4 ${DISK}2
mkfs.ext4 ${DISK}6

mkdir $CHROOT_DEBIAN

mount ${DISK}2 ${CHROOT_DEBIAN}

cp -Rp ${CWD}/wheezy/* $CHROOT_DEBIAN

mount ${DISK}1 ${CHROOT_DEBIAN}/boot
mount ${DISK}6 ${CHROOT_DEBIAN}/home

mount --rbind /dev ${CHROOT_DEBIAN}/dev
mount -t proc none ${CHROOT_DEBIAN}/proc
mount --rbind /sys ${CHROOT_DEBIAN}/sys

cat << EOF > ${CHROOT_DEBIAN}/etc/hostname
install.localnet
EOF


cat << EOF > ${CHROOT_DEBIAN}/etc/resolv.conf
nameserver 8.8.8.8
EOF

cat << EOF > ${CHROOT_DEBIAN}/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address  192.168.2.100
netmask 255.255.255.0
gateway 192.168.2.254
EOF

cat << EOF > ${CHROOT_DEBIAN}/etc/fstab
${DISK}1               /boot           ext2            defaults        0 2
${DISK}2               /               ext4            defaults        0 1
${DISK}6               /home           ext4            defaults        0 2
${DISK}5               none            swap            sw              0 0
EOF

cat << EOF > ${CHROOT_DEBIAN}/tmp/debian_setup.sh
export DEBIAN_FRONTEND=noninteractive
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
grep -v rootfs /proc/mounts > /etc/mtab

apt-get install -y linux-image-`uname -r` grub2 openssh-server

grub-mkconfig -o /boot/grub/grub.cfg
grub-install --no-floppy --root-directory=/ $DISK
EOF

cat << 'EOF' > ${CHROOT_DEBIAN}/tmp/user_acount.sh
useradd -m -G sudo nanashi
printf 'nanashi:$6$oHUVG9WPkdiCoxCP$XsnO5TmowzdGWNkZHv9pPUmFqgsEojkfzUa1OQj2zUOWAChL5cdGkm.dhseF0z5Tz30IEDrxNzOcsflPUgHDs.' | chpasswd -e
printf 'root:$6$wAeDl/exZFEDC0Sl$UdvTamL.94EcWFcGIAYJSgsvzaFxSd.ZLRMkD.KI27L6jxUGsWqOdEJs6if0rTG/XuEfQ9TNzHbjI99YfxPLD1' | chpasswd -e
EOF

chroot ${CHROOT_DEBIAN} /bin/bash /tmp/debian_setup.sh
chroot ${CHROOT_DEBIAN} /bin/bash /tmp/user_acount.sh

rm ${CHROOT_DEBIAN}/tmp/debian_setup.sh
rm ${CHROOT_DEBIAN}/tmp/user_acount.sh

cd /
umount -l ${CHROOT_DEBIAN}/{boot,home,proc,dev,sys}
umount -l $CHROOT_DEBIAN
sleep 2
rmdir $CHROOT_DEBIAN
reboot

pxeboot時にインストールスクリプトが実行されるようrc.localに書いておく。

# vi /var/lib/tftpboot/wheezy/etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/var/scripts/os_install.sh

exit 0
]]>
Sat, 07 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/06/debian_wheezy_sshfs.html http://d.zinrai.info/blog/html/2013/09/06/debian_wheezy_sshfs.html <![CDATA[sshfs]]> sshfs

言わずと知れたSSH経由でリモートサーバのディレクトリをマウントしてくれるツール

いつも便利に使わせてもらっている。

# apt-get instal sshfs

fuseグループに所属していないと「fuse: failed to open /dev/fuse: Permission denied」となる。

# usermod -a -G fuse hoge
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.1 (wheezy)
Release:        7.1
Codename:       wheezy
$ sshfs --version
SSHFS version 2.4
FUSE library version: 2.9.0
using FUSE kernel interface version 7.18
$ sshfs -p 18465 hoge@192.168.2.1:/home/hoge remote_dir
$ fusermount -u remote_dir
]]>
Fri, 06 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/05/freebsd_python_uwsgi_logformat.html http://d.zinrai.info/blog/html/2013/09/05/freebsd_python_uwsgi_logformat.html <![CDATA[uWSGIのログフォーマット]]> uWSGIのログフォーマット

Nginxでリバースプロキシ」でバックエンドにアクセス元のIPアドレスがログに記録されると書いたが、バックエンド側でも設定しなければログには記録されない。個人でひっそりとWebサービスを運営していてもディレクトリトラバーサルや某CMSを攻撃しているのかなと思われるリクエストがログに記録されている。ログを眺めるのは楽しいものだ。

今回はバックエンドに「uWSGI」を置いた場合のログ設定について書く。動作するまでを書いた記事はよく見掛けるが、ログについて書いている記事は見たことがない。ドキュメントに書いてある通りに設定すればいいだけなので、わざわざ書き留めるほどの情報ではないのだろうか。

# pw groupadd uwsgi -g 9090
# pw useradd uwsgi -u 9090 -g 9090 -c "uWSGI" -d /nonexistent -s /usr/sbin/nologin

アクセスしたら「Hellow World」を出力するだけのFlaskを使ったアプリケーション

# vi sample.py
from flask import Flask

app = Flask(__name__)

@app.route('/myapp')
def hello_world():
    return "Hello World!"

if __name__ == '__main__':
    app.run()

uWSGIの設定をいろいろと書いているが大事なのはlog-x-forwarded-forとlog-formatの部分である。log-x-forwarded-forを有効にすればlog-formatの%(addr)にアクセス元のIPアドレスが記録される。

ログフォーマットは「Formatting uWSGI requests logs」に詳しく書いてある。

# vi development.ini
[uwsgi]
http = :9090
workers = 3
threads = 2
virtualenv = ${virtualenv_path}
python-path = ${application_path}
wsgi = sample
callable = app
pidfile = /var/run/uwsgi.pid
uid = uwsgi
gid = uwsgi
log-x-forwarded-for = true
daemonize = uwsgi.log
touch-reload = reload.txt
log-format = %(addr) - %(user) [%(ltime)] "%(method) %(uri) %(proto)" %(status) %(size)`` "%(referer)" "%(uagent)"
virtualenv virtualenvを使用している場合、virtualenvのパスを指定する
python-path アプリケーションのパスを指定する。
touch-reload 指定したファイルをtouchすることでアプリとuWSGIの設定がリロードされる
# touch reload.txt
# uwsgi development.ini
]]>
Thu, 05 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/04/freebsd_nginx_reverse_proxy.html http://d.zinrai.info/blog/html/2013/09/04/freebsd_nginx_reverse_proxy.html <![CDATA[Nginxでリバースプロキシ]]> Nginxでリバースプロキシ

jail環境でJenkinsを動かす」からの続きでlocalhostでListenしているJenkinsをNginxのリバースプロキシを使いlocalhost以外からもアクセスできるようにする。

Nginxのディレクトリ構成は下記を参考に

# nginx -v
nginx version: nginx/1.4.2
# vi /usr/local/etc/nginx/nginx.conf
http {

    server {
        listen       80;
        server_name  localhost;

        location /jenkins {
            proxy_pass http://127.0.0.1:8180;
        }
}

proxy_passを設定するだけでJenkinsに接続できるようになる。

「Python+Flask+uWSGI」で作ったAPサーバをバックエンドに置き、リバースプロキシにNginxを使った場合を考えると、上記の設定ではAPサーバのアクセスログにはリバースプロキシのIPアドレスが記録されてしまいアクセス元はどこなのかがわからない状態になってしまう。アクセス元のIPアドレスがAPサーバに記録されるようにするにはproxy_set_headerを設定する必要がある。

# vi /usr/local/etc/nginx/nginx.conf
http {

    server {
        listen       80;
        server_name  localhost;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;

        location /myapp {
            proxy_pass http://127.0.0.1:9090;
        }
}
]]>
Wed, 04 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/03/freebsd_jail_jenkins.html http://d.zinrai.info/blog/html/2013/09/03/freebsd_jail_jenkins.html <![CDATA[jail環境でJenkinsを動かす]]> jail環境でJenkinsを動かす

会社員だったときに仕様書がエルセル方眼紙だったので、「Sphinxにするとプレーンテキストで管理でき、gitなどのバージョン管理システムの管理下に置け、さらにJenkinsを使えば手元にSphinxがなくてもバージョン管理下に置いたソースをリモートリポジトリにpushするだけでビルドしてくれる環境ができますよ」というようなことをもう少しわかりやすく提案し見事に却下された。エクセル方眼紙は3人で編集していたのでマージ作業が辛かった。

jail環境の構築は下記を参考に

FreeBSDにJenkinsをインストールするとインストール後に下記のように表示される。

======================================================================

This OpenJDK implementation requires fdescfs(5) mounted on /dev/fd and
procfs(5) mounted on /proc.

If you have not done it yet, please do the following:

        mount -t fdescfs fdesc /dev/fd
        mount -t procfs proc /proc

To make it permanent, you need the following lines in /etc/fstab:

        fdesc   /dev/fd         fdescfs         rw      0       0
        proc    /proc           procfs          rw      0       0

======================================================================

jail環境ではマウントできないのでホストのjail.conf(5)にjail起動時にマウントするよう書いておく。

# vi /etc/jail.conf
jenkins {
        exec.prestart += "mount -t fdescfs fdesc /jails/${name}/dev/fd";
        exec.prestart += "mount -t procfs proc /jails/${name}/proc";
        exec.poststop += "umount /jails/${name}/dev/fd";
        exec.poststop += "umount /jails/${name}/proc";
        $if = 9;
        $ipaddr = 192.168.0.9;
}

jenkins

# vi /etc/rc.conf
jenkins_enable="YES"

# service jenkins start

JenkinsはlocalhostでListenしているので、このままだと他からアクセスできない。

次回はリバースプロキシにnginxを使いJenkinsにアクセスできるようにする。

]]>
Tue, 03 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/02/freebsd_irc_znc.html http://d.zinrai.info/blog/html/2013/09/02/freebsd_irc_znc.html <![CDATA[ZNCでIRC Proxy]]> ZNCでIRC Proxy

IRCクライアオンからIRCサーバに接続してない間の発言は見ることが出来無い。IRC Proxyを置けば接続していない間の発言を記録し、IRCクライアントからIRC Proxyに接続すれば記録された発言を見ることが出来る。IRC Proxyでログを定期的にメールすると外出中は捗る。IRC Proxyといえばネットでは「Tiarra」をよく見掛けるが、SSL接続のために「stone」などを使わなければならず面倒くさい。SSL接続できるIRC Proxyはないか探してみたところ「ZNC」を見付け使っている。

# pw useradd -n znc -s /bin/tcsh -m
# su - znc
$ znc --help
[ ** ] USAGE: znc [options]
[ ** ] Options are:
[ ** ]  -h, --help         List available command line options (this page)
[ ** ]  -v, --version      Output version information and exit
[ ** ]  -f, --foreground   Don't fork into the background
[ ** ]  -D, --debug        Output debugging information (Implies -f)
[ ** ]  -n, --no-color     Don't use escape sequences in the output
[ ** ]  -r, --allow-root   Don't complain if ZNC is run as root
[ ** ]  -c, --makeconf     Interactively create a new config
[ ** ]  -s, --makepass     Generates a password for use in config
[ ** ]  -p, --makepem      Generates a pemfile for use with SSL
[ ** ]  -d, --datadir      Set a different ZNC repository (default is ~/.znc)
$ znc -v
ZNC 1.0 - http://znc.in
IPv6: yes, SSL: yes, DNS: threads
$ znc -c
[ ok ] Checking for list of available modules...
[ ** ] Building new config
[ ** ]
[ ** ] First let's start with some global settings...
[ ** ]
[ ?? ] What port would you like ZNC to listen on? (1025 to 65535): 6668
[ ?? ] Would you like ZNC to listen using SSL? (yes/no) [no]: yes
[ ** ] Unable to locate pem file: [/home/znc/.znc/znc.pem]
[ ?? ] Would you like to create a new pem file now? (yes/no) [yes]:
[ ok ] Writing Pem file [/home/znc/.znc/znc.pem]...
[ ?? ] Would you like ZNC to listen using ipv6? (yes/no) [yes]: no
[ ?? ] Listen Host (Blank for all ips): 192.168.0.8
[ ok ] Verifying the listener...
[ ** ]
[ ** ] -- Global Modules --
[ ** ]
[ ** ] +-----------+----------------------------------------------------------+
[ ** ] | Name      | Description                                              |
[ ** ] +-----------+----------------------------------------------------------+
[ ** ] | partyline | Internal channels and queries for users connected to znc |
[ ** ] | webadmin  | Web based administration module                          |
[ ** ] +-----------+----------------------------------------------------------+
[ ** ] And 10 other (uncommon) modules. You can enable those later.
[ ** ]
[ ?? ] Load global module <partyline>? (yes/no) [no]:
[ ?? ] Load global module <webadmin>? (yes/no) [no]:
[ ** ]
[ ** ] Now we need to set up a user...
[ ** ]
[ ?? ] Username (AlphaNumeric): hoge
[ ?? ] Enter Password:
[ ?? ] Confirm Password:
[ ?? ] Would you like this user to be an admin? (yes/no) [yes]:
[ ?? ] Nick [hoge]:
[ ?? ] Alt Nick [hoge_]:
[ ?? ] Ident [hoge]:
[ ?? ] Real Name [Got ZNC?]: fuga
[ ?? ] Bind Host (optional):
[ ?? ] Number of lines to buffer per channel [50]:
[ ?? ] Would you like to clear channel buffers after replay? (yes/no) [yes]:
[ ?? ] Default channel modes [+stn]:
[ ** ]
[ ** ] -- User Modules --
[ ** ]
[ ** ] +--------------+------------------------------------------------------------------------------------------+
[ ** ] | Name         | Description                                                                              |
[ ** ] +--------------+------------------------------------------------------------------------------------------+
[ ** ] | chansaver    | Keep config up-to-date when user joins/parts                                             |
[ ** ] | controlpanel | Dynamic configuration through IRC. Allows editing only yourself if you're not ZNC admin. |
[ ** ] | perform      | Keeps a list of commands to be executed when ZNC connects to IRC.                        |
[ ** ] +--------------+------------------------------------------------------------------------------------------+
[ ** ] And 22 other (uncommon) modules. You can enable those later.
[ ** ]
[ ?? ] Load module <chansaver>? (yes/no) [no]:
[ ?? ] Load module <controlpanel>? (yes/no) [no]:
[ ?? ] Load module <perform>? (yes/no) [no]:
[ ** ]
[ ?? ] Would you like to set up a network? (yes/no) [no]: yes
[ ?? ] Network (e.g. `freenode' or `efnet'): hogeirc
[ ** ]
[ ** ] -- Network Modules --
[ ** ]
[ ** ] +-------------+-------------------------------------------------------------------------------------------------+
[ ** ] | Name        | Description                                                                                     |
[ ** ] +-------------+-------------------------------------------------------------------------------------------------+
[ ** ] | chansaver   | Keep config up-to-date when user joins/parts                                                    |
[ ** ] | keepnick    | Keep trying for your primary nick                                                               |
[ ** ] | kickrejoin  | Autorejoin on kick                                                                              |
[ ** ] | nickserv    | Auths you with NickServ                                                                         |
[ ** ] | perform     | Keeps a list of commands to be executed when ZNC connects to IRC.                               |
[ ** ] | simple_away | This module will automatically set you away on IRC while you are disconnected from the bouncer. |
[ ** ] +-------------+-------------------------------------------------------------------------------------------------+
[ ** ] And 16 other (uncommon) modules. You can enable those later.
[ ** ]
[ ?? ] Load module <chansaver>? (yes/no) [no]:
[ ?? ] Load module <keepnick>? (yes/no) [no]:
[ ?? ] Load module <kickrejoin>? (yes/no) [no]:
[ ?? ] Load module <nickserv>? (yes/no) [no]:
[ ?? ] Load module <perform>? (yes/no) [no]:
[ ?? ] Load module <simple_away>? (yes/no) [no]:
[ ** ]
[ ** ] -- IRC Servers --
[ ** ] Only add servers from the same IRC network.
[ ** ] If a server from the list can't be reached, another server will be used.
[ ** ]
[ ?? ] IRC server (host only): 192.168.0.7
[ ?? ] [192.168.50.7] Port (1 to 65535) [6667]: 6669
[ ?? ] [192.168.50.7] Password (probably empty): aiueo
[ ?? ] Does this server use SSL? (yes/no) [no]: yes
[ ** ]
[ ?? ] Would you like to add another server for this IRC network? (yes/no) [no]:
[ ** ]
[ ** ] -- Channels --
[ ** ]
[ ?? ] Would you like to add a channel for ZNC to automatically join? (yes/no) [yes]:
[ ?? ] Channel name: #fuga
[ ?? ] Would you like to add another channel? (yes/no) [no]:
[ ?? ] Would you like to set up another network? (yes/no) [no]:
[ ** ]
[ ?? ] Would you like to set up another user? (yes/no) [no]:
[ ok ] Writing config [/home/znc/.znc/configs/znc.conf]...
[ ** ]
[ ** ] To connect to this ZNC you need to connect to it as your IRC server
[ ** ] using the port that you supplied.  You have to supply your login info
[ ** ] as the IRC server password like this: user/network:pass.
[ ** ]
[ ** ] Try something like this in your IRC client...
[ ** ] /server <znc_server_ip> +6668 hoge:<pass>
[ ** ] And this in your browser...
[ ** ] https://<znc_server_ip>:6668/
[ ** ]
[ ?? ] Launch ZNC now? (yes/no) [yes]:
[ ok ] Opening config [/home/znc/.znc/configs/znc.conf]...
[ ok ] Binding to port [+6668] on host [192.168.0.8] using ipv4...
[ ** ] Loading user [hoge]
[ ** ] Loading network [hogeirc]
[ ok ] Adding server [192.168.0.7 +6669 aiueo]...
[ ok ] Forking into the background... [pid: 42611]
$ vi .znc/configs/znc.conf
// WARNING
//
// Do NOT edit this file while ZNC is running!
// Use webadmin or *controlpanel instead.
//
// Buf if you feel risky, you might want to read help on /znc saveconfig and /znc rehash.
// Also check http://en.znc.in/wiki/Configuration

Version = 1.0
<Listener l>
        Port = 6668
        IPv4 = true
        IPv6 = false
        SSL = true
        Host = 192.168.0.8
</Listener>

<User hoge>
        Pass       = sha256#...#...#
        Admin      = true
        Nick       = hoge
        AltNick    = hoge_
        Ident      = hoge
        RealName   = fuga
        Buffer     = 50
        AutoClearChanBuffer = true
        ChanModes  = +stn


        <Network hogeirc>

                Server     = 192.168.0.7 +6669 aiueo

                <Chan #atchan>
                </Chan>
        </Network>
</User>
# vi /etc/rc.conf
znc_enable="YES"
znc_user="znc"
znc_conf_dir="/home/znc/.znc"

# service znc start

WeeChat

WeeChat」で「ZNC」に接続するには

/server add hoge irc.hoge.localnet/6668 -ssl -username=hoge -password=hogepassword
/connect hoge
/disconnect hoge
]]>
Mon, 02 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/09/01/freebsd_irc_ngircd.html http://d.zinrai.info/blog/html/2013/09/01/freebsd_irc_ngircd.html <![CDATA[ngircdでIRCサーバ]]> ngircdでIRCサーバ

IT系のアルバイトをしていたときにNagios,Zabbixなどから定期的にメールがバンバン飛んできて、未読が4万通くらいになってメーラーを立ち上げるのを諦めたことがある。なんでもかんでもメールで飛ばすのは嫌いだ。メール振り分けなどの作業を各々がやらなければいけないなんて時間のムダだし、集約できる情報を各々にわざわざ管理させ余計な負担を強いているのがイケてないと私はいつも思っている。

このイライラをIRCは解決してくれる。IRCはチャットとして使うよりも、情報を集約させるのに非常に便利である。Nagiosのアラート,SSHのログイン情報などをIRCにポストするようにしている。IRCを積極的に使っている会社に勤めたことがないので個人でひっそりとやっているだけだが、IRCを眺めれば何が起っているかわかり、いい感じである。

「つかれた」とポストしたら返事をしてくれる(妹)BOTを仕込んで荒んだ心を癒すことも出来る。

今回はIRCサーバ(ngircd)の構築を行う。

# ngircd -V
ngIRCd 20.2-IPv6+IRCPLUS+SSL+SYSLOG+TCPWRAP+ZLIB-amd64/portbld/freebsd9.1
Copyright (c)2001-2013 Alexander Barton (<alex@barton.de>) and Contributors.
Homepage: <http://ngircd.barton.de/>

This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# cd /usr/local/etc
# touch ngircd.conf
# yes | ngircd -t | tee ngircd.conf
# echo "SUPER SONIKO" | tee ngircd.motd
# cp ngircd.conf ngircd.conf.org
# mkdir ngircd_ssl
# cd ngircd_ssl

# openssl dhparam -out dhparams.pem 2048.
# openssl req -newkey rsa:2048 -x509 -keyout server-key.pem -out server-cert.pem -days 3650
writing new private key to 'server-key.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
# diff -u ngircd.conf.org ngircd.conf
--- ngircd.conf.org     2013-08-31 12:44:37.665880056 +0900
+++ ngircd.conf 2013-08-31 12:45:03.457801026 +0900
@@ -1,17 +1,17 @@
 [GLOBAL]
-  Name =
+  Name = irc.hoge.localnet
   AdminInfo1 =
   AdminInfo2 =
-  AdminEMail =
+  AdminEMail = hoge@mail.localnet
   Info = ngIRCd 20.2
   Listen = ::,0.0.0.0
   MotdFile = /usr/local/etc/ngircd.motd
   MotdPhrase =
-  Password =
+  Password = aiueo
   PidFile =
   Ports = 6667
-  ServerGID = wheel
-  ServerUID = root
+  ServerGID = nobody
+  ServerUID = nobody

 [LIMITS]
   ConnectRetry = 60
@@ -28,10 +28,10 @@
   ChrootDir =
   CloakHost =
   CloakHostModeX =
-  CloakHostSalt = salt_mogemoge
+  CloakHostSalt = salt_fugafuga
   CloakUserToNick = no
   ConnectIPv4 = yes
-  ConnectIPv6 = yes
+  ConnectIPv6 = no
   DNS = yes
   MorePrivacy = no
   NoticeAuth = no
@@ -45,9 +45,9 @@
   WebircPassword =

 [SSL]
-  CertFile =
-  DHFile =
-  KeyFile =
-  KeyFilePassword =
-  Ports =
+  CertFile = /usr/local/etc/ngircd_ssl/server-cert.pem
+  DHFile = /usr/local//etc/ngircd_ssl/dhparams.pem
+  KeyFile = /usr/local/etc/ngircd_ssl/server-key.pem
+  KeyFilePassword = kakikukeko
+  Ports = 6669

設定ファイルのチェックをするオプションがあるので、これを使い設定をチェックする。下記のように表示されれば設定は問題ない。

# ngircd -t
ngIRCd 20.2-IPv6+IRCPLUS+SSL+SYSLOG+TCPWRAP+ZLIB-amd64/portbld/freebsd9.1
Copyright (c)2001-2013 Alexander Barton (<alex@barton.de>) and Contributors.
Homepage: <http://ngircd.barton.de/>

This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Reading configuration from "/usr/local/etc/ngircd.conf" ...
OK, press enter to see a dump of your server configuration ...
# vi /etc/rc.conf
ngircd_enable="YES"

# service ngircd start
]]>
Sun, 01 Sep 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/08/31/freebsd_nginx_virtualhost.html http://d.zinrai.info/blog/html/2013/08/31/freebsd_nginx_virtualhost.html <![CDATA[Nginxでバーチャルホスト]]> Nginxでバーチャルホスト

packages配布サーバ構築」で課題にしていたnginxでのバーチャルホストの設定を行う。

バーチャルホストには

  • IPベース: 1台のサーバに対して複数のドメイン,IPアドレスで運用する。
  • 名前ベース: 1台のサーバに対して複数のドメインを1つのIPアドレスで共用する。

の2種類がある。

今回は「名前ベース」のバーチャルホストを設定する。

dnsmasq

前回構築したDNSサーバに名前を登録する。

# vi /etc/hosts
192.168.0.5 srv.localnet
192.168.0.5 packages.localnet

# service dnsmasq restart

Nginx

nginxのほうも「dnsmasqを使ったDNSサーバ」と同じようにDebian Aapache2風のディレクトリ構成をとる。最低限の設定しか載せていないので、他のパラメータはドキュメントを眺めながら各自で設定して欲しい。

# nginx -v
nginx version: nginx/1.4.2
# cd /usr/local/etc/nginx
# mkdir sites-available sites-enabled

# vi nginx.conf
http {
  include /usr/local/etc/nginx/sites-enabled/*;
}

# vi sites-available/packages.localnet
server {
    listen 80;
    server_name packages.localnet;

    autoindex on;

    location / {
        root   /var/packages;
        index  index.html;
    }
}

# vi sites-avaliable/srv.localnet
server {
    listen       80;
    server_name  srv.localnet;

    location / {
        root   /usr/local/www/nginx;
        index  index.html index.htm;
    }
}

# cd sites-enabled
# ln -s ../sites-available/packages.localnet
# ln -s ../sites-available/srv.localnet

# service nginx start

packages.localnetにアクセスするとpackagesが見え、srv.localnetにアクセスするとnginxのインデックスページが見えれば名前ベースバーチャルホストの設定は完了である。

]]>
Sat, 31 Aug 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/08/30/freebsd_dns_dnsmasq.html http://d.zinrai.info/blog/html/2013/08/30/freebsd_dns_dnsmasq.html <![CDATA[dnsmasqを使ったDNSサーバ]]> dnsmasqを使ったDNSサーバ

packages配布サーバ構築」で課題にしていたDNSサーバ構築を行う。DNSサーバというとBINDやNSDなどが思い浮ぶだろうが、これらを使うのは腰が重い(とくにBIND、またはBIND、あるいはBIND)。

dnsmasqは少しの設定ファイル変更とhosts(5)を書くだけでDNSサーバとして機能する。DHCP,TFTPサーバの機能も持っており、PXE Bootなどに使え非常に勝手がいい。

# zfs clone jails/test01@base jails/dns
# vi /etc/jail.conf
dns {
        $if = 6;
        $ipaddr = 192.168.0.6;
}

dns

dnsmasqのpackagesはbuildboxで作成し、自前のpackages配布サーバを環境変数を設定しておく。

# pkg_add -r dnsmasq
# cd /usr/local/etc
# cp dnsmasq.conf.example dnsmasq.conf

dnsmasq.confはdnsmasq.dディレクトリ下のファイルを読み込む設定だけ有効にしておく。dnsmasq.confは600行くらいろいろ書いてあるので必要な設定項目だけをdnsmasq.dディレクトリ下に書いて管理したほうが設定を見通しやすい。Debian Apache風にavailableディレクトリに設定ファイルを置き、有効にしたい設定だけをenableディレクトリにシンボリックリンクを貼る。これで設定ファイルの切り替えが楽になる。

# cd /usr/local/etc
# mkdir -p dnsmasq.d/dnsmasq-available
# mkdir -p dnsmasq.d/dnsmasq-enabled

# vi dnsmasq.conf
conf-dir=/usr/local/etc/dnsmasq.d/dnsmasq-enabled
# vi dnsmasq.d/dnsmasq-avalilable/dns.conf

# Never forward plain names (without a dot or domain part)
domain-needed

# Never forward addresses in the non-routed address spaces.
bogus-priv

# Add local-only domains here, queries in these domains are answered
# from /etc/hosts or DHCP only.
local=/localnet/

# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
expand-hosts

# Set the domain for dnsmasq. this is optional, but if it is set, it
# does the following things.
# 1) Allows DHCP hosts to have fully qualified domain names, as long
#     as the domain part matches this setting.
# 2) Sets the "domain" DHCP option thereby potentially setting the
#    domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
domain=localnet
# cd dnsmasq.d/dnsmasq-enabled
# ln -s ../dnsmasq-available/dns.conf
# vi /etc/hosts
192.168.0.5 pkgsrv.localnet
# vi /etc/rc.conf
dnsmasq_enable="YES"

# service dnsmasq start

これで自前のpackages配布サーバを名前で引けるようになった。あとはresolv.confにdnsmasqが動いているサーバを指定するだけである。

]]>
Fri, 30 Aug 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/08/29/freebsd_packages_nginx.html http://d.zinrai.info/blog/html/2013/08/29/freebsd_packages_nginx.html <![CDATA[packages配布サーバ構築]]> packages配布サーバ構築

前回はpackagesを作成する環境を構築した。

今回は作成したpackagesを各FreeBSDマシンに配布する環境を構築する。

jails/pkg/packagesにpackagesが作られているので配布サーバ用jailにリードオンリーでマウントしてWebサーバ(nginx)を動かすだけの簡単なお仕事である。

# zfs clone jails/test01@base jails/pkgsrv
# mkdir /jails/pkgsrv/var/packages
# vi /etc/jail.conf
test02 {
        $if = 2;
        $ipaddr = 192.168.0.2;
}

pkgsrv {
        exec.prestart += "mount -t nullfs -o ro /jails/pkg/packages /jails/${name}/var/packages";
        exec.poststop += "umount /jails/${name}/var/packages";
        $if = 5;
        $ipaddr = 192.168.0.5;
}

pkgsrv

pkgsrvにpackagesのnginxをインストールするためbuildboxでnginxをビルドしておく。

# cd /var/packages/Latest
# pkg_add nginx

# cd /usr/local/nginx
# cp nginx.conf nginx.conf.bak

# mkdir /var/tmp/nginx
# touch /var/tmp/nginx/client_body_temp

serverブロックに以下のように書いていればとりあえず目的は達成できる。

# vi /usr/local/nginx/nginx.conf
server {
        autoindex on;

        location / {
            root   /var/packages;
            index  index.html index.htm;
            allow 192.168.0.0/24;
            deny all;
        }
}
# nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

# service nginx onestart

test02

pkg_add(1)は環境変数を設定することで取得するpackagesのサーバを指定できる。環境変数の設定方法は調べればいくらでも引っ掛かるのでcshでの設定のみ書いておく。

# vi .cshrc
setenv PACKAGEROOT http://192.168.0.5/
setenv PACKAGESITE http://192.168.0.5/Latest/

# source .cshrc
# pkg_add -r wget

packages配布サーバの構築は無事に完了した。ただ、IP直打ちだと配布サーバのIPを変更したとき環境変数を書き換えなければならず面倒だし、nginxを配布サーバ以外のことにも使いたい。

というわけで

  • DNSサーバの構築
  • nginx バーチャルホストの設定

を課題としておく。

]]>
Thu, 29 Aug 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/08/28/freebsd_jail_ports_packages.html http://d.zinrai.info/blog/html/2013/08/28/freebsd_jail_ports_packages.html <![CDATA[portsのパッケージをビルドする環境を構築する]]> portsのパッケージをビルドする環境を構築する

FreeBSDを複数台動かす場合、パッケージをどのような手段でインストールするか考えることになると思う。

FreeBSDでのパッケージのインストールは

  • ports: ソースコードをコンパイルしてインストール
  • packages: コンパイル済みのバイナリをインストール

の2種類が用意されている。

それぞれのFreeBSDにあるportsからパッケージをインストールするのは面倒だし、コンパイルオプションの指定ミスなどが発生したとき原因調査に時間を取られて泣きをみることは間違いない。

というわけでpackagesを使いFreeBSDマシンにパッケージをインストールする。packagesはFreeBSDから提供されているが、portsからも作成できる。portsからだとコンパイルオプションを自分の好きなようにカスタマイズしたpackagesを作ることが出来る。ただし、portsからpackagesを作成するにはパッケージをインストールしなければならない。

FreeBSDでは自前のpackagesを作成するツールとして「Tinderbox」が存在する。「Tinderbox」は様々なユーザーランド,portsを組み合わせビルド環境を作り、packagesを作成してくれる。WebUIも供えておりpackagesにしたいパッケージを登録すれば勝手にビルドしていく。4.0.0からDBにSQLiteが使えるようになり導入のハードルがグッと下っているので気になったら触ってみて欲しい。

今回は「Tinderbox」は使わず、「Tinderbox」の動きを真似たビルド環境を自分で構築することにした。下記の記事のような環境がすでに出来ているものとする。

# zfs create jails/pkg
# zfs create jails/buildbox

# cd /usr/src/9.1.0
# make buildworld
# make installworld DESTDIR=/jails/buildbox
# make distribution DESTDIR=/jails/buildbox
# mkdir /jails/buildbox/usr/ports
# mkdir /jails/buildbox/var/ports
# cd /jails/pkg
# mkdir distfiles packages coptions
# vi /jails/buildbox//etc/resolv.conf
nameserver 8.8.8.8
# vi /jails/buildbox/etc/make.conf
WRKDIRPREFIX = /var/ports/
DISTDIR = /var/ports/distfiles/
PACKAGES = /var/ports/packages/
PORT_DBDIR = /var/ports/coptions/
# vi /etc/jail.conf
buildbox {
        exec.prestart += "mount -t nullfs /jails/pkg /jails/${name}/var/ports";
        exec.poststop += "umount /jails/${name}/var/ports";
        $if = 4;
        $ipaddr = 192.168.0.4;
}
# zfs snapshot jails/pkg@base
# zfs snapshot jails/buildbox@base
# jail -c buildbox

書いてある設定でピンときたでしょうが、ビルド作業用ディレクトリを別にマウントしてbuildboxのほうはzfs rollbackでいつでも初期状態に戻せるようにしているだけである。

あとはjail環境で

# cd /usr/ports/ftp/wget
# make config-recursive
# make install
# make package-recursive

すれば/jails/pkg/packagesにpackagesが作られる。

packagesをどう配布するかは次の機会に。(調べればすぐに見付かるけど...)

]]>
Wed, 28 Aug 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/08/23/freebsd_jail_nullfs_ports.html http://d.zinrai.info/blog/html/2013/08/23/freebsd_jail_nullfs_ports.html <![CDATA[nullfsを使いjailのportsを共有する]]> nullfsを使いjailのportsを共有する

jailを複数動かしているとports(Ports Collection)をどのように取り扱うかという壁にブチ当たると思う。jailごとにportsnap fetchしているとportsnapサーバに負荷がかかるし、管理が面倒くさい。ということでjailのportsは共有し、ホストからしかfetch,updateなどが出来ないようにしてみた。

前回からの続きということで。

# cd 9.1.0/sys/amd64/conf
# cp VIMAGE NULLFS

# vi VIMAGE
options         NULLFS

# cd /usr/src/9.1.0
# make buildkernel KERNCONF=NULLFS
# make installkernel KERNCONF=NULLFS
# reboot
# zfs create jails/ports
# portsnap -p /jails/ports fetch
# portsnap -p /jails/ports extract
# portsnap -p /jails/ports update

設定があちこちに散らばると管理が面倒なのでnullfsのマウントはホストのfstabではなくjail.conf(5)に書く。

# vi /etc/jail.conf

exec.prestart  = "ifconfig epair${if} create up > /dev/null";
exec.prestart += "ifconfig vswitch0 addm epair${if}a";
exec.prestart += "mount -t nullfs -o ro /jails/ports /jails/${name}/usr/ports";
exec.start     = "ifconfig lo0 up 127.0.0.1";
exec.start    += "ifconfig epair${if}b up $ipaddr";
exec.start    += "route add default 192.168.0.254";
exec.start    += "sh /etc/rc";
exec.stop      = "sh /etc/rc.shutdown";
exec.poststop  = "ifconfig epair${if}a destroy";
exec.poststop += "umount /jails/${name}/usr/ports";
host.hostname = "${name}.localnet";
mount.devfs;
devfs_ruleset = 5;
vnet;
vnet.interface = "epair${if}b";
path = "/jails/${name}";
persist;

test01 {
        $if = 1;
        $ipaddr = 192.168.0.1;
}

test02 {
        $if = 2;
        $ipaddr = 192.168.0.2;
}

portsをリードオンリーでマウントしているのでビルド時の作業用ディレクトリが作成できない。そのためjail環境のmake.conf(5)に作業ディレクトリの指定、ディレクトリを作成する必要がある。設定した環境変数の説明はports(5)に書いてある。

# vi /jails/test01/etc/make.conf

WRKDIRPREFIX = /var/ports/
DISTDIR = /var/ports/distfiles/
PACKAGES = /var/ports/packages/

# mkdir -p /jails/test01/var/ports/distfiles
# mkdir -p /jails/test01/var/ports/packages
]]>
Fri, 23 Aug 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/08/22/freebsd_jail_vimage_zfs.html http://d.zinrai.info/blog/html/2013/08/22/freebsd_jail_vimage_zfs.html <![CDATA[FreeBSD 9.1 VIMAGE + ZFS で Jail環境構築]]> FreeBSD 9.1 VIMAGE + ZFS で Jail環境構築

VIMAGE + ZFSでいくらでも作ったり、壊したり、巻き戻したり出来る環境を構築してみる。jail環境をビルドするためにソースを取ってくる。ソースはsubversionで管理されている。まずsubversionをインストールから。

# portsnap fetch
# portsnap extract
# portsnap update

# cd /usr/ports/devel/subversion
# make install

VIMAGEが使えるようにカーネルを再構築する。

# cd /usr/src
# svn checkout svn://svn.freebsd.org/base/release/9.1.0
# cd 9.1.0/sys/amd64/conf
# cp GENERIC VIMAGE

# vi VIMAGE
options         VIMAGE

# cd /usr/src/9.1.0
# make buildkernel KERNCONF=VIMAGE
# make installkernel KERNCONF=VIMAGE
# reboot
# cd /usr/src/9.1.0
# make buildworld
# make installworld DESTDIR=/jails/test01
# make distribution DESTDIR=/jails/test01
# zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
jails   356G   900M   355G     0%  1.00x  ONLINE  -

# zfs create jails/test01
# zfs snapshot jails/test01@base
# zfs clone jails/test01@base jails/test02
# vi /etc/rc.conf

ifconfig_re0=" inet 192.168.0.253 netmask 255.255.255.0"
defaultrouter="192.168.0.254"

cloned_interfaces="bridge0"
ifconfig_bridge0_name="vswitch0"
ifconfig_vswitch0="addm re0"

netstatしたときなどに/dev/kmem,/dev/memがないよと言われるので、/etc/default/devfs.rulesを参考に、devfs.rules(5)のルールを追加しておく。

# vi /etc/devfs.rules

[devfsrules_jail=5]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path zfs unhide
add path mem unhide
add path kmem unhide

jailの設定はrc.conf(5)ではなくjail.conf(5)に書く。jail(8)を眺めながら設定ファイルを書いてみた。変数が使えていい感じ。ネームサーバーを設定するパラメータが見当らないので、ネームサーバーの設定はjail内のresolv.confに書くことにする。

# vi /etc/jail.conf

exec.prestart  = "ifconfig epair${if} create up > /dev/null";
exec.prestart += "ifconfig vswitch0 addm epair${if}a";
exec.start     = "ifconfig lo0 up 127.0.0.1";
exec.start    += "ifconfig epair${if}b up $ipaddr";
exec.start    += "route add default 192.168.0.254";
exec.start    += "sh /etc/rc";
exec.stop      = "sh /etc/rc.shutdown";
exec.poststop  = "ifconfig epair${if}a destroy";
host.hostname  = "${name}.localnet";
mount.devfs;
devfs_ruleset = 5;
vnet;
vnet.interface = "epair${if}b";
path = "/jails/${name}";
persist;

test01 {
        $if = 1;
        $ipaddr = 192.168.0.1;
}

test02 {
        $if = 2;
        $ipaddr = 192.168.0.2;
}
# jail -c test01
# jls
   JID  IP Address      Hostname                      Path
    11  -               test01.localnet               /jails/test01

# jexec 11 tcsh
# jail -r test01

FreeBSD起動時にjailを起動させたければrc.conf(5)下記のように書いておく。

# vi /etc/rc.conf

jail_enable="YES"
jail_list="test01 test02"

ZFSのスナップショット、ロールバックで何度でもやり直せる。

# zfs snapshot jails/test01@snap01
# zfs rollback jails/test01@snap01
# zfs set quota=10g jails/test01
# zfs clone jails/test01@snap01 jails/test03
]]>
Thu, 22 Aug 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/07/20/freebsd_pxeboot.html http://d.zinrai.info/blog/html/2013/07/20/freebsd_pxeboot.html <![CDATA[シェルスクリプトでFreeBSD 9.1のインストール自動化]]> シェルスクリプトでFreeBSD 9.1のインストール自動化

OSインストールをするだけでお金が貰えるならば喜んでやるが、趣味の時間をOSインストールに奪われるのはつらいので、自動化してみた。

PXE boot サーバ構築

# mdconfig -a -t vnode -f FreeBSD-9.1-RELEASE-amd64-disc1.iso
md0
# mount_cd9660 /dev/md0 /mnt
# mkdir /var/pxeboot
# cp -Rv /mnt/ /var/pxeboot
# umount /mnt
# mdconfig -d -u 0
# vi /var/pxeboot/etc/fstab
# /dev/iso9660/FREEBSD_INSTALL / cd9660 ro 0 0 <- コメントアウト
# vi /etc/inetd.conf
tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /var/pxeboot/boot

# /etc/rc.d/inetd onestart
# cd /usr/ports/net/isc-dhcp42-server
# make install

# vi /usr/local/etc/dhcpd.conf
ddns-update-style none;
server-name "pxeboot";            # name of the tftp-server
server-identifier 192.168.0.253;  # address of the tftp-server
next-server 192.168.0.253;        # address of the NFS-server

subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.220 192.168.0.250;
    option routers 192.168.0.254;
    option root-path "/var/pxeboot"; # root-path for NFS
    filename "pxeboot";              # filename of NBP (network bootstrap program)
}

# /usr/local/etc/rc.d/isc-dhcpd onestart
# vi /etc/exports
/var/pxeboot -alldirs -maproot=root

# /etc/rc.d/nfsd onestart

再起動後もデーモンを起動させておきたければrc.confに書いておく。

# vi /etc/rc.conf
inetd_enable="YES"
dhcpd_enable="YES"
dhcpd_ifaces="em0"
nfs_server_enable="YES"

FreeBSDインストールスクリプト

PXE BootしたマシンのMACアドレスが書かれたシェルスクリプトを探し、実行するようになっている。

# mkdir /var/scripts/freebsd91
# cd /usr/freebsd-dist
# cp *.txz /var/scripts/freebsd91
# vi /var/pxeboot/var/scripts/os_install.sh
#!/bin/sh

get_conf() {
  if [ "$OS" = "FreeBSD" ]; then
    local MACADDR="`ifconfig | awk '/ether/ {print $NF}'`"
  elif [ "$OS" = "Linux" ]; then
    local MACADDR="`ifconfig | awk '/HWaddr/ {print $NF}'`"
  fi

  for a in $MACADDR; do
    grep -r $MACADDR ${CWD}/*.conf | awk -F: '{print $1}'
  done
}

CWD=`dirname $0`

OS=`uname`
CONFFILE=`get_conf`

if [ -z "$CONFFILE" ]; then
  printf 'Script Not Found\n'
  exit 1
fi

if [ "$OS" = "FreeBSD" ]; then
  IFACE=`netstat -nr | awk '{if($1 ~ /^default$/) print $6}'`
  MOUNTNAME=`sha256 -q $CONFFILE`
elif [ "$OS" = "Linux" ]; then
  IFACE=`netstat -nr | awk '{if($4 ~ /^UG$/) print $8}'`
  MOUNTNAME=`sha256sum $CONFFILE | awk '{print $1}'`
fi

$CONFFILE $IFACE $CWD $MOUNTNAME
# vi /var/pxeboot/var/scripts/freebsd_install.conf
#!/bin/sh

# 01:23:45:67:89:ab

DISK=ada0
IFACE=$1
CWD=$2
CHROOT_FREEBSD="/mnt/$3"
DIST_TXZ=`ls ${CWD}/freebsd91/*.txz`

gpart destroy -F $DISK
gpart create -s gpt $DISK
gpart add -s 64K -t freebsd-boot $DISK
gpart add -s 8G -t freebsd-swap -l swap0 $DISK
gpart add -t freebsd-ufs $DISK
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 $DISK

newfs -U /dev/${DISK}p3

mkdir $CHROOT_FREEBSD

mount /dev/${DISK}p3 $CHROOT_FREEBSD

cd $CHROOT_FREEBSD

for FILE in $DIST_TXZ; do
  tar xfzp $FILE
done

cat << EOF > ${CHROOT_FREEBSD}/etc/rc.conf
hostname="freebsd.local"
keymap="us.iso.kbd"
ifconfig_${IFACE}=" inet 192.168.0.252 netmask 255.255.255.0"
defaultrouter="192.168.0.254"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
EOF

cat << EOF > ${CHROOT_FREEBSD}/etc/resolv.conf
nameserver 8.8.8.8
EOF

cat << EOF > ${CHROOT_FREEBSD}/etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/${DISK}p3     /               ufs     rw      1       1
/dev/${DISK}p2     none            swap    sw      0       0
EOF

cat << EOF > ${CHROOT_FREEBSD}/tmp/freebsd_setup.sh
newaliases
touch /etc/wall_cmos_clock
tzsetup Asia/Tokyo

dumpon /dev/${DISK}p2
ln -sf /dev/${DISK}p2 /dev/dumpdev
EOF

cat << 'EOF' > ${CHROOT_FREEBSD}/tmp/user_acount.sh
printf "$6$oHUVG9WPkdiCoxCP$XsnO5TmowzdGWNkZHv9pPUmFqgsEojkfzUa1OQj2zUOWAChL5cdGkm.dhseF0z5Tz30IEDrxNzOcsflPUgHDs." | pw usermod -n root -H 0

pw useradd -n nanashi -s /bin/tcsh -G wheel -m
printf "$6$wAeDl/exZFEDC0Sl$UdvTamL.94EcWFcGIAYJSgsvzaFxSd.ZLRMkD.KI27L6jxUGsWqOdEJs6if0rTG/XuEfQ9TNzHbjI99YfxPLD1" | pw usermod -n nanashi -H 0
EOF

mount -t devfs dev ${CHROOT_FREEBSD}/dev

chroot $CHROOT_FREEBSD /bin/sh /tmp/freebsd_setup.sh
chroot $CHROOT_FREEBSD /bin/sh /tmp/user_acount.sh

rm ${CHROOT_FREEBSD}/tmp/freebsd_setup.sh
rm ${CHROOT_FREEBSD}/tmp/user_acount.sh

cd /
umount ${CHROOT_FREEBSD}/dev
umount $CHROOT_FREEBSD

rmdir $CHROOT_FREEBSD
reboot

PXE boot時に指定のスクリプトを実行するようにrc.localに書いておく。

# vi /var/pxeboot/etc/rc.local

#!/bin/sh
# $FreeBSD: release/9.1.0/release/rc.local 232427 2012-03-03 02:13:53Z nwhitehorn $

/var/script/os_install.sh
]]>
Sat, 20 Jul 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/06/22/centos_cobbler_puppet_install.html http://d.zinrai.info/blog/html/2013/06/22/centos_cobbler_puppet_install.html <![CDATA[Cobbler + Puppet]]> Cobbler + Puppet

前回はCobblerでとりあえずOSインストールが出来るところまでやったので、今回はkickstartファイルの編集、Puppet(Puppet client)のインストールとセットアップを自動化してみる。

dnsmasq

DHCP,DNSサーバにdnsmasqを使用する。ISC DHCPよりもdnsmasqを使ったほうがPuppetと連携させやすいことに気が付いた。

# vi /etc/cobbler/settings

manage_dns: 1
manage_dhcp: 1
server: 192.168.0.1
next_server: 192.168.0.254 <- Gateway
# vi /etc/cobbler/modules.conf

[dns]
module = manage_dnsmasq

[dhcp]
module = manage_dnsmasq
# yum install dnsmasq
# vi /etc/cobbler/dnsmasq.template

# Cobbler generated configuration file for dnsmasq
# $date
#

# resolve.conf .. ?
#no-poll
#enable-dbus
read-ethers
addn-hosts = /var/lib/cobbler/cobbler_hosts

dhcp-range=192.168.0.220,192.168.0.250
dhcp-option=3,$next_server
dhcp-lease-max=1000
dhcp-authoritative
dhcp-boot=pxelinux.0
dhcp-boot=net:normalarch,pxelinux.0
dhcp-boot=net:ia64,$elilo

$insert_cobbler_system_definitions
# vi /etc/hosts
192.168.0.1 cobbler.localnet
# chkconfig dnsmasq on
# service dnsmasq start
# service cobblerd restart
# cobbler sync

Cobbler

# cobbler profile report
Name                           : CentOS6.4-x86_64
TFTP Boot Files                : {}
Comment                        :
DHCP Tag                       : default
Distribution                   : CentOS6.4-x86_64
Enable gPXE?                   : 0
Enable PXE Menu?               : 1
Fetchable Files                : {}
Kernel Options                 : {}
Kernel Options (Post Install)  : {}
Kickstart                      : /var/lib/cobbler/kickstarts/sample.ks
Kickstart Metadata             : {}
Management Classes             : []
Management Parameters          : <<inherit>>
Name Servers                   : []
Name Servers Search Path       : []
Owners                         : ['admin']
Parent Profile                 :
Proxy                          :
Red Hat Management Key         : <<inherit>>
Red Hat Management Server      : <<inherit>>
Repos                          : []
Server Override                : <<inherit>>
Template Files                 : {}
Virt Auto Boot                 : 1
Virt Bridge                    : xenbr0
Virt CPUs                      : 1
Virt Disk Driver Type          : raw
Virt File Size(GB)             : 5
Virt Path                      :
Virt RAM (MB)                  : 512
Virt Type                      : qemu

登録しているprofileからPuppet Server,Puppet Clientのprofileを作成する。

# cobbler profile copy --name=CentOS6.4-x86_64 --newname=CentOS6.4-puppet_server
# cobbler profile copy --name=CentOS6.4-x86_64 --newname=CentOS6.4-puppet_client

EPELにあるPuppetを使用する。

# yum -y install wget

# cobbler repo add --name=CentOS6.4-epel --mirror=http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64 --mirror-locally=no
# cobbler reposync
# mkdir /var/www/cobbler/repo_mirror/CentOS6.4-epel/.origin
# cobbler reposync

# cobbler repo report
Name                           : CentOS6.4-epel
Arch                           : x86_64
Breed                          : yum
Comment                        :
Createrepo Flags               : <<inherit>>
Environment Variables          : {}
Keep Updated                   : True
Mirror                         : http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64
Mirror locally                 : False
Owners                         : ['admin']
Priority                       : 99
RPM List                       : []
Yum Options                    : {}

profileにリポジトリの情報を追加

# cobbler profile edit --name=CentOS6.4-puppet_server --repos="CentOS6.4-epel"
# cobbler profile edit --name=CentOS6.4-puppet_client --repos="CentOS6.4-epel"

profileをコピーしたままの状態ではsample.ksファイルが読み込まれるので、ksファイルをコピーしてPuppetをインストールするよう書き換える。

# cd /var/lib/cobbler/kickstarts
# cp sample.ks puppet_server.ks
# cp sample.ks puppet_client.ks

# cobbler profile edit --name=CentOS6.4-puppet_server --kickstart=/var/lib/cobbler/kickstarts/puppet_server.ks
# cobbler profile edit --name=CentOS6.4-puppet_client --kickstart=/var/lib/cobbler/kickstarts/puppet_client.ks

固定IPを割り振るためにsystemに登録する。

# vi /etc/cobbler/settings
pxe_just_once: 1

# service cobblerd restart
# cobbler system add  \
--name=puppet-server-2 \
--hostname=puppetserver.localnet \
--dns-name=puppetserver.localnet \
--profile=CentOS6.4-puppet_server \
--interface=eth0 \
--mac=XX:XX:XX:XX:XX:XX \
--static=1 \
--ip-address=192.168.0.2 \
--subnet=255.255.255.0 \
--gateway=192.168.0.254 \
--name-servers=192.168.0.1

# cobbler system add  \
--name=puppet-client-003 \
--hostname=puppetclient003.localnet \
--dns-name=puppetclient003.localnet \
--profile=CentOS6.4-puppet_client \
--interface=eth0 \
--mac=XX:XX:XX:XX:XX:XX \
--static=1 \
--ip-address=192.168.0.3 \
--subnet=255.255.255.0 \
--gateway=192.168.0.254 \
--name-servers=192.168.0.1

pxe_just_onceを有効にすると登録したsystemは1度しかpxe bootしないので、OSインストール後に、もう1度pxe bootさせたくなったら下記を実行する。

# cobbler system edit --name=puppet-client-003 --netboot-enabled=1

Puppet

PuppetにはPUSHモードとPULLモードがある。

PULL クライアントからサーバへ定期的にマニュフェストを取得し適用する。
PUSH サーバからクライアントへマニュフェストを取得し適用するよう指示する。

今回はPUSHモードのPuppet環境を構築する。

Puppet server

Puppet clientを自動構築するためにPuppet serverを作り込む。

Puppet serverのほうはOSインストール後にPuppet serverをインストールするなり、Cobblerサーバのkickstartファイルのpackageセクションに記述するなり好きにすればいいと思う。

# puppet --version
2.6.18
# vi /etc/sysconfig/puppet

# The puppetmaster server
#PUPPET_SERVER=puppet

# If you wish to specify the port to connect to do so here
PUPPET_PORT=8139

# Where to log to. Specify syslog to send log messages to the system log.
PUPPET_LOG=/var/log/puppet/puppet.log

# You may specify other parameters to the puppet client here
#PUPPET_EXTRA_OPTS=--waitforcert=500
# vi /etc/puppet/autosign.conf

*.localnet
# vi /etc/puppet/fileserver.conf

[files]
 path /etc/puppet/manifests/files
 allow *
# vi /etc/puppet/manifests/site.pp

package { 'zsh' :
        ensure => present;
}

file { '/etc/sysconfig/puppet' :
        owner => 'root',
        group => 'root',
        mode => 644,
        source => 'puppet://puppetserver.localnet/files/puppet',
}

file { '/etc/puppet/auth.conf' :
        owner => 'root',
        group => 'root',
        mode => 644,
        source => 'puppet://puppetserver.localnet/files/auth.conf',
}
# vi /etc/puppet/manifests/files/puppet

# The puppetmaster server
PUPPET_SERVER=puppetsrv.localnet

# If you wish to specify the port to connect to do so here
#PUPPET_PORT=8140

# Where to log to. Specify syslog to send log messages to the system log.
PUPPET_LOG=/var/log/puppet/puppet.log

# You may specify other parameters to the puppet client here
#PUPPET_EXTRA_OPTS=--waitforcert=500
PUPPET_EXTRA_OPTS="--listen --no-client"
# vi /etc/puppet/manifests/files/auth.conf

path /run
method save
allow *

path /
auth any
# service puppetmaster start

これで以下のコマンドを実行すればPuppet clientにマニュフェストが適用される。

# puppet kick --host puppetclient002.localnet

Kickstart

Puppet client用のkickstartファイルは下記のようになっている。

postセクションに

/sbin/chkconfig puppet on
puppet agent --server=puppetserver.localnet --no-daemonize --onetime

を記述することで、Puppetの自動起動、Puppet serverからマニュフェストを取得する処理が1度だけ実行される。これでPuppet clientはOSインストールからPuppetインストール,セットアップまで自動化することが出来た。しかし、今回の設定では各clientの細かい制御(client1にはapache,client2にはmysqlなど)が出来ていないのでそれについては、またの機会に書きたいと思う。

# vi /var/lib/cobbler/kickstarts/puppet_client.ks

#platform=x86, AMD64, or Intel EM64T
# System authorization information
auth  --useshadow  --enablemd5
# System bootloader configuration
bootloader --location=mbr
# Partition clearing information
clearpart --all --initlabel
# Use text mode install
text
# Firewall configuration
#firewall --enabled
firewall --disabled
# Run the Setup Agent on first boot
firstboot --disable
# Timezone
timezone Asia/Tokyo
# System keyboard
keyboard us
# System language
lang en_US
# Use network installation
url --url=$tree
# If any cobbler repo definitions were referenced in the kickstart profile, include them here.
$yum_repo_stanza
# Network information
$SNIPPET('network_config')
# Reboot after installation
reboot

#Root password
rootpw --iscrypted $default_password_crypted
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# System timezone
timezone  America/New_York
# Install OS instead of upgrade
install
# Clear the Master Boot Record
zerombr
# Allow anaconda to partition the system as needed
autopart


%pre
$SNIPPET('log_ks_pre')
$SNIPPET('kickstart_start')
$SNIPPET('pre_install_network_config')
# Enable installation monitoring
$SNIPPET('pre_anamon')

%packages
$SNIPPET('func_install_if_enabled')
$SNIPPET('puppet_install_if_enabled')
puppet

%post
$SNIPPET('log_ks_post')
# Start yum configuration
$yum_config_stanza
# End yum configuration
$SNIPPET('post_install_kernel_options')
$SNIPPET('post_install_network_config')
$SNIPPET('func_register_if_enabled')
$SNIPPET('puppet_register_if_enabled')
$SNIPPET('download_config_files')
$SNIPPET('koan_environment')
$SNIPPET('redhat_register')
$SNIPPET('cobbler_register')
/sbin/chkconfig puppet on
puppet agent --server=puppetserver.localnet --no-daemonize --onetime
# Enable post-install boot notification
$SNIPPET('post_anamon')
# Start final steps
$SNIPPET('kickstart_done')
# End final steps
]]>
Sat, 22 Jun 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/06/18/centos_cobbler_setup.html http://d.zinrai.info/blog/html/2013/06/18/centos_cobbler_setup.html <![CDATA[CentOS6.4にCobblerサーバ構築]]> CentOS6.4にCobblerサーバ構築

サーバ100台くらいにOSインストールする作業が発生するかもしれないので怠けるための作業をメモしておく。まずはCobblerサーバを構築してOSインストールが出来るまで。

# uname -a
Linux localhost.localdomain 2.6.32-358.11.1.el6.x86_64 #1 SMP Wed Jun 12 03:34:52 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/centos-release
CentOS release 6.4 (Final)

SELinuxを無効にしないとCobblerが動作しない。

下記のファイルを編集して再起動

# vi /etc/selinux/config
SELINUX=disabled

# chkconfig xinetd on
# chkconfig httpd on
# chkconfig cobblerd on
# chkconfig dhcpd on
# reboot
# rpm -i http://mirror.symnds.com/distributions/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum -y install cobbler pykickstart dhcp

# cobbler --version
Cobbler 2.2.3
  source: ?, ?
  build time: Mon Jun 18 01:04:49 2012

# cobbler check
The following are potential configuration items that you may want to fix:

1 : The 'server' field in /etc/cobbler/settings must be set to something other than localhost, or kickstarting features will not work.  This should be a resolvable hostname or IP for the boot server as reachable by all machines that will use it.
2 : For PXE to be functional, the 'next_server' field in /etc/cobbler/settings must be set to something other than 127.0.0.1, and should match the IP of the boot server on the PXE network.
3 : some network boot-loaders are missing from /var/lib/cobbler/loaders, you may run 'cobbler get-loaders' to download them, or, if you only want to handle x86/x86_64 netbooting, you may ensure that you have installed a *recent* version of the syslinux package installed and can ignore this message entirely.  Files in this directory, should you want to support all architectures, should include pxelinux.0, menu.c32, elilo.efi, and yaboot. The 'cobbler get-loaders' command is the easiest way to resolve these requirements.
4 : change 'disable' to 'no' in /etc/xinetd.d/rsync
5 : since iptables may be running, ensure 69, 80/443, and 25151 are unblocked
6 : debmirror package is not installed, it will be required to manage debian deployments and repositories
7 : The default password used by the sample templates for newly installed machines (default_password_crypted in /etc/cobbler/settings) is still set to 'cobbler' and should be changed, try: "openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'" to generate new one
8 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them

Restart cobblerd and then run 'cobbler sync' to apply changes.

# /etc/init.d/cobblerd start

# vi /etc/xinetd.d/rsync
disable = no

# vi /etc/xinetd.d/tftp
disable = no

# vi /etc/cobbler/settings
server: 192.168.0.1
manage_dhcp: 1
next_server: 192.168.0.254 <- Gateway

# vi /etc/cobbler/dhcp.template
subnet 192.168.0.0 netmask 255.255.255.0 {
     option routers             192.168.0.254;
     option domain-name-servers 8.8.8.8;
     option subnet-mask         255.255.255.0;
     range dynamic-bootp        192.168.0.200 192.168.0.250;
     filename                   "/pxelinux.0";
     default-lease-time         21600;
     max-lease-time             43200;
     next-server                $next_server;
}

# /etc/init.d/iptables stop
# /etc/init.d/xinetd restart
# /etc/init.d/cobblerd restart

# cobbler get-loaders
# cobbler sync

# cobbler import --path=rsync://ftp.jaist.ac.jp/pub/Linux/CentOS/6.4/os/x86_64/ --name=CentOS6.4_x86_64
# cobbler sync

Cobblerを使いインストールするとデフォルトのパスワードはcobblerとなっている。

変更する場合は

# cobbler check
The following are potential configuration items that you may want to fix:

1 : debmirror package is not installed, it will be required to manage debian deployments and repositories
2 : The default password used by the sample templates for newly installed machines (default_password_crypted in /etc/cobbler/settings) is still set to 'cobbler' and should be changed, try: "openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'" to generate new one
3 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them

Restart cobblerd and then run 'cobbler sync' to apply changes.

に書いてあるように

# openssl passwd -1 -salt "cobbler" "password"
$1$cobbler$UTIGTKoLfLdeMAPNxROQZ1

を実行して

# vi /etc/cobbler/settings
default_password_crypted: "$1$cobbler$UTIGTKoLfLdeMAPNxROQZ1"

設定ファイルを書き換えてCobblerを再起動

# /etc/init.d/cobblerd restart
]]>
Tue, 18 Jun 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/06/08/ubuntu_mongodb_rails3_setup.html http://d.zinrai.info/blog/html/2013/06/08/ubuntu_mongodb_rails3_setup.html <![CDATA[Rails3でMongoDBを使ってみる]]> Rails3でMongoDBを使ってみる
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.2 LTS
Release:        12.04
Codename:       precise

$ uname -a
Linux ubuntu1204-64-base 3.2.0-45-generic #70-Ubuntu SMP Wed May 29 20:12:06 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ rails -v
Rails 3.2.12

$ rails new mongodb_app --skip-active-record

$ cd mongodb_app

$ vi Gemfile
gem 'mongoid'
gem 'bson_ext'

$ bundle install --path vendor/bundle --binstubs

$ bin/rails g mongoid:config
  create  config/mongoid.yml

$ bin/rails g scaffold Post title:string subscription:text

$ cat app/models/post.rb
class Post
  include Mongoid::Document
  field :title, type: String
  field :subscription, type: String
end

$ mongo
> show dbs
mongodb_app_development 0.203125GB
> use mongodb_app_development
> show collections
posts
> db.posts.find()
{ "_id" : ObjectId("51b1ea5da64aef614e000001"), "title" : "sample", "subscription" : "text" }
{ "_id" : ObjectId("51b2afb0a64aef0c3f000001"), "title" : "hogehoge", "subscription" : "fugafuga" }
]]>
Sat, 08 Jun 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/06/05/debian_wheezy_nested_kvm.html http://d.zinrai.info/blog/html/2013/06/05/debian_wheezy_nested_kvm.html <![CDATA[Debian wheezyでNested KVMを試してみる]]> Debian wheezyでNested KVMを試してみる

ganetiのbetaを触るのに実機を2,3台用意しないといけないことから開放されそう。

KVM インストール

# apt-get install install qemu-kvm libvirt-bin virtinst bridge-utils

Nested KVM

Nested KVMを有効にするための設定を行う。

# modinfo kvm_intel
filename:       /lib/modules/3.2.0-4-amd64/kernel/arch/x86/kvm/kvm-intel.ko
license:        GPL
author:         Qumranet
depends:        kvm
intree:         Y
vermagic:       3.2.0-4-amd64 SMP mod_unload modversions
parm:           vpid:bool
parm:           flexpriority:bool
parm:           ept:bool
parm:           unrestricted_guest:bool
parm:           emulate_invalid_guest_state:bool
parm:           vmm_exclusive:bool
parm:           yield_on_hlt:bool
parm:           fasteoi:bool
parm:           nested:bool
parm:           ple_gap:int
parm:           ple_window:int

# cat /sys/module/kvm_intel/parameters/nested
N

# vi /etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1

# modprobe -r kvm_intel
# modprobe kvm_intel

# cat /sys/module/kvm_intel/parameters/nested
Y

仮想マシンの作成

#!/bin/bash

VM_NAME=$1
MEM=$2
SIZE=$3
IFACE=$4
OS=$5

DISKIMAGE="/var/lib/libvirt/images/$VM_NAME"

if [ "$OS" = "centos" ]; then
  # CentOS 6.4 amd64
  DIST='http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.4/os/x86_64/'
elif [ "$OS" = "precise" ]; then
  # Ubuntu 12.04 amd64
  DIST='http://ftp.riken.jp/Linux/ubuntu/dists/precise/main/installer-amd64/'
elif [ "$OS" = "squeeze" ]; then
  # Debian Squeeze amd64
  DIST='http://ftp.jp.debian.org/debian/dists/squeeze/main/installer-amd64/'
elif [ "$OS" = "wheezy" ]; then
  # Debian Wheezy amd64
  DIST='http://ftp.jp.debian.org/debian/dists/wheezy/main/installer-amd64/'
fi

virt-install --hvm --accelerate --nographics \
  --name $VM_NAME \
  --network bridge=$IFACE,model=virtio \
  --ram $MEM \
  --vcpus 1 \
  --cpu core2duo \
  --os-type linux \
  --location $DIST \
  --disk path=$DISKIMAGE.qcow2,format=qcow2,size=$SIZE,bus=virtio,cache=writethrough \
  --extra-args='console=tty0 console=ttyS0,115200n8'
# vm-install.sh debian7_vm 1500 100 br1 wheezy

ゲストOSでの仮想マシン作成

ゲストOSでKVMのインストールと仮想マシンの作成を行う。

スクリプトは–cpuオプションを取っただけであとは同じ。

# apt-get install install qemu-kvm libvirt-bin virtinst bridge-utils
#!/bin/bash

VM_NAME=$1
MEM=$2
SIZE=$3
IFACE=$4
OS=$5

DISKIMAGE="/var/lib/libvirt/images/$VM_NAME"

if [ "$OS" = "centos" ]; then
  # CentOS 6.4 amd64
  DIST='http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.4/os/x86_64/'
elif [ "$OS" = "precise" ]; then
  # Ubuntu 12.04 amd64
  DIST='http://ftp.riken.jp/Linux/ubuntu/dists/precise/main/installer-amd64/'
elif [ "$OS" = "squeeze" ]; then
  # Debian Squeeze amd64
  DIST='http://ftp.jp.debian.org/debian/dists/squeeze/main/installer-amd64/'
elif [ "$OS" = "wheezy" ]; then
  # Debian Wheezy amd64
  DIST='http://ftp.jp.debian.org/debian/dists/wheezy/main/installer-amd64/'
fi

virt-install --hvm --accelerate --nographics \
  --name $VM_NAME \
  --network bridge=$IFACE,model=virtio \
  --ram $MEM \
  --vcpus 1 \
  --os-type linux \
  --location $DIST \
  --disk path=$DISKIMAGE.qcow2,format=qcow2,size=$SIZE,bus=virtio,cache=writethrough \
  --extra-args='console=tty0 console=ttyS0,115200n8'
# virsh net-list --all
Name                 State      Autostart
-----------------------------------------
default              inactive   no

# virsh net-start default
# vm-install.sh debian7_nested 500 50 virbr0 wheezy
]]>
Wed, 05 Jun 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/05/26/ubuntu_mongodb_install.html http://d.zinrai.info/blog/html/2013/05/26/ubuntu_mongodb_install.html <![CDATA[Ubuntu12.04にMongoDBをインストール]]> Ubuntu12.04にMongoDBをインストール

積読になっていた「MongoDB イン・アクション」をようやく読み始めた。

「Ubuntu 12.04 amd64」にMongoDBをインストールして手を動かしてみたのでメモしておく。

Railsで使いたいなと思っているところ。

本家のドキュメントにaptでインストール出来ると書いているのでそれに従ってみた。

MongoDB インストール

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
$ echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/10gen.list
$ sudo apt-get update
$ sudo apt-get install mongodb-10gen
# apt-get install mongodb-10gen=2.2.3

で指定のVersionをインストールすることが出来る。

# echo "mongodb-10gen hold" | dpkg --set-selections

でインストールしたVersionからアップグレードしないように出来る。

MongoDB 操作

$ mongo
MongoDB shell version: 2.4.3
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user

use tutorial

db.users.insert({username: "hoge"})

db.users.find()
{ "_id" : ObjectId("51a1f5c136f07a662784e8ae"), "username" : "hoge" }

db.users.save({username: "moge"})

db.users.find()
{ "_id" : ObjectId("51a1f5c136f07a662784e8ae"), "username" : "hoge" }
{ "_id" : ObjectId("51a1f8d336f07a662784e8af"), "username" : "moge" }

db.users.count()
2

db.users.update({username: "hoge"}, {$set: {country: "canada"}})
db.users.find({username: "hoge"})
{ "_id" : ObjectId("51a1f5c136f07a662784e8ae"), "country" : "canada", "username" : "hoge" }

db.users.update({username: "hoge"}, {$unset: {country: 1}})
db.users.find({username: "hoge"})
{ "_id" : ObjectId("51adf33a197bc318df1ad8ad"), "username" : "hoge" }
]]>
Sun, 26 May 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/05/20/unbound_nsd.html http://d.zinrai.info/blog/html/2013/05/20/unbound_nsd.html <![CDATA[Unbound + NSD]]> Unbound + NSD

Chef Serverと戯れるときにhostsをいちいち書き換えるのは

面倒なので内部にDNSサーバを立ててみた。

Ubuntu 12.04 server amd64
コンテンツサーバ NSD(3.2.9) 192.168.0.1
キャッシュサーバ Unbound(1.4.16) 192.168.0.2

NSD

今回は正引きだけ設定した。

# apt-get install nsd
# cd /etc/nsd3
# cp nsd.conf.sample nsd.conf
# vi nsd.conf
server:
  ip-address: 192.168.0.1
  hide-version: yes
  ipv4-only: yes
  database: "/etc/nsd3/nsd.conf"
  pidfile: "/etc/nsd3/nsd.pid"
  chroot: "/etc/nsd3"
  username: nsd
  zonedir: "/etc/nsd3"
  difffile: "/etc/nsd3/ixfr.db"
  xfrdfile: "/etc/nsd3/xfrd.state"

zone:
  name: chef.local
  zonefile: chef.local.zone
# vi chef.local.zone
$TTL 3600
@ IN SOA ns1.chef.local. postmaster.chef.local. (
  2013052001  ;Serial
  3600        ;Refresh
  1800        ;Retry
  57200       ;Expire
  86400       ;Minimum TTL
)

@ IN  NS  ns1.chef.local.

ns1   IN  A 192.168.0.1
ns2   IN  A 192.168.0.2
www   IN  A 192.168.0.3
hoge  IN  A 192.168.0.4
fuga  IN  A 192.168.0.5
moge  IN  A 192.168.0.6

Unbound

# apt-get install unbound
# cd /etc/unbound
# zcat `locate unbound.conf | sed -n 2p` > unbound.conf
# vi unbound.conf
server:
  verbosity: 1
  interface 192.168.0.2
  do-ip6: no
  access-control: 127.0.0.0/8 allow
  access-control: 192.168.0.0/24 allow
  chroot: "etc/unbound"
  username: "unbound"
  directory: "/etc/unbound"
  use-syslog: yes
  pidfile: "/etc/unbound/unbound.pid"

stub-zone:
  name: "chef.local"
  stub-addr: 192.168.0.1
]]>
Mon, 20 May 2013 00:00:00 +0900
http://d.zinrai.info/blog/html/2013/03/23/tinkerer_github.html http://d.zinrai.info/blog/html/2013/03/23/tinkerer_github.html <![CDATA[Tinkerer + Github]]> Tinkerer + Github

jekyll + Githubを使ってブログを書いていたのだけれどローカルで確認するのにWEBRick動かすということに面倒くささを感じ流らく放置してしまっていた。

もっと手軽な(Sphinxみたいにhtmlが掃き出される)ものはないかと探してみたところTinkererというものを見付けた。

$ pip install tinkerer
$ tinker -s
$ wget http://dl.dropbox.com/u/218108/files/japanesesupport.py
$ mkdir _exts
$ mv japanesesupport.py _exts
$ hg clone https://bitbucket.org/vladris/tinkerer-contrib
$ cp `find tinkerer-contrib -name withgithub.py` _exts
$ rm -rf tinkerer-contrib
$ touch .nojekyll

conf.py 修正

extensions = ['tinkerer.ext.blog', 'tinkerer.ext.disqus', 'japanesesupport', 'withgithub']

# Add templates to be rendered in sidebar here
html_sidebars = {
    "**": ["recent.html", "categories.html", "tags.html", "searchbox.html"]
}
$ tinker -p 'first post'
$ tinker -b
$ git init
$ git add .
$ git commit -m 'first post'
$ git remote add origin git@github.com:zinrai/zinrai.github.com.git
$ git push -u origin master
]]>
Sat, 23 Mar 2013 00:00:00 +0900