Hybrid MBR を GPT / MBR ディスクに変換する。


みむらです。

普通、GPT ディスクを MBR ディスクに直したりっていうのは、
ディスクの内容飛ばせーとか言われるんですが、面倒くさいのでいいのないかなーと探していたらありました。

ってことで、この先は Linux + CUI の世界ですが、

もしGUI で Windows で完結させたい人は、たぶん
窓の杜 – 【NEWS】米Paragon、BIOS-MBRからUEFI-GPTへWindows環境を移行できる「Migrate to UEFI」

この辺使うと幸せになれるんじゃないでしょうか。使ったことないので、保証はできません・・。

 

説明に入る前に Hybrid MBR とはなんぞやということですが、

簡単に言うと、本来 GPT ディスクは MBR の部分に、
「よくわからないけど、ディスクの全ては使われてるよ!」 という情報を書いて、
GPTの部分に本来のデータを書き込んでおきます。

ですが、GPT わけわからんなシステムの場合、これだと非常にまずいわけで、
そこで、MBR 領域に「ここからここまでが、起動領域、あとはしらん!」 みたいに有効な情報を書いておき、
いい感じにしてしまおうというものです。

ただ、GPT と MBR でデータの整合性がちゃんととれるのかというところで問題があり、
あんまりやらない方がいいのですが、古いシステムで使う場合や、 Mac で Windows を動かす場合に必要な用です。

 

で、この記事でやろうとしていることは、
どっちか一つにしよう! ということで、 GPT か MBR に一本化してしまおうと言うことです。

もちろん、後述する gdisk コマンドを使えば、相互にこれらを行き来できますが、
この記事の内容もそうですが、この操作によって、データを失っても私は責任を持てません。

やるのであれば、必ずバックアップを取った上で行ってください。



使うのは 「 gdisk 」というソフトウェアです。
往年の fdisk コマンドの GPT 版ととらえて、問題無いと思います。

(作業機は Linux Mint 12 を想定していますが、 Ubuntu でも動作すると思われます。)
(Fedora, CentOS などの Redhat 系は、適宜読み替えて頂ければ、問題ないかと思われます。)

 

1.gdisk をインストール。

$sudo aptitude install gdisk

 

2.gdisk を起動する。

この際、 /dev/ 以下のどのデバイスファイルが操作したい対象のディスクを指しているか
知っておく必要があります。

少し触れておきますと、
大抵が sd? というように、先頭2文字が sd で始まるファイルが割り当てられていることが多く、
1番目の接続が sda, 2番目が sdb というように名前が振られています。

また、IDE 接続の場合は、 sd ではなく hd となり、 hda, hdb となっている可能性があります。
(ただ、IDE 接続でも sd で始まる場合が多いようです。前は見かけたのですがやはり libata の関係ですかね。

その他、ソフトウェア RAID ( マザーボード上で提供されている RAID や、Windows の場合は、コンピュータの管理から設定できる RAID など、RAID コントローラを経由せずに、ソフトウェアで提供されている RAID ) を使っている場合、
/dev/mapper/ 以下にいい感じでデバイスファイルが用意されている場合があります。
その場合は、そのファイルを絶対使用してください。

・・・よくわからない場合や、実際に RAID を使っていてよくわからない人は、ここから先、特に自己責任でお願いします。

 

例: /dev/sda が対象のHDD の場合。

$ sudo gdisk /dev/sda

この先は、全て HDD が /dev/sda である場合を想定しています。
適宜対象環境に併せて、読み替えてください。

この先、

Hybrid MBR から GPT にする場合は 3.1 を、
Hybrid MBR から MBR にする場合は 3.2 を参照してください。

(純粋な GPT ディスク から MBR ディスクにする場合も、 3.2 で紹介する方法が使えます。)

そして、
MBR から GPT にする場合は、番外をそれぞれ参照してください。

 

3.1 Hybrid MBR から GPT ディスクにする。

GPT fdisk (gdisk) version 0.6.14

Partition table scan:
  MBR: hybrid
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with hybrid MBR; using GPT.

Command (? for help): q

GPT が present になっていることを確認し、 q を打ち、いったん閉じる。

$ sudo dd if=/dev/zero of=/dev/sda bs=512 count=1

このようにコマンドを打ち(数値は小さくするのはいいですが、大きくするのはNG) MBR を消す。

$ sudo gdisk /dev/sda

GPT fdisk (gdisk) version 0.6.14

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with corrupt MBR; using GPT and will write new
protective MBR on save.

MBR が not present となり、削除されたことがわかる。

Command (? for help): w

w を打って Enter

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed, possibly destroying your data? (Y/N): Y

Y を打って Enter

 

あとは再起動すれば完了となります。

 

3.2 Hybrid MBR から MBR にする。

2 にて起動した状態のまま、

Command (? for help): r

r を打って Enter

Recovery/transformation command (? for help): g
Sorted GPT partitions and their current conversion status:
                                      Can Be
Number    Boot    Size       Status   Logical   Code   GPT Name
(なにかでる)

g を打って Enter

Type partition to change, 0 to accept, -1 to abort: 0

Converted 3 partitions. Finalize and exit? (Y/N): Y
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.

数字の 0 を打って Enter,  そして 次で Y と打つことで、変換が完了し、
再起動すると適用されます。


ということで、MBR や GPT に不整合が発生したりとか、
どちらかに統一した方が精神衛生上いいという人は、これで試してみてはいかがでしょうか。


ということで番外。特に、 MBR から GPT への変換は危険なにおいがするのですが、うーむ。

というのも、
GPT 形式のディスクは MBR 領域(ディスク先頭)と GPT 領域(ディスク末端)の両方を持っていますが、
MBR 形式のディスクは MBR 領域しか持っていないため、どうするのだろう。と。
末端のデータが壊れないのかなぁ、と心配だったりします。

 

番外。MBR から GPT への変換。

$ sudo gdisk /dev/sda

GPT fdisk (gdisk) version 0.6.14

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present

MBR : MBR only となっていることから、 MBR ディスクであることがわかる。

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed, possibly destroying your data? (Y/N): Y
OK; writing new GUID partition table (GPT).
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

w を押して Enter, Y を押して Enter

 

これで GPT ディスクに変換されます。

銀行丸めと四捨五入。


というわけで、端数の丸め処理についてです。

端数処理ということで、たぶん思いつくのは、

  • 切り捨て
  • 切り上げ
  • 四捨五入

こんなところではないかと思います。

ここで、テストデータとして

11.4, 11.5, 11.6, 12.4, 12.5, 12.6

という6つのデータを用意します。
それぞれの処理についてですが、通り下記のようになります。

データ 切り捨て 切り上げ 四捨五入
11.4 11 12 11
11.5 11 12 12
11.6 11 12 12
12.4 12 13 12
12.5 12 13 13
12.6 12 13 13

 

C や C# そして Ruby や Java などでは、実数を整数に丸める際、
単純にキャストしますと切り捨てますが、

round 関数で丸める際に、挙動が異なります。

Python:
image

Ruby:
image

C#: (自作のシェル経由でごめんなさい)
image

 

C や Ruby, Java では四捨五入がデフォルトで行われますが、
C# では、銀行丸めがデフォルトで行われます。

正式名称は 「最近接偶数への丸め」と言いますが、
「銀行丸め」のほか、「JIS丸め」「ISO丸め」とも言われます。

[Wikipedia の解説記事]

JIS丸めとは?
http://homepage1.nifty.com/s_miyake/hp/jisround.htm

JIS Z 8401
http://www.jisc.go.jp/app/pager?id=94037

 

上の記事の文章を用いて、簡単に説明すれば、

N桁で丸める場合
第N桁が偶数なら 5以下は切り捨て。それ以外は切り上げ。
第N桁が奇数なら 5未満は切り捨て。それ以外は切り上げ。

 

この挙動について、
11.5 と 12.5 という2つの値を整数値に丸めるという場合で説明しますと、

まず 11.5 の場合。
整数値に丸めるので、整数第1位に丸めることになります。

この場合、整数第1位の値は 1 となり、「奇数」です。
次にこの一つ下の値を参照し、 5 であるため、奇数で5未満でないため切り上げ。

よって、 12 となります。

 

次に 12.5 の場合。

同様に整数第1位の値を見ると 2 となり「偶数」です。
一つ下の値は 5 であるため、偶数で5以下のため切り捨て。

よって、12 となります。

 

ただどうしてこういう丸め方をしているかというと、
主に銀行や統計などにおいて、誤差を小さくするために用いられています。

整数に丸める時の注意 – DiaryException
http://d.hatena.ne.jp/LaclefYoshi/20110430/1304138274

こちらの記事におもしろい実験結果がありますので、参照して頂けたら。

 

上記ブログで用いられている R という言語は、統計に特化した処理系ですので、
やはり誤差を抑えるために、銀行丸めが行われているものと思われます。

 

というわけで、先ほどの結果に、銀行丸めと合計を追加すると以下のようになります。

 

データ 切り捨て 切り上げ 四捨五入 銀行丸め
11.4 11 12 11 11
11.5 11 12 12 12
11.6 11 12 12 12
12.4 12 13 12 12
12.5 12 13 13 12
12.6 12 13 13 13

 

というわけで、統計やトレードなどを行う場合はありがたいわけですが、
どうしても四捨五入を行わなければならない場合があります。

その場合は、Math.Round(val) としているところを、

Math.Round(val, MidpointRounding.AwayFromZero);

とすることで解決可能です。

image

 

ではではー!

distcc と ccache でビルド高速化


みむらです。

複数台のマシンをお持ちの方、絶対いらっしゃいますよね。
ついでに、隅っこで寝てるとかそういうパターン、絶対ありますよね。

ということで、そういうマシンをコンパイルの際に利用して、是非とも効率よくパワーを使いましょう。

ついでに、ccache を有効にして、キャッシュしましょうという、そんなお話。

追記ですが、 Mac OS X にはこれがなにやら、標準で入っているそうです。
Mac マシンを大量にお持ちの方は、是非ともやってみるといいんじゃないでしょうか!


ということで、カーネルを並列ビルドすることを例にして、使い方。 (Linux Mint 12 でテストしてます。)

 

1.distcc と ccache をインストール。

$ sudo aptitude install distcc ccache

 

2./etc/default/distcc を修正する。

$ sudo vim /etc/default/distcc

# 書き換えるのは下記3点

# 動作を許可させる
STARTDISTCC="false" -> STARTDISTCC="true"

# 接続可能ホストを設定する。
ALLOWEDNETS="127.0.0.1" -> ALLOWEDNETS="192.168.1.0/24"

# リスナとなる NIC の IP アドレスを入力
LISTENER="127.0.0.1" -> LISTENER="192.168.1.200"

 

3. distcc を起動する。

$ sudo service distcc start

 

4. (操作マシン側にて) 接続先のホストを、 DISTCC_HOSTS に設定

(例 192.168.1.200 と 192.168.1.201 が処理マシンだった場合 )

$ export DISTCC_HOSTS="localhost 192.168.1.200 192.168.1.201"

 

5.ビルド

# configure を行う場合
$ CC="ccache distcc gcc" CXX="ccache distcc g++" ./configure

# make を行う場合
#
# なおこの場合、物理コア数の2倍を同時実行数に指定すると、
# なんかいい感じらしいです。
#
# http://distcc.googlecode.com/svn/trunk/doc/web/faq.html
#
# 今回の場合は、各ノードに 4スレッドの CPU が乗っていて、
# 自分と、それ以外の2台のマシンがあると仮定。
#

$ make -j 24 CC="ccache distcc gcc" CXX="ccache distcc g++" HOSTCC="ccache distcc gcc" HOSTCXX="ccache distcc g++"

たぶん、HOSTCC と HOSTCXX の指定は、カーネルビルドの時ぐらいしかいらない気がしなくも。
ついでに、 configure で CC と CXX 指定したら、 make 時はいらなそうな。

とりあえず、自分の備忘録ってことで。メモメモ。

 

追記事項としては、

ビルド環境のコンパイラとかインクルードファイルとかは一緒にしておいた方がいいよということ。
あわせておかないと、面倒なことになるようです。

ソフト面だけ合っていれば問題なさそうなので、ハードウェア面は、プロセッサのアーキテクチャが違うとか、
そういう系を除けば大丈夫だと思います。

シェア率を適当に見てみる。


久々にどうでもいい雑記をば。みむらです。

そういえば最近、みんなしてスマートフォンだったり、Mac だったり・・ということが騒がれていますが、
果たしてそうなんかいな! と。メディアのコントロールじゃないんかい。とかとか。

私は以前 Mac 使ってたこともあるので、好き嫌いっていうことではないですし、
スマートフォンもおもしろいなぁと思う人なので、正直グラフには興味ないんですが、
周りの知り合いとかが結構影響受けてるんじゃないかな、とかふと思ってみたり。

で、それで、ちょっとシェアを見てみます。まずはスマートフォン。

Source: StatCounter Global Stats – Mobile OS Market Share

一応このグラフは、日本マーケットに関してのグラフに設定してあります。

iOS のグラフだけ見てみますと、
ぽーんと一回値が飛び抜けて、じわりじわりと下がってきているように見えますが、
実際のところそんなことはなく。

image

実はこういう感じで、Android + iOS がシェアの9割以上を占めています。
今まで別の機種が優勢だったのに、いきなり飛び出てきましたからね。なんかおもしろいもんです。

特にメディアで操作されたとかは見受けられない感ではありますが、
(そもそも % で出されちゃっているので、数字が出れば全然違う気はしますが)

http://ja.wikipedia.org/wiki/IPhone#.E7.B5.B5.E6.96.87.E5.AD.97
ここを見る限り、 iOS の形勢が逆転する直前に、よく見てみると顔文字対応してるんですよね。

やっぱりこのあたり重要なのかなぁ、とかふと。

テレビで「スマートフォン」と言うと、 iPhone と Android になりますから、この結果は納得です。
(個人的には Windows Phone 7 がんばってほしいけどね!

 

次にOS ですね。

Source: StatCounter Global Stats – Operating System Market Share

Windows 系がひゃっほいなことになっていますが、年間びっみょうに変わってます。
全体的な傾向としては、新しいOSを出すとシェアが上がって、ちょっと下がってみたいな。

Mac 系は、結構メディアで騒がれているよりはシェア率が低いということに、
もしかするとびっくりされる方もいるのかも。

でも、徐々に値が伸びてます。 (Nov-08 から Jan-12 で 3.3% 増)

日本ではスマートフォンのように、コンピュータが1人1台のように「個人のもの」として
取り扱われるというようなことはあまりない傾向があるように思います。

携帯ですと、こう、コロコロ変えるひともいるんですが、PCとなるとやっぱり乗り換え時期があるので。。

ただ、実は現実のシェアはこうなのよ、ということで
メディア操作が結構現れているのではないかなとふと思ってしまう今日この頃。

 

なんだろう、これ書いてて思うのは、やっぱり値でほしいなぁと。
シェア率で出されても、もしかすると両方がともに増えている可能性もあるので。

でもまぁ、シェア率としては現在こんな感じですよーみたいな感じで。

みんなこっち使ってるから、さ! っていう指標に使うもよし、
徐々にこっちが伸びてるし! ってので、検討材料にするもよし。

 

結構こういうシェア率っていろいろと使えると思うんですよね。

SELinux で restorecon してあうあう。


もう、毎回のごとく忘れるので、備忘録。

動かない –> /var/log/audit/audit.log* を見に行く。
毎度のごとく「コンテキストがちげーぜお兄さん」と書かれてる。

そのときに、 chcon で片付けてしまうのが私のひどく悪い癖w

いやね、なんかの拍子に restorecon して、
ぶっ飛ばしてしまうわけですよ。

ということで、それも含めて幅広く、いろいろ備忘録。

 

*ファイル関連。

chcon (CHange file selinux security CONtext)

ファイルとかディレクトリのコンテキストを変える。
一時的にそのファイルに対して、特定のコンテキストを割り当てる時に使うと良さそう

# chcon –t httpd_sys_content_t /home/hogehoge/public_html/ –R

 

ls –aZ

ファイル・ディレクトリに設定されているコンテキストを表示する。
・・要は Z オプションをつける。

# ls –Z
drwxr-xr-x. hogehoge hogehoge unconfined_u:object_r:httpd_user_content_t:s0 public_html

 

restorecon (RESTORE file(s) default selinux security CONtext)

ファイルとかディレクトリのコンテキストをデフォルト設定に戻す。
後述する semanage で恒久的に変更した場合は、その設定に戻る。

(chcon の変更は、restorecon で復元される際に破棄される。)

# restorecon /home/hogehoge/public_html/ –R

 

semanage (SElinux  policy MANAGEment tool)

ファイルとかディレクトリのコンテキストをはじめとする、様々な設定を恒久的に変更する。
このコマンドで変更した内容は、今後もデフォルト設定として保持される。

(ポートに関しては後述)

設定取得 ( –l を使う ) :
# semanage fcontext –l

追加 ( –a を使う ):
# semanage fcontext –a –t httpd_sys_content_t “/home/hogehoge/public_html/(/.*)?”

削除 ( –d を使う ):
# semanage fcontext –d –t httpd_sys_content_t “/home/hogehoge/public_html/(/.*)?”

反映させる ( restorecon を使う ):
# restorecon /home/hogehoge/public_html/ –RF

 

*実行権限関連。

setenforce ( modify the mode selinux is running in. )

Enforcing (制約が施行されてる状態) と Permissive (制約が施行されていない[許可されている] 状態)
の2つを一時的に切り替える。

恒久的に変更する場合は、 /etc/selinux/config の SELINUX を書き換える。

有効にする:
# setenforce 1

無効にする:
# setenforce 0

 

getenforce ( GET the current mode of selinux )

現在、制約が施行されている (Enforcing) か許可されている (Permissive) か、
そもそも動いてないか (Disable) を返す。

# getenforce
Enforcing

 

setsebool (SET SElinux BOOLean value)

ポリシーを変更して、特定の動作を許可したり不許可にしたりという設定ができる。

# setsebool –P ftp_home_dir on

 

getsebool (GET SElinux BOOLean value)

ポリシーを取得したり、全列挙したりする。

全列挙:
# getsebool –a

特定の要素を取得:
# getsebool ftp_home_dir

 

ps –Z

プロセスのドメインを取得する。
・・・要は –Z をつける。

# ps –Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 15287 pts/0 00:00:00 bash

 

*通信ポート関連

semanage (SElinux policy MANAGEment tool)

ファイル操作は先述。プロセスが使用するポートなんかもここで設定。

ポートの設定を取得:
# semanage port –l

ポートの設定を追加 ( FTP を 11111 ポートで動作可能にする )
# semanage port –a –t ftp_port_t –p tcp 11111

ポートの設定削除
# semanage port –d –t ftp_port_t –p tcp 11111

 

とりあえず、こんな感じで。であであ。

Private