忍者ブログ

カウンター

プロモーション

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


  • 2024/04/19 13:23

fdisk コマンドのdoes not end on cylinder boundary. って何なの?

Linux 関連 調べ物

いつもの様に前置きが長いので先に概要を述べておきます。

今回の最終的なテーマ概要
Linux のfdisk コマンド先生does not end on cylinder boundary.とおっしゃいますが
 先生もっと具体的に教えて下さいよ! え? 調べろって事ですか???」
と言うことです^w^;

具体性を持たせて軽く説明すれば、fdisk コマンド先生は言ってくるんです!w
(黒箱PRO にDebian squeeze のインストーラーによるパーティショニングの例です)
root@debian:/# fdisk -l

Disk /dev/sda: 40.0 GB, 40020664320 bytes
255 heads, 63 sectors/track, 4865 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000ac41

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          32      248832   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              32        4820    38462464   83  Linux
/dev/sda3            4820        4866      368641    5  Extended
/dev/sda5            4820        4866      368640   82  Linux swap / Solaris

多分・・・シリンダでStart とEndの合致した所がマズイ!のだと思いますので、
上記について調べます^w^;

では長ぁーーーい前置き

ちょっとまった! その前に断っておきます。
前回のブログで黒箱PRO のTFTPブートによるインストールが成功したので次回のブログで述べます!って
書きましたが、こっちが気になってしょうがないので、こっちの話題からにします^^;

では長い前置きをどうぞ>w<;

超、常識的な技術っては、知らない間に使っていて、誰かに尋ねるのが恥ずかしいくらいではあるが、
その技術に依存して色々な物事に使っている場合があると思う。(独り言だと思って流してくれてもいい^^;)

例えば、オペレーティングシステム(OS)で平気な顔をしてハードディスクやSSDを使っているが、
それがうまく動かなくて困ると言うことは、なかなか無くて、いやむしろ、なかなか無いのではなく、
オペレーションとしてOSがエラー様の処理をしてくれるので、あまり気にしなくて良いことが多い。

だから複雑な作りをしているハズのハードディスクの技術的な事柄で躓くことなんて、
これまで少なかった、いやWindows という名のOS を使っている分に、
常日頃気にしなかった、多分、超効率を求めたりしなければ、気にしなくて良いのが
Windows というOSの設計なんだろうと思う。

しかしLinux を使い出すと、その複雑だという事柄すら、出来るだけ自分で噛み砕いて、
その複雑であろう根本から自由に指定して使おう!と言うのがLinux というOSだと思う。(UNIXね)

最近はPC上にLinux を入れたりしても、何も気にせずに使っていたが、
いざCUI環境だけで動かしたい!と思って黒箱RPO(ARMプロセッサ)に、
Linux を入れだして、些細な警告に悩んで思った。

今まで当たり前として使っていた事柄が、やはり凄い技術の上で動いていたと、
実感されることはとても多い。

しかし、考えているということは、そんなに前向きなことばかりでもないが、
やはり気になるか気にならないかで戻ってみたりして、結局考えたりして、
調べてみたりしている。

つまり、知ったからってどうってことでもないかもしれない、
しかし知ることを選んだなら知るべきだし、何度も考えるなら知る術を避けて通れないなら、
またもしくは、知らなければいけない何かを感じたり、
はたまた、知ることが苦でないならやってみたいと思ったり、
やっっぱり面倒だな・・・・ とか考えたり気苦労もして、色々人生観が決まるのが人間か?w
とかまで考えていることもあるだろう・・・・?(何の話だっけ・・・w)

そこでやっぱり忘れない程度にブログにでもその事柄を残そうと思った。
(結構複雑に単純な事を追求した、もしくは、単純なことを複雑に考えた?)

今回、なんだかやはり、考えないといけないと思ったことは、
Linux のコマンド、fdisk だった。その経緯を述べる。

単純に一言で言えば「Linux コマンドの fdisk のパーティションの状態出力の警告が気になって仕方ない!」
だけなんですが、突っ込みは如何様にでもどうぞ!?w

では具体的に、黒箱PRO へarmel Debian であるsquuze(Debian6系)をウィザードで入れると、
少々気がかりな現象がどうしても起こる、これは何度インストールし直しても、
やはり起こる、結局4度は色々やってみたが、どうしても起こるんです。(そんなに連続して入れ直すな!って?w)

それは、fdisk でマウントしているディスクを見ると、
「does not end on cylinder boundary.」と出て、パーティションとパーティション間で、
シリンダーをまたいだ読み書きが発生していると警告される。

つまりこれはどういう警告なのか? 気にするべきことなのか???
結局はハードディスクの作りの理解をどうしても必要とし、
物事を噛み砕くのを目的としてブログに載せようと思ったので、
基本的なハードディスクの説明を調べて述べてみる。

何か他のサイトでは、書き込みの仕組みと、書き込みの単位の事柄、
説明の順序が一緒で分かりにくく思えたので、自分で極力分けて
くどいくらい噛み砕いて書いてみた。

   ○○○ハードディスクの機械的な機構表現○○○

1.円盤があり、これをプラッタと言う。
2.プラッタは両面に記憶領域を物理的にもっている、つまり両面が記録面である。
3.記憶領域を読み書きする為にヘッダという読み書き装置がついている。
4.ヘッダはプラッタの面に対して水平に往復移動運動をして記録領域を決める、
 この移動動作をシークという。
5.ハードディスク内部のプラッタは1枚とは限らず、プラッタは複数枚あるのが一般的。
6.プラッタは同じ回転するプラッタの軸に固定されている為、同一回転角、同一回転数で回っている。
7.プラッタの両面それぞれ記録面を持つ為、プラッタの両面にヘッダがある。
8.複数のプラッタがあれば、複数のヘッダがあるが、全てプラッタ上のヘッダは、
 同一の1つのヘッダの軸を元に固定され全て同じ動きをする。
9.プラッタはプラッタごと連動、ヘッダはヘッダごと連動して動く事から、
 一回のシークで読み書きできる記録面は、ヘッドの数だけ増える事になる。
10. 9.の同時に記録できる場所の数を、プラッタに対するヘッダの往復連動を、
 エンジンのシリンダに見立てた意味合いで、シリンダと言う単位を用いて表現する。


   ○○○ハードディスクの論理的な記録表現○○○

11.ヘッダがプラッタに対して書き込む1つの領域は、セクタと呼ばれる、
 1セクタは512バイトとされるのがセオリーだ。
12.ヘッダはプラッタに対して移動するが、プラッタは回転しているので、
 円盤を円を描く様に読み書きすることになる、この部分は一直線の円となり、
 トラックと呼ばれる、陸上系の競技場のトラックと同一な意味合いで考えれば分かり易い。
13.一度トラックにシークした後、わざわざ再度シークさせて他のトラックに
 分散させて再度シークするのには時間の無駄がある、一度シークすれば、そのトラックに
 連続して書き込めば書き込みスピードも速く、整列したデータが取り扱える。
14.13.でいう連続したトラックに書き込む大きさをクラスタと呼び、
 そのクラスタの大きさはファイルシステムの形式などで選べたり依存する。


   ○○○ハードディスクの総合的な書き込みの時間と書き込みの効率化○○○

15.複数のプラッタに対して1度のシークで、それぞれのプラッタに、
 同一の1つまとまった情報を、ヘッダの数だけ分散して情報を書き込めば、
 高速化に繋がる。
16.逆に言えば、シリンダーとして見立てているのに、個々のプラッタ上の
 ヘッダが、別々の情報に対して読み書きをしていると、1つの情報に対して読み込む為に
 シークをしても、他の場所にまたシークして続きを読み込まなければいけない事が増える、
 つまり1度に書き込める量が増える使い方をするのならば、同じ情報に対して書き込むべきだ。
17.クラスタの大きさが変えられる場合、クラスタのサイズを大きくして、
 クラスタのサイズよりも小さな情報を沢山扱うとディスクの無駄が大きい。
18.クラスタの大きさが変えられる場合、クラスタのサイズを小さくすると、
 記憶領域を純粋に読み書きしたい領域以外に、プラッタの管理領域として
 記憶領域を使ってしまうので効率が悪い。

前置き終わりかな・・・

さて、やっと・・・・・・・・話は戻り、黒箱PRO(でなくてもいいかもしれないけど)のLinux で
fdisk がとやかく警告を言ってくる件は、多分、
「インストールウィザードのパーティションの区切り方が、シリンダ単位でなく、要領単位で区切ってしまう」
という厄介な方法を取っているからだと予想します(と先に述べる)。

つまり、上記のハードディスクの仕組みから読み解けば、
同一シリンダの読み書きの最中に、他のパーティションをまたぐと、効率が悪くなると、
それが多分fdisk コマンド先生はおっしゃっているんだと思う(と先に述べる)。


一応、パーティショニングを黒箱PRO のNAND(256M)のBusyBoxのfdisk コマンドによって、
手動で区切りなおした。インストールはまだだから、そのパーティショニングをLinux が
使ってくれる?のかは分からないけど、多分大丈夫??だと思う。
もしかすると、インストーラーに向けた設定も必要になるのかまでは、調べていない。



~ # fdisk /dev/sda

The number of cylinders for this disk is set to 38166.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-38166, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-38166, default 38166): 245

Command (m for help): a
Partition number (1-4): 1

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (246-38166, default 246):
Using default value 246
Last cylinder or +size or +sizeM or +sizeK (246-38166, default 38166): 37784

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
e
Partition number (1-4): 3
First cylinder (37785-38166, default 37785):
Using default value 37785
Last cylinder or +size or +sizeM or +sizeK (37785-38166, default 38166):
Using default value 38166

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (37785-38166, default 37785):
Using default value 37785
Last cylinder or +size or +sizeM or +sizeK (37785-38166, default 38166):
Using default value 38166

Command (m for help): t
Partition number (1-5): 5
Hex code (type L to list codes): 82
Changed system type of partition 5 to 82 (Linux swap)

Command (m for help): p

Disk /dev/sda: 40.0 GB, 40020664320 bytes
64 heads, 32 sectors/track, 38166 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sda1   *           1         245      250864   83  Linux
/dev/sda2             246       37784    38439936   83  Linux
/dev/sda3           37785       38166      391168    5  Extended
/dev/sda5           37785       38166      391152   82  Linux swap

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
SCSI device sda: 78165360 512-byte hdwr sectors (40021 MB)
SCSI device sda: drive cache: write back
 sda: sda1 sda2 sda3 < sda5 >
SCSI device sda: 78165360 512-byte hdwr sectors (40021 MB)
SCSI device sda: drive cache: write back
 sda: sda1 sda2 sda3 < sda5 >
Syncing disks.
~ #

結局、赤色で表示した、シリンダのEND とSTART の合致
手動で値をずらして回避してみた。 これがやってみた回避策でした・・・


ちょっと余談

念のために述べておくが、これは私のハードディスク(SSDだけど)を元に計算した値を使っているので、
自身のハードディスクの値は、
自分のディスクの1つのシリンダの値 x 指定したスタートとエンドのシリンダの大きさ x 512バイトで出せるので、
例えば私のSSDは、1つのシリンダの値が2048と私のブログにある通り表示されるので、
400Mバイト付近のスワップファイルを作ろうと思った場合、
400,000,000 ÷ 2048 ÷ 512 とすれば、381.1469・・・みたいになる。

(私は100円電卓を使って計算したので、100円電卓だと 表示が8ケタなので^^;
40,000,000 ÷ 2048 ÷ 512 として出た値、38.11469・・・を10倍している)

計算してみると、スタートとエンドのシリンダの差が381付近が400Mあることが分かると思う。
私の場合、なんとなく容量が大きいディスクだし、表示で400Mを切っているのはなんだかなぁ?って思ったので
切り上げて382にして計算しました。

さてここで問題、私の場合の400M以上にしたい場合の実際にパーティションの値は、
数値の都合上、エンドのシリンダー - スタートのシリンダー +1 = 382 である。

なぜかって?
それはスタートの値が0 で計算した場合、1がエンドだと、1シリンダー使った計算になる・・・?
ハズレ!!!
0がスタートで1で終わりは、0と1の2シリンダー分、つまり2シリンダー使った計算になるから。
数のマジックなので、引き算をするとスタート地点のシリンダーは排除してしまうので+1した値が実際の値です!!!
気をつけて。


た、かなり話は変わります。

fdisk で赤字に下線で書いた部分、なぜか当初はヘッドの数が255でしたが、
後から64になっているのです・・・

これじゃ全く別物のSSDじゃないですか・・・・
私が意としていないのに、SSDがなのか、OSがなのか、
勝手に仮想化した内部構造を変えてしまっています!!!
計算も確かに合ってそうですが、だけどなんか・・・変な気分です。
結構問題あるんじゃないかと思います、パーティション区切った後のログとか、
他のソフトウェアが記憶して値を流用していたとすれば、
途中で値が変わると、ファイルシステム情報が崩壊している様に見えるかもしれないです・・・よね?!

理由が分からないですが、SSDの扱いが内部的に変わることなんてあるのでしょうか???
LBAで仮想化されているし、私の場合はSSDなのでヘッドの数とかそういう問題はむしろ無いはずですが、
かなり気持ちが悪いです。

SSDの構造をハードディスクと見立てた時に、メーカー独自にメモリアクセスを
並列化させて高速化していたりすると、実際には話しは変わるでしょうが、
レガシーな規格に対して逆行までして物理的に同一にわざわざ見せなくても
十分に電気的な溶媒に置き換わっただけでシリンダの考えは問題視しなくても
良い気もします・・・

正直、パーティションとパーティション間で、シリンダがかぶっている様に見えているのは、
SSD ではどうでもいいことかもしれない。

けど思ったのは、良く考えたら、クラスタの大きさはファイルシステム形式で依存しているから、
ファイルシステムがディスクの作りを考慮して読み書きの単位をシリンダや、クラスタ単位を
意識している読み書きならば、シリンダをまたぐパーティションは、ディスクIOの同時アクセスの手数や、
ディスクアクセスによるロックや、シークタイムのウェイトなどで、
何処かで微妙に良いことが無いんじゃないかな?って思えた。

SSDだからといって、ファイルシステムにアクセス方法がゆだねられている以上、
シリンダをまたぐファイルシステムは余り宜しくないと思えて仕方ない。

つまり、少し言い換えると、きっちりとファイルシステムとクラスタは依存していると言えるので、
SSDだからシリンダとは関係しないよ、だからシリンダ内でパーティションを
またぐ使い方をしていても大丈夫だよ?なんていうのはどうも
嘘になることもあるんじゃないかなって予想した。


やっぱり出来れば、きれいにシリンダーをまたがないパーティションを切るべきだと思った。

Linux の設定でいつも困らないのは、本当の意味の解決を探したいからこそ、
その答えは、どのLinux 環境でも依存しない共通設定方法
見つけることかもしれないと思った。

Linux は奥深い。 
やっぱりまだ、本当の結論には達していないが、これで超長い考えたときのメモを終わろうと思う。

お粗末でした<_ _>

拍手[1回]

PR


  • 2012/04/17 23:21

コメント一覧

  • お名前
  • Email

  • コメント

  • Vodafone絵文字 i-mode絵文字 Ezweb絵文字
  • パスワード
[PR]