こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

デバイスファイルの考え方

UNIX系OSに初めて仕事に入ったのですが
上題の考えがうまく理解できません。

その1:
例えば、/dev/dsk/c0t0d0s0 と /dev/rdsk/c0t3d0s5 と2件表記
された場合はディスクが2本ある・・という解釈になるのでしょうか?。

あと「/var」などに領域を割り当てする場合、「/dev/dsk/c0t0d0s0」など
物理的なパスを指定するのでしょうか?。

その2:
「スライシング(スライス・ナンバー)」とはどういった意味なの
でしょうか?。「パーティション」との違いが良くわかりません。。

すみませんが一部でも結構ですので
ご教授願います。

投稿日時 - 2006-04-12 01:19:12

QNo.2086687

すぐに回答ほしいです

質問者が選んだベストアンサー

ちょっと誤解があるようなので.
キャラクタデバイスは別名RAWデバイス(RAW=ナマ)ともいいます.

デバイスに直接アクセスできるのがRAWデバイスファイルで,ブロックI/Oバッファキャッシュを経由するのがブロックデバイスファイルです.

バッファキャッシュを経由しない分,RAW(キャラクタ)デバイスの方が高速にアクセスできます(出来る可能性があります).そのかわり,デバイスの特性に合致したアクセス形態しか許されません.たとえば,(たいていの)HDDは512バイト,CD-ROMは2048バイト,といった単位でその倍数の位置からのアクセスしかできません.

ブロックデバイスファイル経由でアクセスした場合,デバイスの物理的なブロックサイズをバッファキャッシュが吸収してくれます.ブロックサイズ512バイトのHDDでも,512バイトではなく好きな量の読み書きが可能です.たとえば,1バイトだけ書き換えることも可能です.この場合,バッファキャッシュがディスクから1ブロックを読み出し,キャッシュ上で1バイトを書換え,ブロックを書き戻す操作をしてくれます.

ファイルシステムとして読み書きする際は,ディスクのあちらこちらをアクセスするということから,キャッシュが有効に働くのでブロックデバイスを用います.というか,ファイルシステムのためにバッファキャッシュが開発されたと言って良いでしょう.

ディスクデバイスをRAWデバイスファイル経由でアクセスするのは限られた場合だけです.
・disklabelやfdiskやfsckなど,ディスク管理
・バッファキャッシュに邪魔されたくない操作
・ボリューム単位のバックアップでディスクを頭から順に読み書きする

ブロックデバイスファイルは,HDDやCDROMなど,ランダムアクセス可能な記録メディアに対してだけ提供されます.

なお,多くのUNIXでは/devにデバイスファイルがありますが,Solarisでは/devices/の下のデバイスファイルへのシンボリックリンクが/devにありますね.

投稿日時 - 2006-04-23 00:30:35

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

デバイスファイルってのは質問どおり2種類あります。
でも両方とも同じディスクを表しているんです。
/dev/dskの下に配置される論理パスは通常はブロックデバイスって言います。
一方の/dev/rdskの下に配置される論理パスはキャラクタデバイスって言います。
この2つ共に同じディスクを元に作成される論理パスなんですが、OSが使う用途によって分けているものです。
具体的に言うとブロックデバイスってものは処理に必要なデータをブロックという単位で転送します。
1ブロックは512バイトなんですが簡単に言えばこの種類のデバイスを指定した場合はOSは512バイトずつ読み書きするってことです。
通常ディスクへのアクセスはこちらが使用されます。
じゃあ一方のキャラクタデバイスはって言うと、こっちは処理に必要なデータを1キャラクタ(1バイト)ずつ転送します。
細かな処理はできますがブロックデバイス程のスピードではアクセスできません。
例をあげて言うならこんな感じでしょうか?
プールに水が入っていたとします。
ここから水をかき出すときにバケツを使うのか、それとも茶碗を使うのかって感じですかね。
バケツを使えば一度にたくさんの水を出せますけど細かな調整は難しいですよね
一方の茶碗を使えば出す量はバケツに及びませんけど細かな量調整ができますよね
この場合プールってのがディスクでバケツを使うってのがブロックデバイス、茶碗を使うってのがキャラクタデバイスって事にあたります。
カーネルは使用する用途によってこの2つを使い分けているんです。
と言っても私たちユーザは直接カーネルに指示を出したりできませんからコマンドを使って指示を出しますよね
つまりコマンドの引数指定で指示するときに使い分けているんです。
基本的にほとんどのコマンドでデバイスファイルを引数として指定する場合キャラクタデバイスです。
ブロックデバイスを指定するコマンドは少なくてmount、umount、dfぐらいです。
mountコマンドで例をあげるなら
mount△[オプション]△「ブロックデバイスファイル名」△「マウントポイント」
これがmountコマンドの書式ですよね
一方キャラクタデバイスを使用するコマンドは
newfs△[オプション]△「キャラクタデバイスファイル名」
こんなコマンドですよね。
こんな感じでコマンドによって勝手に使い分けしてますから使う側の私たちはそんなに気にしなくてもOKです。
これが1つ目の質問の回答です。
領域を割り当てるってのはおそらくマウントするってことだと思いますが、上に書いた通りブロックデバイスを指定します。
ちなみに/devの下にあるデバイスは全て論理パスです。
コマンドで/devices配下の物理パスを指定するものは無いと思いますよ。
2つ目の質問ですがスライスってのは論理ディスクWindowsで言ったらパーティションにあたるものです。
ただしIA-Solarisの場合はちょっと違いがあります。
IA-SolarisはWindowsなどの別OSとのデュアルブートを行うために1本のディスクの中にSolaris専用領域であるソラリスパーティションをまず作成します。
そしてそのソラリスパーティションの中をスライスで論理的に分けて使用しています。
ですから混乱しやすいですがWindowsで言うパーティションにあたるのは厳密に言えばソラリスパーティションのことです。
SPARCマシンの場合はそもそもWindowsとデュアルブートってのがありえませんからパーティションってのはスライスとほぼイコールだと思ってもらってかまわないと思います。
最後に論理パスの命名規則ですが、デバイスの名前ってcxtxdxsx(xは0から始まる数字)ですよね
ここで”c”ってのはコントローラ#
これはSCSIなどのコントローラのチャネルにつけられる番号です。
ですからデュアルチャネルのSCSIはコントローラ#を2つ持っていますよね
”t”ってのはターゲットID、わかりやすく言えばSCSI IDやファイバでのループIDなんかがこの番号です。
”d”ってのはディスク#(LUN#)普通はLUN#っていうかな
LUNってのはLogical Unit Numberの略です。
なんに使うのかっていうと、同じSCSIチャネルから接続されてかつ同じSCSI IDを持つディスクが複数ある状況が想像できるでしょうか?
つまり1本目のディスクがc1t1で始まってます2本目のディスクもc1t1で始まっている。
この状況下以外では”d”に意味は無いですよね
そもそもチャネルが違うなら”c”の番号が違うんですから”d”の番号を変える必要が無いです。
SCSI IDが違うならやっぱり”d”の番号を変える必要は無いですよね。
この状況がわからない場合はLUNの意味はわからないと思います。
結論から言えばRAID装置を使用した場合、この状況になります。
RAID装置ってのは中にたくさんのディスクを入れて複数のディスクを使って論理的な冗長化されたディスクを作る技術ですよね。
このとき作成される冗長化された論理的なディスクのことをLUNって言うんです。
ですが1台のRAID装置の中には複数のLUNが作成できます。
ここで”d”の数字が活躍します。
だからLUN#って言うんです。
ちなみにどう活躍するのかって言うと
RAID装置のターゲットID(tの数字のことです。最近はファイバチャネルの場合が多いんであえてSCSI IDとは書きません。)ってどこでつけられると思いますか?
普通IDはディスクをコントロールする基盤でつけられます。(ファイバチャネルのファブリック接続の場合はちょっと違いますがここでは考えないでください)
RAID装置の場合、RAID装置の筐体の入り口であるRAIDコントローラ部分でつけられるってことです。
つまり同じコントローラの下にあるLUNは全て同じターゲットIDになるってことです。
こういう状況では”c”の番号も同じ、”t”の番号も同じになってしまいます。
ここでディスクを区別するのにLUN#を使うんです。
これがLUN#の使い方です。
最後に”s”は言うまでも無くスライス#です。
こんな感じでしょうか?

投稿日時 - 2006-04-22 22:06:38

ANo.6

UNIXでディスクパーティションは伝統的には,a,b,c,d,e,f,g,h(a=0,h=7)とアルファベットで表してました.Solarisも2.0の時代あたりまでは/dev/sd0a みたいなデバイス名でした.

パーティションとは論理ディスクのこと,と思ってまぁ間違いないです.
ディスクの領域を分割して,あたかも(小さい容量の)単独ディスクであるように扱えるようにしたもの.
そのパーティションの識別に,番号を使う場合とアルファベットを使う場合がある.ただしアルファベットを使うのは人間が使う呼称であって,コンピュータの中身では aパーティション=パーティション番号0 です.

おっと,「領域分割」といいましたが,正確にはディスクのうえの領域を決めたものです.
あるパーティションがディスク全体に対応するとか,二つのパーティションがディスク上で重複した領域を占めることもあります.後者のような場合は,もちろん重複があるパーティションはその一方しかアクセスしてはなりません.

そうそう,「物理的なパス」というのは意味不明です.UNIX系の世界ではそのような用語は使わないので,何を質問したいのかわかりませんでした.

投稿日時 - 2006-04-13 14:14:17

ANo.5

#2 です.
「ターゲット」, 「LUN」, 「スライス」については私が聞かれていると思うので簡単に.
まず「スライス」ですがこれは PC でいうところの「パーティション」.
残りの「ターゲット」, 「LUN」はどちらも SCSI の用語です. こっちの用語はうろ覚えであまり詳しくないんですけど....
データのやりとりをしたいときに, 普通は SCSI HBA (host bus adapter = コントローラ) から「データを持っているデバイス」に「データを送るからね~」とか「データを送ってくれ~」とか命令を送るわけですが, そのときに「コントローラ」を「イニシエータ」, 対象となるデバイスを「ターゲット」という... だったような.
SCSI の規格上 1本のバス上に複数のデバイス (コントローラも含む) があるときには個々のデバイスが異なる ID を持たなければならないわけですが (この ID の個数は, 実はバス幅と等しいのでナローだと 0~7 の 8個, ワイドだと 0~15ないし31), 各デバイスがさらに複数の機能を持っていてもかまいません. その場合に, 「複数の機能」を区別するために「LUN」を使います. 1個しか機能がない場合には自動的に LUN=0 ですが, 複数ある場合には 1以上の値をとります. まあ 1以上の LUN を見ることはあまりない (単独のディスクであれば LUN=0 で固定) んですが, 一部の CD チェンジャーで使っています. あと, 複数のディスクからなる装置 (ディスクアレイ) でも使う例があったかな?
ということで, SCSI では 1本のバス上で機能を特定するためには SCSI ID で指定される「ターゲット」とそのターゲットの持つ機能を区別する「LUN」の両方を使い, そのことから Solaris のデバイスファイルでも t?d? という形でターゲットと LUN を指定します (その前にコントローラを指定する c? もありますが). ディスクの場合には d0 が自動的に決まって, そのディスクのうち「どこのスライス=パーティション」をアクセスするか, を s? で指定するというしくみだったと思います.
結局, c0t3d0s0 だと「コントローラ 0 (c0)」(1番目の SCSI コントローラ) の「ターゲット3 (t3)」 (歴史的事情により SCSI ID の 0 と 3 がそれぞれターゲット3 と 0 になったような気がするので SCSI ID=0 のターゲット) の「LUN 0 (d0)」 (普通のディスクなら d0 で固定) にある「スライス=パーティション0 (s0)」という意味.

投稿日時 - 2006-04-13 12:54:30

ANo.4

>この4つというのはディスクあたりに、Solarisがデフォルトで用意する
>デバイス名なのでしょうか?。

ちゃと読んでくださいよ.デフォルトで用意するファイル名は56個くらい有ります.私は,こう書きましたが.
> 1つの物理ディスクに対して,論理ディスクは1~8個作ることができます.
> また,1つの論理ディスクに対して /dev/dskと/dev/rdskの二つのデバイスファイルが対応します.

投稿日時 - 2006-04-13 09:01:11

ANo.3

> 例えば、/dev/dsk/c0t0d0s0 と /dev/rdsk/c0t3d0s5 と2件表記
された場合はディスクが2本ある・

この場合,
/dev/dsk/c0t0d0s0
/dev/rdsk/c0t0d0s0
/dev/dsk/c0t3d0s5
/dev/rdsk/c0t3d0s5
と4つのデバイスファイルが使用可能なはずです.
solarisだと,ディスクがあろうが無かろうがディスクのデバイスファイルは56+56コ(Solaris9)ずつあらかじめ作られているかとおもいます.

1つの物理ディスクに対して,論理ディスクは1~8個作ることができます.
また,1つの論理ディスクに対して /dev/dskと/dev/rdskの二つのデバイスファイルが対応します.

dskのほうはカーネル内のバッファキャッシュを介してアクセスするもので,ファイルシステムを作る場合はこちらを使います.rdskの方はRAW diskという意味で,バッファを使わずに直接アクセスします.rdskは,パーティション定義とか,fsck(Windowsでいうscandiskのようなもの),あと一部のバックアップソフト,など,でのみ使用します.


/varを使う手順ですが
・Windows/DOSでいう領域確保の,に対応するのは,
 formatコマンドの中のpartitionサブコマンドです.
・Windows/DOSでいうフォーマット(NTFSとかFAT32とかを指定して
 初期化)はnewfsとかmkfsを使います.
この段階で,Windows/DOSだとドライブレターが割り当てられて使用可能になりますが,UNIX系ではマウント操作が必要です.
手動でマウントコマンドを叩けばいいのですが,次回のブート時に自動的にマウントさせるためには/etc/fstab(UNIXオリジナル),/etc/vfstab(solaris)などに登録情報を書きます.
fstabには先ほど説明したとおり,ブロックデバイスファイル名を書きます.というか,すでに/とかの登録情報がvfstabにあるので,それを真似すればいいです.とりあえずは.

投稿日時 - 2006-04-12 14:53:54

お礼

みなさまありがとうございます。
お蔭様でだいぶきっかけがつかめてきました。
Unixは初めてですがこのデバイスの概念が
一番理解に苦労しています。。

>>この場合,
>>/dev/dsk/c0t0d0s0
>>/dev/rdsk/c0t0d0s0
>>/dev/dsk/c0t3d0s5
>>/dev/rdsk/c0t3d0s5
>>と4つのデバイスファイルが使用可能なはずです.

この4つというのはディスクあたりに、Solarisがデフォルトで用意する
デバイス名なのでしょうか?。

例えばなんですが外付けHD(コントローラ1つ)で
ディスクが2本ある場合は
ディスク1本あたりに「dsk」「rdsk」のデバイス名が作成なのかな?と
思いまして・・。

>>c0t0d0s0 だと「コントローラ0 (c0) のターゲット0 (t0)
>>にあるディスク0 (d0) の
>>スライス0 (s0)」とかいう意味だったような記憶があります。
>>SCSI の場合には「ターゲット」が SCSI ID に対応し、
>>「ディスク」は LUN に対応します。
>>なので c?t?d? までが同じなら同じデバイス、
>>どれかでも違えば別のデバイス

頂いたご説明の中で下記の用語が
難しいのですが・・

・ターゲット
・LUN(論理ユニット?)
・スライス

例えば「c0t0d0s0」のうち「t」と「d」の違いが難しいです。。
で「スライス」はその特定ディスクの「/var」とかを
割り当てることを言うのでしょうか?。

細かくてすみませんが補足を頂ければ
大変助かります。

よろしくお願いします。

投稿日時 - 2006-04-13 01:46:01

ANo.2

簡単な方からいくと, #1 で既に答えられてますがここでいう「スライス」は PC でいう「パーティション」と基本的に同じです. 1つのディスクをいくつかの領域に分けたもの.
で1の方:
一般的な UNIX では, デバイスファイルに「ブロックデバイス」と「キャラクタデバイス」の 2種類があります. ブロックデバイスは「ブロック単位にアクセスするものでランダムアクセス可能 (基本的に OS はキャッシュしない)」, キャラクタデバイスは「キャラクタ (=バイト) 単位にアクセスするものでシーケンシャルアクセスのみ可能 (OS がキャッシュすることもある)」なものです. ファイルシステムとしてマウントする場合にはランダムアクセスしないといけないのでブロックデバイスのみとなります. またテープデバイスだとシーケンシャルアクセスされるので自動的にキャラクタデバイスとなります.
これらのデバイスファイルがどこにあるかというのは OS によりますが, Solaris の場合は /dev/dsk 以下がブロックデバイス, /dev/rdsk 以下がキャラクタデバイスです. で c0t0d0s0 だと「コントローラ0 (c0) のターゲット0 (t0) にあるディスク0 (d0) のスライス0 (s0)」とかいう意味だったような記憶があります. SCSI の場合には「ターゲット」が SCSI ID に対応 (ただし歴史的事情でちょっと順番が違ったかもしれない) し, 「ディスク」は LUN に対応します. なので c?t?d? までが同じなら同じデバイス, どれかでも違えば別のデバイスとなります.
今の場合 /dev/dsk/c0t0d0s0 と /dev/rdsk/c0t3d0s5 とでは同じコントローラですが異なるターゲットなので別のディスク (デバイス) となります. /dev/dsk/c0t0d0s0 と /dev/rdsk/c0t0d0s0 だと全く同じもの (同じデバイスの同じスライス) ですがブロックデバイスとキャラクタデバイスという違いがありますし /dev/dsk/c0t0d0s0 と /dev/dsk/c0t0d0s3 だと同じディスクの異なるスライスということになります.

投稿日時 - 2006-04-12 14:17:57

ANo.1

区画/スライス/パーティション/ミニディスク,などOSによって用語が違ってきます.どれも,物理ボリュームを分割して論理ボリュームを作った際の一区画を差す名前です.

ただ,PCで動くOSでは,DOSパーティション(BIOSパーティション)を,さらにそのOSの持つ区画機能で分割する場合があります.このような場合では,こんな言葉の使い分けをすることもあります.
パーティション →ディスクをBIOSレベルで分けた区画
スライス→ディスクのうちあるOSに割り当てられた区画を,さらにそのOSの持つディスク分割機能で分割した物


基本パーティションやら拡張パーティションやら,PCの世界の概念の方がよっぽど複雑なんですが...

投稿日時 - 2006-04-12 01:49:12

あなたにオススメの質問