Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

lxc-cloneでoverlayfsを使ってみる@Ubuntu 14.04

既存Linuxコンテナのディレクトリをコピーして、LXCのクローン環境を作るのではなく、既存のコンテナの差分だけを記録するoverlayfsを使ってみた。

クローン作成時にコピーがほぼゼロのため、一瞬でクローンが完了しますし、ディスクの節約にもなります。

使い方は、コマンドのオプションを以下のように指定するだけです。以下の例では、ubuntu01をクローンして、ubuntu02を作っています。-s がスナップショット、-Bでoverlayfsを指定します。

# lxc-clone -o ubuntu01 -n ubuntu02 -s -B overlayfs

差分のファイルは /var/lib/lxc/ubuntu02/delta0/ に保存されていました。

ちなみに、スナップショットといいつつも、overlayfs は元コンテナのファイルを修正したり、削除したりすると、それが新しいコンテナにも反映されてしまうようなので注意が必要です。

つまり

  • ubuntu02で未更新のファイルをubuntu01で更新 → ubuntu02に反映される
  • ubuntu02で未更新のファイルをubuntu01で削除 → ubnntu02でも削除される
  • ubuntu02に存在しないファイルをubuntu01に追加 → ubuntu02にも追加される
  • ubuntu02で更新したり削除したファイルと同名のフィアルをubuntu01で更新・削除 → ubuntu02に影響なし

のようです。 よって、スナップショット元のコンテナはスナップショット取得後はいじらない方がよさそうです。

(追記 2014/09/07)

inotify をサポートしていないようで、tail -f が使えないのは痛い・・・

Linuxコンテナ(LXC)の接続先ネットワークを物理NWにブリッジ@Ubuntu 14.04

LXCはデフォルトだと、勝手に作られたブリッジに接続し、勝手なローカルアドレスがDHCPで割り振られますが、既存のネットワークに直接繋ぎたくなったため、設定を変更してみました。

まずは、network-managerが動いていると何かと邪魔なので、ネットワークの設定を手動に切り替えます。

# service network-manager stop
# update-rc.d -f network-manager remove

一旦eth0に手動でIPを設定し、通信できることを確認しておきます。自分のNWにあわせてIP等は設定してください。

NW設定。

# vi /etc/network/interfaces

ファイル設定例

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.0.100
    netmask 255.255.255.0
    gateway 192.168.0.1
    dns-nameservers 192.168.0.1

pingで確認

# ifup eth0
# ping 192.168.0.1

ここでpingが通ればeth0を停止し、ブリッジ(br0)を作っていきます。

# ifdown eth0
# brctl addbr br0
# vi /etc/network/interfaces

ファイル設定例

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
    address 192.168.0.100
    netmask 255.255.255.0
    gateway 192.168.0.1
    dns-nameservers 192.168.0.1
    bridge_ports eth0
    bridge_stp off
    bridge_maxwait 10

auto eth0
iface eth0 inet static
    address 0.0.0.0

ブリッジ起動

# ifup br0

br0にeth0が入っていることを確認

# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.00270e120a0d   no      eth0
lxcbr0      8000.000000000000   no

最後に、コンテナがlxcbr0ではなく、br0を使用するように設定する。

# vi /var/lib/lxc/コンテナ名/config

変更点

lxc.network.link = br0

あとは、起動すると既存LANにブリッジ接続されます。
※既存LAN上でDHCPが動いている必要があります。

Linuxコンテナ(LXC)を使ってみた@Ubuntu 14.04

Linuxコンテナ(LXC)をUbuntu 14.04上で使用した時のメモです。

 

導入自体は難しくなく、apt-get でインストール可能です。

# apt-get install lxc

インストールすると、lxcbr0というブリッジが作成されます。

# ifconfig lxcbr0
lxcbr0 Link encap:イーサネット ハードウェアアドレス fe:62:b1:xx:xx:xx 
 inetアドレス:10.0.3.1 ブロードキャスト:10.0.3.255 マスク:255.255.255.0
 〜省略〜

 

次に仮想環境(コンテナ)を作ります。

# lxc-create -t ubuntu -n ubuntu01

-t はテンプレートの名前で、/usr/share/lxc/templates/ に、lxc-テンプレート名 というファイルで格納されていますので、このファイルをカスタマイズすれば、自分好みのコンテナが作れるようです。 -n はコンテナの名前で任意の名前をつけられます。

実行時は、ファイルをネットからダウンロードしたり、インストールしルートファイルシステム(rootfs)を作りますので、少し時間を要します。作られたrootfsは、/var/cache/lxc にあります。

起動はlxc-startです。 -d 使えばデーモンとして起動します。

# lxc-start -n ubuntu01 -d

KVMのようにOSを一から起動するわけではないので、起動はすぐに完了します。

 

コンソールにアクセスします。

# lxc-console -n trusty-org
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

Ubuntu 14.04.1 LTS ubuntu01 tty1

ubuntu01 login:

表示されているように、コンソールから抜けるには、Ctrl+a q を入力します。よって、コンソールからログインした場合、カーソルを先頭に移動する、Ctrl+a は使えず、Ctrl+a を二回入力する必要があります。 ちなみに、screenコマンドを使ってlxc-consoleを使うと、デフォルトではscreenコマンドがCtrl+aをフックしてしまいますので、かなり操作が面倒になりますので、lxc の エスケープ文字 Ctrl+a を他のキーに変更するには、-eオプションで指定します。以下の例ではCtrl+a の代わりに Ctrl+qを使用しています。

# lxc-console -e ^q -n ubuntu01
Connected to tty 1
Type <Ctrl+q q> to exit the console, <Ctrl+q Ctrl+q> to enter Ctrl+q itself

Ubuntu 14.04.1 LTS ubuntu01 tty1

ubuntu01 login:

数字をエスケープ文字にしようとしたら、うまく動かなかったので何を使うか注意が必要そうです。

起動したコンテナのrootfsの実態は、/var/lib/lxc の下にあります。ホストOS側からこの下のファイルを直接いじって、コンテナの設定を変更することも可能です。

 

なお、コンテナ起動後、vethXXXXXX といったネットワークインタフェースがホストOSに作られ、lxcbr0ブリッジに繋がれます。

# brctl show
bridge name bridge id STP enabled interfaces
lxcbr0 8000.fe62b1928b39 no veth7YW9KK

また、dnsmasq サービスが起動されるので、コンテナ内ではDHCPでIPが取得可能です。

 

実行しているコンテナの一覧の確認では、--fancyオプションでIPまで確認可能です。

# lxc-ls --fancy
NAME STATE IPV4 IPV6 AUTOSTART 
-----------------------------------------------
ubuntu01 RUNNING 10.0.3.15 - NO

 

コンテナの停止

# lxc-stop -n ubuntu01

コンテナの破棄

# lxc-destroy -n ubuntu01

gitのbash-completionを使用してのプロンプト変更@Ubuntu 14.04

Git 最低限の設定@CentOS 5 でGitのbash_completionを使っていましたが、同じような設定をUbuntu 14.04 LTS上で設定したときのメモです。

結論から言うと、あまりやることありません。 bash-completion とgitをインストールするだけで、ログイン時に自動で設定は読み込まれるようです。(呼び出し元はここかな /etc/profile.d/bash_completion.sh)

# apt-get install bash-completion git

あとは、前回と同じように、プロンプトを書き換えるPS1をこのように設定するだけです。

# export PS1='\u@\h:\w$(__git_ps1 " (%s)")\$ '

毎回設定するのが面倒なら、~/.bashrcファイルに追記しておけばOKです。

 

なお、screenコマンドを使うと、bash-completionの設定が読み込まれず、コマンド実行する度に、以下のエラーが出力されます。

-bash: __git_ps1: コマンドが見つかりません

その場合は、~/.screenrc ファイルに以下の設定を書いてログインシェルと同じにすることで解決します。

defshell -bash

設定変更後はscreenコマンドに再度入り直す必要があります。

 

前回の記事と同様に、screenコマンド使用時にスクリーン番号表示するには、~/.bashrcファイルに以下のように記述します。

if [ "$TERM" == "screen" ]; then
    export PS1='\h:$WINDOW:\w$(__git_ps1 " (%s)")\$ ' 
else
    export PS1='\h:\w$(__git_ps1 " (%s)")\$ ' 
fi

screen実行時のプロンプトに、このようにスクリーン番号とgitのブランチ名が出力されるようになります。

root@ubuntu:0:/home/repository/test-repo (master)#

cygwin上にSphinxをインストール

Cygwin 上に Sphinx をインストールしたときのメモです。

python の pip がインストールされていない場合はインストールしておきます。

 

pip コマンドを使って Sphinx をインストール

$ pip install sphinx
Downloading/unpacking sphinx
  Downloading Sphinx-1.2.2.tar.gz (3.1MB): 3.1MB downloaded
  Running setup.py egg_info for package sphinx

    no previously-included directories found matching 'doc/_build'
Downloading/unpacking Pygments>=1.2 (from sphinx)
  Downloading Pygments-1.6.tar.gz (1.4MB): 1.4MB downloaded
  Running setup.py egg_info for package Pygments
~ 省略 ~
    building 'markupsafe._speedups' extension
    gcc -fno-strict-aliasing -ggdb -O2 -pipe -fdebug-prefix-map=/home/jt/rel/python-2.7.3-1/python-2.7.3-1/build=/usr/src/debug/python-2.7.3-1 -fdebug-prefix-map=/home/jt/rel/python-2.7.3-1/python-2.7.3-1/src/Python-2.7.3=/usr/src/debug/python-2.7.3-1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/include/python2.7 -c markupsafe/_speedups.c -o build/temp.cygwin-1.7.24-i686-2.7/markupsafe/_speedups.o
    gcc -shared -Wl,--enable-auto-image-base -L. build/temp.cygwin-1.7.24-i686-2.7/markupsafe/_speedups.o -L/usr/lib/python2.7/config -lpython2.7 -o build/lib.cygwin-1.7.24-i686-2.7/markupsafe/_speedups.dll
Successfully installed sphinx Pygments docutils Jinja2 markupsafe
Cleaning up...

あとは、Sphinxの普通の使い方と同じはず。 sphinx-quickstart コマンドでプロジェクトを適当に作成すれば使えます。

pythonのpipをインストール@cygwin

cygwinのsetuptoolsがインストールされていない場合は、インストールしておいてください。

 

インストールされている場合は、easy_installコマンドが使えるので、確認。

$ easy_install --version
distribute 0.6.34

最新のpipは動かないようなので、1.4.1 をインストールする。 ※ なぜか何回かダウンロードに失敗しました。

$ easy_install https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz
Downloading https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz
Processing pip-1.4.1.tar.gz
Writing /tmp/easy_install-weNPEp/pip-1.4.1/setup.cfg
Running pip-1.4.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-weNPEp/pip-1.4.1/egg-dist-tmp-Jf26gm
warning: no files found matching '*.html' under directory 'docs'
warning: no previously-included files matching '*.rst' found under directory 'docs/_build'
no previously-included directories found matching 'docs/_build/_sources'
Adding pip 1.4.1 to easy-install.pth file
Installing pip script to /usr/bin
Installing pip-2.7 script to /usr/bin

Installed /usr/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg
Processing dependencies for pip==1.4.1
Finished processing dependencies for pip==1.4.1

これで pip コマンドが使えるようになりました。

$ pip help

Usage:   $ pip help

Usage: 
 pip <command> [options]

Commands:
 install Install packages.
 uninstall Uninstall packages.
 freeze Output installed packages in requirements format.
 list List installed packages.
 show Show information about installed packages.
 search Search PyPI for packages.
 wheel Build wheels from your requirements.
 zip Zip individual packages.
 unzip Unzip individual packages.
 bundle Create pybundles.
 help Show help for commands.

General Options:
 -h, --help Show help.
 -v, --verbose Give more output. Option is additive, and can be used up to 3 times.
 -V, --version Show version and exit.
 -q, --quiet Give less output.
 --log <file> Log file where a complete (maximum verbosity) record will be kept.
 --proxy <proxy> Specify a proxy in the form [user:passwd@]proxy.server:port.
 --timeout <sec> Set the socket timeout (default 15 seconds).
 --exists-action <action> Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.
 --cert <path> Path to alternate CA bundle.
  pip <command> [options]

Commands:
  install                     Install packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  zip                         Zip individual packages.
  unzip                       Unzip individual packages.
  bundle                      Create pybundles.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output.
  --log <file>                Log file where a complete (maximum verbosity) record will be kept.
  --proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.
  --cert <path>               Path to alternate CA bundle.

chromeに独自のproxyを設定

Windows版のchromeのproxyの設定を開くと、システム(IE)のproxy設定が開くため、システム全体のproxyの設定が変更されてしまいます。

そのため、IEのProxyの設定を変えず、chromeだけproxyを通したい場合は上記設定は使えません。

 

そういう場合は、chrome起動時のコマンドオプションで指定できるようです。

指定方法、chrome起動するためのショートカットのプロパティ開いて、ショートカットのリンク先に

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"

といった値が入っているので、--proxy-server=xxxxx:8080 みたいなオプションを与えます。

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=myproxy:8080

各種リポジトリのssh鍵の変更

の議事を拝見して、使用している各種リポジトリのssh鍵をセキュリティの高いECDSAに変更しようとした結果。

Github → 記事の通りOK Bitbucket → NG Sourceforge → NG

まだまだ対応している所は少ないみたいですね。

Janetterのデータベースサイズが大きすぎる

ふと気づいたら、以下のフォルダのJanetterのデータベースのサイズが5GBもありました。twitterクライアントの使うディスクサイズとしては大きすぎます。

C:\Users\ユーザ名\AppData\Roaming\Jane\Janetter2\sqlite

listtweet,mention,message,search,tweet フォルダを手動で削除しても構わないようなので、Janetterを終了させてから削除してしまいましょう。

なお、一つ上のフォルダにあるjanetter.iniには、max_record_count とうパラメータがあり、デフォルト50000になっています。つまり5万ツイート保存してしまうようなので、今後データベースが大きくならないように、2000ぐらいに変更して、様子をみてみます。

キーボードレイアウト、ロケール変更@Ubuntu 14.04 server on VMware Player

VMwareの簡易インストールはOSのインストールが簡単で便利ですが、日本時間になっていなかったり、コンソールからログインするとキーボードレイアウトが日本語になっていなかったりと使いづらいので、Ubuntu 14.04 server インストール後にやればよさそうなことをまとめました。

OSアップデート

vmware-tools のモジュールがカーネルのバージョン上がると動かなくなる可能性があるので、OSを最新にアップデートしておきます。

# apt-get update
# apt-get upgrade

vmware-tools のインストール

詳細省略。通常のvmware-toolsの手順です。

時刻を日本時間に変更

# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

JSTになっていることを確認しておきます。

# date
Jul 6 11:34:35 JST 2014

キーボードレイアウトを日本語キーボードに変更

# dpkg-reconfigure keyboard-configuration

キーボードレイアウトの設定画面が出てきますので、 Generic 105-key (Intl) PC → Japanese → Japanese → The default for the keyboard layout → No compose key を選択します。

ちなみに、

# dpkg-reconfigure console-data

だと、一時的にレイアウトを変更できるようで、再起動すると元に戻ります。

二本指でのスクロールの向きを逆にする@Windows8

Windows8 のタッチパッドは二本指でスクロールが可能ですが、タッチスクリーンのスクロールと方向を合わせているのか、デフォルトでは指を上に動かすと、画面は下にスクロールします。これにどうしても慣れないので、Macのように指を上に動かした場合は画面を上にスクロールするように逆向きに設定する方法の紹介です。

方法は、レジストリを変更します。

  1. コマンドプロンプトやスタート画面等から「Regedit」と入力してレジストリエディタを起動します。
  2. [HKEY_LOCAL_MACHINE] [SYSTEM] [CurrentControlSet] [Enum] [HID]の順に展開します。
  3. VIDから始まる項目が複数表示されるので、すべて展開して中に含まれる[Device Parameters] を探します。
  4. それぞれの[Device Parameters]をクリックし、右側に[FlipFlopHScroll]と[FlipFlopWheel]が表示されるものを探し、ダブルクリックで値を0から1に書き換えます。なお、私の環境では、3つありました。

== 追記 ==

これを設定すると、ピンチやズームのジェスチャーも逆になってしまいました。これはこれで使いにくいですが、解決方法はわからず。

プログラミングコンテストの模擬練習(ババ抜き)を解いてみた

以下で紹介されていたプログラミングコンテストの模擬練習問題(ババ抜き)をpythonの勉強がてら解いてみた。使ったpythonのバージョンは、2.7.3です。

http://www.gizmodo.jp/2013/12/recruit_programming_contest.html http://recruit-programing-contest-practice.contest.atcoder.jp/tasks/recruite_2013_pre_a

ファイル名 : baba.py

#! /usr/bin/python
# -*- coding: utf8 -*-
import copy

class Person():
    def __init__(self,card):
        self.cardList = list(card)
        self.cardList.pop() # remove \n

    def addCardAndCompare(self,card):
        if card in self.cardList:
            self.cardList.remove(card)
            return True
        else:
            self.cardList.append(card)
            return False

    def pickLeftCard(self):
        card = self.cardList.pop(0)
        return card

    def isWin(self):
        if len(self.cardList) == 0:
            return True
        return False

    def __eq__(self, other):
        if len(self.cardList) != len(other.cardList):
            return False
        for i in range(len(self.cardList)):
            if self.cardList[i] != other.cardList[i]:
                return False
        return True

class TestCase():
    def __init__(self, file):
        self.pickCount = 0
        self.picker = 0
        self.target = 1
        self.Fighters = int(file.readline())
        self.personList = []
        self.personListCopy = []
        self.detectLoop = True
        for i in range(self.Fighters):
            self.personList.append(Person(file.readline()))
        self.personListCopy = copy.deepcopy(self.personList)
        self.fight()

    def checkCardList(self, p):
        self.person = self.personList[p]
        if self.person.isWin():
            self.personList.pop(p)
            del(self.person)
            self.Fighters -= 1
            return True
        return False

    def pickCard(self):
        self.pickCount += 1
        self.card = self.personList[self.target].pickLeftCard()

        if self.personList[self.picker].addCardAndCompare(self.card):
            self.detectLoop = False
        if self.checkCardList(self.target):
            self.detectLoop = False
            if self.target < self.picker:
                self.picker -= 1
        if self.checkCardList(self.picker):
            self.detectLoop = False
        if not self.detectLoop:
            self.personListCopy = copy.deepcopy(self.personList)

    def fight(self):
        while True:
            self.pickCard()
            if self.detectLoop:
                if self.personListCopy == self.personList:
                    print "-1"
                    return 0
            self.detectLoop = True
            self.picker = (self.picker + 1) % self.Fighters
            self.target = (self.picker + 1) % self.Fighters
            if self.picker == self.target:
                if len(self.personList) == 0:
                    print self.pickCount
                    return 0
                if self.personList[0].cardList[0] == 'J':
                    print self.pickCount
                    return 0
                print "-1"

inputFile = open("input.txt", "r")
for i in range(int(inputFile.readline())):
    testCase = TestCase(inputFile)
    del testCase
inputFile.close()

実行には以下の入力ファイルを、input.txt というファイル名で同じディレクトリに置いておく必要があります。

3
3
16372
2746J18
348
4
1234
1234
1234
1234J
5
13645
643125
147
5137J
3245

実行結果

$ ./baba.py 
15
29
-1

もっとスマートの解き方はありそうだが、とりあえず動いてます。

Transcend Micro SDHC 32GB UHS-I PREMIUM 300x ベンチマーク

Transcend Micro SDHC 32GB UHS-I PREMIUM 300x を手に入れたので軽くベンチマークやってみた。といっても、PC が UHS-I に対応してないので、シーケンシャルと、ランダム512KB 辺りはほとんど参考にはならないと思うが。。。


CrystalDiskMark 3.0.2 (C) 2007-2013 hiyohiyo

Crystal Dew World : http://crystalmark.info/

  • MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]

Sequential Read :    19.123 MB/s Sequential Write :    14.461 MB/s Random Read 512KB :    18.878 MB/s Random Write 512KB :    14.759 MB/s Random Read 4KB (QD=1) :     3.530 MB/s [   861.8 IOPS] Random Write 4KB (QD=1) :     1.516 MB/s [   370.1 IOPS] Random Read 4KB (QD=32) :     3.453 MB/s [   843.1 IOPS] Random Write 4KB (QD=32) :     1.554 MB/s [   379.4 IOPS]

Test : 50 MB [G: 0.0% (0.0/29.5 GB)] (x1) Date : 2013/12/15 0:11:16 OS : Windows 7 Home Premium Edition SP1 [6.1 Build 7601] (x64)

qcow2のディスクイメージをマウントして編集する@Ubuntu12.04

KVMなどで使われているqcow2形式のディスクイメージは、単純なディスクイメージと異なり、そのままループバックに繋いでもマウントすることができません。中身を編集するには、qemu-nbd コマンドを使って nbd (Network Block Device) 経由で扱います。nbd は、ネットワーク経由でローカルディスク上にあるディスクイメージをリモートからブロックデバイスとして扱えるようにするための機能がメインのものですが、今回はローカルにあるqcow2のディスクイメージをマウントするのに使うので、ネットワークはあまり関係ありません。

今回は、Ubuntu のクラウド向けの qcow2 ディスクイメージ precise-server-cloudimg-amd64-disk1.img をマウントしてみます。

qemu-utils パッケージがインストールされていない場合はインストールします。

# apt-get install qemu-utils

nbd カーネルモジュールをロードします。

# modprobe nbd

ロードが正常に完了すると、/dev/nbd0 や /dev/nbd1 といったデバイスが見えます。

# ls /dev/nbd*
/dev/nbd0    /dev/nbd1   /dev/nbd11  /dev/nbd13  /dev/nbd15  /dev/nbd3  /dev/nbd5  /dev/nbd7  /dev/nbd9
/dev/nbd0p1  /dev/nbd10  /dev/nbd12  /dev/nbd14  /dev/nbd2   /dev/nbd4  /dev/nbd6  /dev/nbd8

/dev/nbd0 に ディスクイメージを繋ぎます。 ※ファイル名は絶対パスを書かないとエラーになるので、pwdを付けています。

# qemu-nbd --connect=/dev/nbd0 `pwd`/precise-server-cloudimg-amd64-disk1.img

connectすると、パーティションがある場合は自動的にパーティションに応じたデバイスが自動的に作らるので、kpartxは不要です。

# ls /dev/nbd0*
/dev/nbd0  /dev/nbd0p1

いまどのデバイスを使っているかは、コマンドでは確認できそうにないですが、プロセスをgrepして確認可能です。

# ps -ef | grep [q]emu-nbd
root     11461     1  0 10:49 ?        00:00:00 qemu-nbd --connect=/dev/nbd0 /home/share/img/precise-server-cloudimg-amd64-disk1.img

後は、/dev/nbd0p1 を適当にマウントすれば中身が見られます。

# mkdir /mnt/tmp
# mount /dev/nbd0p1 /mnt/tmp

ディスクイメージのデフォルトのパスワード変更したいなら、chroot して passwd コマンド叩けば、イメージ起動後にコンソールからログインできるようにもなります。

# chroot /mnt/tmp
# passwd ubuntu
# exit

後始末は、アンマウントして、disconnectします。disconnectの時は、デバイス名の前に"="は不要です。

# umount /mnt/tmp
# qemu-nbd --disconnect /dev/nbd0 
/dev/nbd0 disconnected

iptablesの設定を保存し起動時に自動的に反映する@Ubuntu 12.04 server

Ubuntu の iptables の設定を保存するには、iptables-persistent パッケージをインストールします。

# apt-get install iptables-persistent

インストールを実行すると、/etc/iptables/rules.v4 や /etc/iptables/rules.v6 というファイルが作られます。v4がIPv4向け、v6がIPv6向けの設定で、インストール時の設定が保存されています。

iptables の設定を全て空にして設定を保存するにはこのようにします。 ※ KVM環境でNATの設定が入っている場合、NATの設定が消えてしまうので注意

# iptables -F
# iptables -F -t nat
# iptables -F -t mangle
# /etc/init.d/iptables-persistent save

このように空のルールが保存されることが確認できます。

# cat /etc/iptables/rules.v4
# Generated by iptables-save v1.4.12 on Sat Nov  2 23:50:56 2013
*nat
:PREROUTING ACCEPT [2:80]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Sat Nov  2 23:50:56 2013
# Generated by iptables-save v1.4.12 on Sat Nov  2 23:50:56 2013
*mangle
:PREROUTING ACCEPT [18:1152]
:INPUT ACCEPT [18:1152]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [13:1848]
:POSTROUTING ACCEPT [13:1848]
COMMIT
# Completed on Sat Nov  2 23:50:56 2013
# Generated by iptables-save v1.4.12 on Sat Nov  2 23:50:56 2013
*filter
:INPUT ACCEPT [267:19260]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [235:51828]
COMMIT
# Completed on Sat Nov  2 23:50:56 2013

cygwin ck のダブルクリック選択文字列の範囲を変更する

Cygwin 用のターミナルソフトウェア cygwin ck  を便利に使わせてもらってますが、唯一不満な点が一つあり、ターミナル上でマウスをダブルクリックした際に選択される文字列が TeraTerm と違い、"_ (アンダーバー)" や ". (ドット)" 等の文字も区切り文字として認識されるため、コピーアンドペーストが使いにくく感じてました。

設定ファイル (.ck.config.js) でも変更できないようなので、ソースを覗いてみたところ、ハードコーディングされていたので、自分で修正してみました。

修正箇所は、screen.cpp ファイル 617行目の以下の変数です。 (ck-3.6.3のソースを使用)

static const wchar_t  BREAK_CHARS[] = L"\"&()*,.-_/:;<=>@[\\]^`'{}~\x3000\x3001\x3002\x300C\x300D\x3010\x3011" ;

この変数に区切り文字が定義されていますので、このように変更しました。

static const wchar_t  BREAK_CHARS[] = L"\"()*,:;<=>@[\\]^`'{}\x3000\x3001\x3002\x300C\x300D\x3010\x3011";

上記では、"& . - _ / ~" を削除しています。

 

以前書いた基本設定編はこちら

Fedora 17を19にアップグレードする

Fedora 17 のサポートが気づいたら終わっていたので、最新の19にアップグレードしました。ちなみに、Fedora 19へのアップグレードは、17以降でないとだめなので、16以前のFedora を使っている場合は、17までアップグレードしておく必要があります。

必要なファイルはバックアップしておきます。私の環境はVMwareなので、仮想マシンのイメージ丸ごとバックアップしました。

次に、rpmnew ファイルや rpmsave ファイルを整理しておきます。

# find /etc /var -name '*?.rpm?*'

上記コマンドでrpmnewファイルが表示されたら、今のファイルのバックアップをとり、必要に応じて差分を反映しておきます。

次に不要なパッケージを削除しておきます。不要なファイルは下記のコマンドで検索できます。

# package-cleanup --leaves

問題なさそうならば一気に削除しましょう。(問題ないかどうかの判断は難しいですが・・・)

# rpm -e `package-cleanup --leaves | sed '1d'`

削除に、もう一度検索し、他に表示されないかもう一度確認しておきます。他に表示されたら必要に応じてもうちど削除しましょう。

 

最後にアップグレードです。fedupツールを使います。 ※ 最初、preupgrade コマンド使うと私の環境では再起動後インストールが始まらず、失敗しました。再起動後にマウスカーソルしか表示されなかったので、GUIが立ち上がらないのが原因かと思い、vmware本体やvmware-tools をアップデートし、vmwareのディスプレイの設定で、3Dアクセラレーションを無効にしました。preupgradeが原因なのか、これらの設定変更が有効に働いたのかは追求していませんが、同じ状況に陥った人がいれば試してみてください。

# yum instlal fedup

私はGUIを使ってないので、cli版のコマンドでアップデートします。

# fedup-cli --network 19 --debuglog /root/fedup.debug.log

ネットワーク経由でダウンロード、インストールが始まります。

コマンドが正常終了し、手動で再起動すると、Upgrade ・・・  というのがGRUBの起動画面の先頭行に表示されるので、これを選択するとアップデートの続きが始まります。終了まで1時間以上かかりました。

 

 

 

このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ