パーティションテーブルはどこにあるのか?

ハードディスクアクセス方式「CHS」と「LBA」の違い - What am I looking for?
Linuxでは、パーティションテーブルの情報が得られるコマンドがfdisk -l(LBA方式なら-lu)ということでしたが、では、そのパーティションテーブルはいったいどこで管理されているのか?という話。

「1.2.2 古くて新しいパーティションテーブル」より

第0セクタにあるMBRの446~509バイト部分がパーティションテーブルです。
MBRの0~445バイトは、いわゆるブートストラップローダ、すなわちサーバ起動時に最初にBIOSが読み込んで実行する、GRUBのステージ1が書き込まれています。
(中略)
1セクタのサイズは512バイトですので、510~511バイト(0バイトが先頭なので最後は511バイトですね)の2バイトが余りますが、ここにはお約束で0xAA55という値が記録されます。この値が異なっているディスクは、MBRが壊れていると判断されます。

ふむふむ。ディスクの第0セクタを拙いAAで図示すると

第何セクタか→|                       0                           |   1   |   2   |   3   |
       バイト部→|      0~445      |      446~509     |  510~511  | 0 ~ 511 | 0 ~ 511 | 0 ~ 511 |
    なんの領域か→| ブートストラップローダ | パーティションテーブル | お約束0xAA55 |  ???  |  ???  |  ???  |

さらに、

パーティションテーブルのサイズは64バイトしかありませんので、それほど多くの情報は書き込めません。代表的な情報として、角パーティションについて、「CHS方式で表現したパーティションの開始位置と終了位置」、および「LBA方式(セクタ番号)で表現したパーティションの開始位置とセクタ数」が記録されます(終了位置のセクタ番号は記録されません。開始位置にセクタ数を足して計算します)。

パーティションテーブルのダンプ出力コマンドとその出力結果も記載されていたので、実際に自分のマシンで打ってみた。コマンドが謎の呪文にしか見えないし、出力結果も16進数なのでカオス。

>hexdump -s 446 -n 66 -e '8/1 "%02x " 2/4 "%0d " "\n"' /dev/sda
80 01 01 00 83 fe ff ff63 154304262
00 fe ff ff 82 fe ff ff154304325 1959930
00 00 00 00 00 00 00 000 0
+
55 aa               

やっていることは、MBRの446バイトから66バイト分をhexdumpでダンプ出力しているとのこと。
それぞれの列が表している情報は、16進数2桁で1バイトなので、左から順に
ブートフラグ(1バイト)、開始位置(CHS方式)(3バイト)、パーティションID(1バイト)、終了位置(CHS方式)(3バイト)、開始位置(セクタ番号:LBA方式)(4バイト)、セクタ数(LBA方式)(4バイト)、とのこと。
また、上の出力結果の最終行に表示されている05aaについてヒントが記載されていて

ちなみに、最後の2バイトは先に説明した0xAA55です。図1.3の最後が0x55AAに見える人は「リトルエンディアン」について調べることを宿題にしておきましょう。

ですと。

一応hexdumpの出力結果をfdisk -luの出力結果とも比較してみる。

>fdisk -lu
ディスク /dev/sda: 160.0 GB, 160041885696 バイト
ヘッド 255, セクタ 63, シリンダ 19457, 合計 312581808 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00007b0d

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *          63   154304324    77152131   83  Linux
/dev/sda2       154304325   156264254      979965   82  Linux スワップ / Solaris

(ちょっと古いマシンなので160GBしかないんだよ。もともとWinXPマシンだったものにUbuntuを乗っけたのです。)
さっきのhexdump結果だと63セクタから数えて154304262セクタ分までが、154304325セクタから数えて1959930セクタ分までががそれぞれ独立したパーティションとのことだった。
fdiskコマンドの1つ目のパーティションの終点154304324は、
63+154304262-1(63セクタ目1つ分を引く)
から。2つ目のパーティションの終点156264254は、
154304325+1959930-1(154304325目1つ分を引く)
から導けて、確かに一致した。

ハードディスクアクセス方式「CHS」と「LBA」の違い

昨日購入。「1.2ディスクとファイルにまつわるあれこれ」から、以下まとめ。

コンピュータがハードディスク上の読み書きしたいデータへアクセスする方式にCHS方式とLBA方式がある。
現在のハードディスクへのアクセス方式はLBA(Logical Block Addressing:論理ブロックアドレス)方式が一般的。

  • CHS方式
    • CHS方式のCHSはシリンダ(Cylinder)、ヘッド(Head)、セクタ(Sector)の頭文字が語源。
    • データを読み書きする1つのセクタ(物理的なディスクアクセスの最小単位)はCHS値(何番目のシリンダ、何番目のヘッド、何番目のセクタにアクセスするか:「ジオメトリ情報」とも呼ぶ)を指定して決定する。
    • CHS方式では、物理的なハードディスクの構造を意識して指定する必要がある。実際にはLinuxのデバイス・ドライバがCHS値を計算して、ディスク装置とデータのやりとりをするので、ユーザがこの値を意識することはない。ただしディスクパーティションの作成時にはユーザが意識する必要がある。
    • 昔のMS-DOSの仕様では、ディスクパーティションをシリンダ単位で分ける必要があった。シリンダはディスクの外側から番号付けされており、ディスクの外側から順に第1パーティション、第2、第3...とパーティションが作られる。
    • fdisk -lコマンドで何番目のシリンダから何番目のシリンダまでが第何パーティションかというパーティションの区切り情報(パーティションテーブルのリスト)が得られる。
  • LBA方式
    • ハードディスク内のすべてのセクタに0からの通し番号(セクタ番号)を降っておき、この番号でアクセスするセクタを指定する方式。
    • (論理的な)セクタ番号と物理的なセクタの位置の対応は、ハードディスクのコントローラに内臓されたファームウェアが計算する。
    • 通常、セクタ番号が小さいほどディスクの外側の領域を使用する。
    • fdiskコマンドに-uオプションを付けて実行することによって、セクタ番号によるパーティションの区切りを表示することができる。

Ubuntu 2.6.32-41-generic でのfdiskコマンドhelp

>uname -a
Linux MyUbuntu 2.6.32-41-generic #90-Ubuntu SMP Tue May 22 11:31:25 UTC 2012 i686 GNU/Linux
>fdisk --help
Usage:
 fdisk [options]     change partition table
 fdisk [options] -l  list partition table(s)
 fdisk -s       give partition size(s) in blocks

Options:
 -b                  sector size (512, 1024, 2048 or 4096)
 -c                        switch off DOS-compatible mode
 -h                        print help
 -u                  give sizes in sectors instead of cylinders
 -v                        print version
 -C                specify the number of cylinders
 -H                specify the number of heads
 -S                specify the number of sectors per track

シェルコマンドの並行性

[rakuten:hmvjapan:11795804:detail]

P34. Memo
パイプライン中の各コマンドは、OS上で並行処理で同時に実行され、また、パイプを通る標準入出力のデータは、テンポラリファイルを使用せずに受け渡されるため、パイプラインは非常に効率のよい実行方法です。

な、なんと。パイプライン中の各コマンドは並行処理されるのか。
すげーと思いつつ活用シーンがすぐに思いつかない。
grep A | grep B みたいに、grepした結果をさらにgrepで絞り込む処理とかだと先のgrepが処理完了するまで後のgrepが待たされる気がする。



15分後くらいに追記:
grepだとダメだね。grep対象のリソースファイルが前後のgrepで共有してるからね。競合してしまうものね。
共有リソースをつかわない処理だったらいいかんじに並列処理してくれるのかな。


30分後くらいに追記:
いやgrepでも並行処理を有効活用してる気がしてきた。
先のgrepでは対象のファイルをまずメモリに展開してそのgrep結果をメモリに展開し、その結果を後のgrepが処理しているんだから参照してるメモリ空間は別物だと思われ、
先のgrep結果が出たらそれをいそいそと逐次処理している後のgrepが思い浮かんだ。

CentOS5にSubversionインストール

下のページ参考にさせて頂きました。感謝。
http://wiki.minaco.net/index.php?Linux%2FSubversion%2Fyumからインストール

SELinuxが動いてると下のメッセージが出るらしく、上のページに確認事項で書いてあったのに見落としていて、1時間くらいハマった。。

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<D:error xmlns:D="DAV:" xmlns:m="http://apache.org/dav/xmlns" xmlns:C="svn:">
<C:error/>
<m:human-readable errcode="13">Could not open the requested SVN filesystem</m:human-readable>
</D:error>

Shellコマンドライン編集用のキー入力(不完全)

シェルのコマンドライン操作するためのキー入力をよく忘れるのでメモ。

たいがい動作内容を表す英単語の頭文字に由来したキー入力になってるから、
キー入力の由来となる英単語もセットで覚えれば、もしもキー入力を忘れてしまっても、
動作内容から英単語を想像して、キー入力を思い出せるので
自分は、キー入力の由来となる英単語もセットで覚える(プログラム言語のAPI然り)。
対となる概念もセットで覚える。

移動

カーソル移動
Ctrl + b 左に1 文字移動(backward)
Ctrl + f 右に1文字移動(forward)
Ctrl + a 行頭の移動(ahead)
Ctrl + e 行末に移動(end)


カーソル移動(単語単位)
Esc, b 1単語分、左に移動(backward)
Esc, f 1単語分、右に移動(forward)

文字列操作

文字の削除
Ctrl + d カーソル上の1文字を削除(delete)
Ctrl + h カーソルより左の1文字を削除(???)


単語単位の文字列の削除
Esc, Delete or Esc, Backspace 単語上のカーソルより左の1単語を削除(delete)
Ctrl + w カーソルより左の1単語を削除(word)
Esc, d 単語上のカーソルより右の文字列を削除(delete)


文字列の削除
Ctrl + k カーソルより右の文字列を削除(kill)
Ctrl + u カーソルより左の文字列を削除(???)


取り消し
Ctrl + y 最後に「文字列の削除」で削除した文字列を取り出す(yank)

CentOS6.0でホスト名を書き換える

/etc/sysconfig/network
でホスト名を管理しているので、エディタで編集。


[root@localhost ~]$ vi /etc/sysconfig/network


NETWORKING=yes
HOSTNAME=localhost.localdomain


HOSTNAMEをlocalhostからcentkunに変更


#HOSTNAME=localhost.localdomain
HOSTNAME=centkun.localdomain


OSを再起動すれば、プロンプトのホスト名が変わっていることを確認できる(プロンプトにホスト名が表示される設定になっていることが前提)。


[root@centkun ~]$


環境変数HOSTNAMEも変わっている。


echo $HOSTNAME// centkun.localdomain

Mac Book AirでVirtualBox上にCentOS6.0をネットワークインストールしてみる(大雑把備忘録)

※この記事はあくまで個人的な備忘録かつ初心者のやっていることなので、いろいろ情報が抜けています。参考に同じような事をやろうとする人は、他の詳しいサイトを見たほうがいいです。

VirtualBoxをインストールすると、マシン上で動いているメインのOS(ホストOS)上で、仮想的にOS(ゲストOS)を動かせる。

今回はゲストOSとして、サービス用として信頼が高いらしいCentOSの最新版である6.0をインストールしてみる。(なぜ信頼が高いかは知らないのであとで調べる)


1.まずはVirtualBoxインストール。
http://www.virtualbox.org/wiki/Downloads へアクセスし、
VirtualBox {最新のVirsionナンバー} for OS X hosts をダウンロード。
ダウンロードしたdmgを展開後、流れに沿ってインストール。(詳細は省略)


2.CentOSのOSイメージ(ネットワークインストール用)入手
http://mirror-status.centos.org/#jp
から、生きてる健康なサーバを選択(自分はhttp://ftp.riken.jp/Linux/centos/を選択した)。
http://ftp.riken.jp/Linux/centos/6/isos/x86_64/
まで、ディレクトリを辿ったら、
CentOS-6.0-x86_64-netinstall.iso
をダウンロード。


3.CentOSインストール(細かい設定は省略、他サイト参照)
VirtualBoxを起動して、新規仮想マシンを作成。
CentOS-6.0-x86_64-netinstall.isoを仮想CDドライブにマウント。
・途中、ネットワークインストールさせるimage.isoを指定させるところがあるので
http://ftp.riken.jp/Linux/centos/6/os/x86_64/images/直下のinstall.imgを指定。
・以降流れに沿ってインストール(詳細は省略)


しかし、Mac Book Airはいいね。久しぶりにいい買い物したわーって気分。