差分

移動先: 案内検索

デバイススペシャルファイル

1,289 バイト追加, 2022年8月3日 (水) 15:22
/* I/Oスケジューラ */
Unix で使われた秀逸なアイデアを3つ上げろといわれたら、多分、多くの人が、階層化ファイルシステム、パイプ、そしてデバイススペシャルファイル(Device Special File : 単にスペシャルファイルとも呼ぶ)
<ref> wikipediaではデバイス・ファイルの項目に「デバイスファイルまたはスペシャルファイルとは」と書いていますが、UNIXでは次のように「デバイススペシャルファイル」という表現をしています。wikipediaではデバイス・ファイルの項目に「デバイスファイルまたはスペシャルファイルとは」と書いていますが、UNIXの世界では次のように「デバイススペシャルファイル」という表現をしています。[https://www.usenix.org/legacy/event/bsdcon02/full_papers/kamp/kamp_html/ Before we continue, we need to fully understand the ``"device special file'' " in UNIX.]
本稿もそれに従います。
</ref>
たとえばLinuxでは /dev/sda は SCSI ハードディスク、あるいは SCSI ハードディスクに見えるものハードディスクに見えるものです<ref>たとえば USB メモリは USB マスストレージクラスですが、デバイス用の SCSI エミュレーションによってSCSIデバイスのように見えます。</ref>です。
Linuxのカーネルが認識した順番に /dev/sda から /dev/sdb 、 /dev/sdc となります。
/dev/sda はハードディスク全体で、 sda 上にパーティションが設定されていれば /dev/sda1 、 /dev/sda2 ...となります。
あるいはIDE接続のMOがide-scsiデバイスドライバ経由のためSCSI として取り扱われたりと状況でさまざまです。
IDEハードディスクだと IDE 0 Master に接続されているハードディスクは /dev/hda になります。
Slave側は hdb、 IDE 1 Master/Slave は hdcと hdd という具合になります。という具合になります<ref>Ubuntuのハードウェアとデバイスの命名規則についての解説ページ [https://www.dell.com/support/kbdoc/ja-jp/000132092/ubuntu-%E3%81%8A%E4%BD%BF%E3%81%84%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%81%8A%E3%82%88%E3%81%B3%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E5%90%91%E3%81%91%E3%81%AE%E6%9D%A1%E4%BB%B6-%E8%AA%AC%E6%98%8E]</ref>。
;補足: 接続した順番にデバイスを決めていくので、USB機器などの接続では挿したタイミングでデバイス名が異なることが発生してしまう場合があります。そこで現在ではUUID(Universally Unique Idenifier )という方式を使ってデバイスをユニークに認識する方法を用意しています。fstab(5)、mount(8)、tune2fs(8)を参照してみてください。
そこで有効な入出力をするためにスケジューラを用意します。スケジューラの役目は、全体のスループットの改善です。ですから、ある1つのプロセスだけを着目してみると、もしかすると、処理が遅くなっているという可能性もあります。
この当たりは単純に一つのI/Oスケジュリングのアルゴリズムが万能とはなかなかいかないので、Linux Oスケジューリングのアルゴリズムが万能とはなかなかいかないので、Linux 2.6.0以降では
Deadline I/O Scheduler、
<del>Anticipatory I/O Scheduler</del><ref>最新ディストリビューションの使っているLinuxカーネルの多くでは既に用意していません。</ref>、
Complete Fairness Queueing I/O Scheduler、Scheduler<ref> Inside the Linux 2.6 Completely Fair Scheduler https://www.ibm.com/developerworks/library/l-completely-fair-scheduler/index.html</ref>、
Noop I/O Scheduler といった複数
のスケジュールが用意されています。
またLinux 5.0以降ではI/Oスケジューラがマルチキュー I/O スケジューラに変更され、mq-deadline、bfq (Budget Fair Queueing)、kyber、none <ref>
https://www.kernel.org/doc/html/latest/block/index.html
</ref>
が用意されています。
;補足: Kernel 2.6.18以降 CFQ(Complete Fairness Queueing)スケジューラがデフォルトです。
;補足: Noop I/O Schedulerはスケジュールをしないスケジューラです。Scheduler (none) はスケジュールをしないスケジューラです。
; 調べてみよう : ブロックデバイスが/dev/sdaの場合、I/Oスケジュラーの設定は /sys/block/sda/queue/scheduler でされているので、実際に、どうなっているか見てみよう。
; 調べてみよう : ブロックデバイスが/dev/sdaの場合、I/Oスケジューラの設定は /sys/block/sda/queue/scheduler でされているので、実際に自分の使っている環境ではどうなっているか見てみよう。
 ; 調べてみよう : IBMサイトにあるLinuxのディスクI/Oに関する考察 <ref>Linux disk I/O considerations ([http://public.dhe.ibm.com/software/dw/linux390/perf/Linux_disk_IO_considerations.pdf<Linux disk I/ref>O considerations ]) や openSUSE サイトにあるI/Oパフォーマンスのチューニング ( [https://doc.opensuse.org/documentation/leap/tuning/html/book-tuning/cha-tuning-io.html#cha-tuning-io-switch 12 Tuning I/O performance] )が参考になります。
== ネットワークデバイス ==
ネットワークインタフェースの設定にはifconfigを使いますが、通常はシステムの設定ファイルに指定のフォーマットで登録しておけば、システムのブート時に設定スクリプトが動き、自動的に割り当ててくれます。Debian系のディストリビューションだと /etc/network/interfaces に、RedHat 系だと /etc/sysconfig/network-scripts/ifcfg-eth0 に記述します。
 
;補足: 多くのディストリビューションがifconfigコマンドから [https://wiki.linuxfoundation.org/networking/iproute2 iproute2ユーティリティ] に含まれる ipコマンドに移行しています。頃合いをみて本説明もipコマンドでの説明に切り替える予定です。