2013年10月30日水曜日

【備忘録】GPT(GUID Partition Table)で Ubuntu 12.04 64bit システムディスクをパーティショニングする。

完全なる備忘録。

GPT でのパーティショニングが、よくわからないので、適当にやってみた。


インストーラーでパーティショニング

最初は、Ubuntu 12.04 Desktop 64bit インストーラー(ubuntu-12.04.3-desktop-amd64.iso)を使用したパーティショニングを行ってみた。
マザーボードは、GIGABYTE GA-990FXA-UD5 で、BIOSは AMI EFI である。
したがって、UEFI BIOS 向けのパーティショニングとなる。
GPT でのパーティショニングとは関係ないが、諸所の事情で、光学ドライブが付いていないマシンにインストールするために、USB メモリにインストーラーを入れた。
手順は、先人の知恵である「USBメモリを使ってUbuntuをインストール No.2」をありがたく参考に、http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/ から Universal USB Installer をダウンロードして利用した。ありがたや。

インストーラーを起動。
「Install Ubuntu」を選択
「日本語」を選択
「インストール中にアップデートをダウンロードする」および「サードパーティのソフトウェアをインストールする」にチェックを入れ、続ける(この2つは、入れても入れなくてもいいと思う)

「インストールの種類」の選択画面になったら、「それ以外」(説明は、”Ubuntu 向けに、自分でパーティションの作成やサイズ変更を行ったり、複数のパーティションを選択することもできます。”と書いてある)を選択して続ける

パーティション作成画面では、以下の手順でパーティション分けをする。
パーティションは、「EFI システムパーティション」、「ルートパーティション」および、「スワップパーティション」の3つが必須となる。

「/dev/sda」を選択
「新しいパーティションテーブル」ボタンを押下し、「続ける」ボタンを押下

「dev/sda」の「空き領域」を選択して、「追加」ボタンを押下
「新しいパーティションのサイズをメガバイト(1000000 バイト)単位で指定する」に 100(MB)と入力(35MB 以上必要らしい)
「新しいパーティションの場所」:先頭
「利用方法」:EFI システムパーティション
「OK」ボタンを押下


同じ要領で、以下の必須パーティションも作成する。

ルートパーティションを作成
「新しいパーティションのサイズをメガバイト(1000000 バイト)単位で指定する」に 10000(MB)
利用方法:ext4 ジャーナリングファイルシステム
マウントポイント:/

スワップパーティションを作成
利用方法:スワップ領域


必要なパーティションの作成が完了したら、「ブートローダをインストールするデバイス」に「/dev/sda」を選択して、「インストール」ボタンを押下


ここでは、以下のようにパーティションを作った。 sda は、500GB のHDD。ちなみに、空き領域は、勝手にできるようだ。
デバイス          タイプ        マウントポイント    フォーマット    サイズ      使用済み
/dev/sda
  空き領域                                                                    1MB
  /dev/sda1      efi                                                         98MB         不明
  /dev/sda2      ext4          /                       する              10000MB    不明
  /dev/sda3      ext4          /mnt/temp         する              488006MB   不明
  /dev/sda4      swap                                                     1999MB      0MB
  空き領域                                                                    1MB

あとは、最後までインストールして完了。

手動でパーティショニング

KVM 仮想環境上に MBR でインストールした Ubuntu 12.04 Alternate 64bit をそっくり移して、きちんと起動できるか確認した。
手動でパーティショニングする場合は、レガシー BIOS 向けなので、EFI BIOS 向けとパーティションの定義方法が異なるので注意。

ゲストイメージのストレージプールは、LVM 上に作成してある。

$ sudo lvs
  LV         VG   Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  yebisu.img vg0  -wi-a-  10.00g

ロジカルボリュームをリネーム

$ sudo lvrename vg0 yebisu.img yebisu.img.bak
  Renamed "yebisu.img" to "yebisu.img.bak" in volume group "vg0"

新規ロジカルボリュームを作成

$ sudo lvcreate -L 10g -n yebisu.img vg0
  Logical volume "yebisu.img" created

ゲストボリュームに対するレスキューをするためのツールを起動(libguestfs-tools パッケージ)

$ sudo virt-rescue /dev/vg0/yebisu.img

新規ボリュームをパーティション分け
GPT の場合は、専用のパーティション(vda1)を作成して(本当に必要かどうか、いまいちわからない)、bios_grub フラグを立てる必要がある。

I have no name!@(none):/# parted /dev/vda
(parted) mktable gpt
(parted) mkpart non-fs 0cyl 2cyl
(parted) mkpart root 2cyl 8g
(parted) mkpart swap 8g -1
(parted) set 1 bios_grub on
(parted) print free
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name    Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  16.8MB  15.7MB                  non-fs  bios_grub
 2      16.8MB  8000MB  7983MB  ext4            root
 3      8000MB  10.7GB  2737MB  linux-swap(v1)  swap
        10.7GB  10.7GB  1032kB  Free Space

(parted) quit

パーティションをフォーマット

I have no name!@(none):/# mkfs.ext4 /dev/vda2
I have no name!@(none):/# mkswap /dev/vda3
I have no name!@(none):/# exit

ゲストボリュームににアクセスできるツールを起動(guestfish パッケージ)
ゲストのファイルシステムに対して、色々できる。
レスキューツールと似ていて、こちらでもパティショニングできるが、いまいち使いづらい。専用コマンドのマニュアルと睨めっこすれば、パティショニングから、フォーマットまでできる。

$ sudo guestfish -a /dev/vg0/yebisu.img.bak
> run
> list-filesystems
/dev/vda1: ext4
/dev/vda2: unknown
/dev/vda5: swap
> mount /dev/vda1 /

コピー元ファイルを tar ファイルに出力

> tar-out / bak.tar
> quit

カレントディレクトリに、bak.tar ファイルができているはず。

コピー先に tar ファイルを展開

$ sudo guestfish -a /dev/vg0/yebisu.img
> run
> list-filesystems
/dev/vda1: unknown
/dev/vda2: ext4
/dev/vda3: swap
> mount /dev/vda2 /
> tar-in bak.tar /
> quit

再びレスキューツールを起動

$ sudo virt-rescue /dev/vg0/yebisu.img

ゲストストレージに chroot

I have no name!@(none):/# mount /dev/vda2 /sysroot/
I have no name!@(none):/# mount -o bind /dev /sysroot/dev
I have no name!@(none):/# mount -o bind /proc /sysroot/proc
I have no name!@(none):/# mount -o bind /sys /sysroot/sys
I have no name!@(none):/# chroot /sysroot bash

UUID を調べる

root@(none):/# blkid /dev/vda2
/dev/vda2: UUID="8919796d-066a-4f12-adce-d2726c4c6ca1" TYPE="ext4"
root@(none):/# blkid /dev/vda3
/dev/vda3: UUID="1438a432-7db7-43af-a492-1c12f3677ed9" TYPE="swap"

上記で調べたルートおよびスワップドライブの UUID を書き換え

root@(none):/# vi /etc/fstab

上記で調べたスワップドライブの UUID を書き換え

root@(none):/# vi /etc/initramfs-tools/conf.d/resume

GRUB をインストール

root@(none):/# grub-install /dev/vda
Installation finished. No error reported.

GRUB 設定を更新

root@(none):/# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.5.0-42-generic
Found initrd image: /boot/initrd.img-3.5.0-42-generic
Found memtest86+ image: /boot/memtest86+.bin
[27740.000422] SGI XFS with ACLs, security attributes, realtime, large block/inode numbers, no debug enabled
[27740.015882] JFS: nTxBlock = 3834, nTxLock = 30672
[27740.056074] NTFS driver 2.1.30 [Flags: R/O MODULE].
[27740.079828] QNX4 filesystem 0.2.3 registered.
[27740.167927] Btrfs loaded
done

initramfs を更新

root@(none):/# update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-3.5.0-42-generic

終了

root@(none):/# exit
exit
I have no name!@(none):/# exit
exit

ゲストを起動

$ virsh start --console yebisu
ドメイン yebisu が起動されました
ドメイン yebisu に接続しました
エスケープ文字は ^] です
error: no video mode activated.

Ubuntu 12.04.3 LTS yebisu ttyS0

ログイン

yebisu login: user1
Password: ********
Last login: Tue Oct 29 14:35:36 JST 2013 on ttyS0
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.5.0-42-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Wed Oct 30 07:32:37 JST 2013

  System load:  0.34              Processes:           131
  Usage of /:   38.1% of 7.32GB   Users logged in:     0
  Memory usage: 6%                IP address for eth0: 192.168.1.105
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

user1@yebisu:~$ 

無事に起動した。
めでたしめでたし。


2013年6月9日日曜日

unix4j の備忘録

前回は、awk4j を調査したが、awk だけでは、ちと寂しいので、他の Unix コマンドを Java で使う方法も調査してみた。

その便利なライブラリは、unix4j である。
Google Code のプロジェクトで、ライセンスは、New BSD License となっている。

まずは、手っ取り早く動作確認を行う方法から。
今回は、jrunscript.exe で動作確認をするので、JDK 1.6 以上が必要。

unix4j のページには、バイナリファイルが見当たらなかったので、Maven Central Repository から jar ファイルを拝借してくる。
"unix4j"で検索すれば バージョン 0.2 が 6種類ほど引っかかる。
その内、「unix4j-command」と「unix4j-base」の jar ファイル「unix4j-command-0.2.jar」と「unix4j-base-0.2.jar」をそれぞれダウンロードする。

コマンドプロンプトを開き、jar ファイルと同じディレクトリで以下のコマンドを実行する。
%JAVA_HOME%\bin ディレクトリにパスが通っている必要がある。

dir | jrunscript -cp unix4j-base-0.2.jar;unix4j-command-0.2.jar -e "org.unix4j.Unix4j.from(java.lang.System[\"in\"]).sed(\"s/unix4j/FOOO/g\").toStdOut()"

やっていることは、標準入力からディレクトリ一覧をパイプで入力し、sed で文字列を変換し、標準出力へ結果を吐き出している。
スクリプト部分は、ファイルから読み込むこともできるので、バッチファイル化しておけば、いい感じになる。コマンドラインだとダブルクォートのエスケープとか面倒だしね。

その他にも、grep、find、tail、sort や uniq など色々使えるので、結構便利そうだ。
もちろん、通常の Java クラスとしても実装できる。


さて、ここからはおまけ。
最新の unix4j を使いたい場合に、ソースからビルドする方法を書いておく。
以下のものが必要となる。

  • JDK 1.6 以上
  • Apache Maven
  • git

今回は、以下の環境で検証した。

  • Windows 7 Professional SP1
  • Apache Maven 3.0.5
  • Java version: 1.7.0_06
  • Git for Windows 1.8.3-preview20130601

はじめに、適当なディレクトリに unix4j の git リポジトリをクローン
git clone https://code.google.com/p/unix4j/

cd unix4j

mvn clean compile jar:jar

これで、jar ファイルが出来る。
ちなみに、pom.xml には、Java 1.6 用と 1.7 用のプロファイルが定義されていて、デフォルトは、1.6 になっているが、JDK 1.7 でコンパイルした場合は、1.7 用のプロファイルが有効になるようだ。

作成された以下の jar を使う。
unix4j\unix4j-core\unix4j-base\target\unix4j-base-0.3-SNAPSHOT.jar
unix4j\unix4j-core\unix4j-command\target\unix4j-command-0.3-SNAPSHOT.jar


いやはや、今更ながら jrunscript の存在を認識できた。結構奥深いようだ。
仕事柄、ツールを利用して作業を効率化したいときが結構あるのだが、sed とか awk とか使うには、インストールできないとかで、環境面のハードルが高い。
こういうものが、地味に助かることも多い。

2013年6月8日土曜日

awk4j の備忘録

awk4j の Web ページには、以下のような説明がある。

「awk4j は、 GNU AWK 互換の言語処理環境で、 AWKスクリプトを、中間言語としてのホスト言語 ( Java, JavaFX, JavaScript, BeanShell, Groovy, Python, Scala ) に変換するトランスレータ方式で動作します。」

仕事をしていると、awk を使いたくなる場合がある。
自宅なら、MinGW とか MSYS とか、Ubuntu マシンとかあるので、困ることは無いのだが、現場によっては、ソフトのインストール自体が難しいことがある。
そんなときに、awk4j が役に立ちそうなので、ちょっと調べてみた。


  • Windows 上で動かすこととする。
  • JDK 1.6 以上がインストールされていること。

awk4j は、Java 1.6 から利用できる jrunscript コマンドを利用して実行する。

まず、awk4j のページから、awk4j-1.6.5-bin.zip をダウンロードし、適当な場所に解凍する。

最初は、実行方法を簡単に説明する。
解凍した以下のディレクトリを、コマンドプロンプトで開く
awk4j-bin\lib

以下のように実行すると、Hello World! と表示される。
AWK スクリプトを内部で Java 言語に変換しているので、CLASSPATH 環境変数の設定が必ず必要となる。
set CLASSPATH=awk4j.jar
%JAVA_HOME%\bin\jrunscript -cp awk4j.jar -l awk4j -e "BEGIN { print \"Hello World!\" }"


バッチ化する場合は、以下のようなコマンドを awk.bat として作成して、バッチと同じディレクトリに awk4j.jar ファイルを格納する。ちなみに、「%~dp0」は、バッチファイルのディレクトリを取得する記述。

@echo off
setlocal
set CLASSPATH=%~dp0awk4j.jar;%CLASSPATH%
%JAVA_HOME%\bin\jrunscript -cp %~dp0awk4j.jar -l awk4j %*
endlocal


同じように、JavaScript に変換して実行することもできる。
JavaScript の場合は、CLASSPATH 環境変数の設定は、いらないようだ。
ただし、Java と JavaScript では、実行時の挙動が異なるようだ!?
JavaScript での実行では、以下のコマンドは、同じ結果になるのだが、入力ファイルを指定しても、処理している様子がないし・・・例文で乗っている "1" とか "NF" のようなスクリプトも、JavaScript では、エラーになってしまうようだ。何か、指定方法などが間違っているのだろうか?

%JAVA_HOME%\bin\jrunscript.exe -cp awk4j.jar -l awk4j.JavaScript -e "BEGIN { print \"Hello World!\" }"


では、作成した awk.bat のコマンド例を示す。

ファイル指定で実行
awk -e "{ print $0 }" hoge.txt

パイプで実行。標準入力からデータを受け取る場合 /dev/stdin をファイル名に指定する。ここら辺の説明は、「言語仕様」リンク先でなされている。
type hoge.txt | awk -e "1" /dev/stdin