【Linux】ハードウェア設定の決定と設定（その１）

# freeコマンド
Linuxシステムにおいてシステムのメモリ（RAM）の使用状況を表示するためのコマンド。freeコマンドを実行すると、現在のメモリ使用量と空きメモリなどの情報を確認することができる。

```yaml:terminal
$ free
              total        used        free      shared  buff/cache   available
Mem:        16305168     4129784     6878256      233120     5300128    11317148
Swap:       16777212           0    16777212
```

total: インストールされている物理メモリ（RAM）の総容量
used: 使用中のメモリ量
free: 空きメモリ量
shared: シェアメモリ
buff/cache: バッファとキャッシュに使用されているメモリ
available: カーネルがプロセスに割り当てることができる利用可能なメモリ量

これらの値はキロバイト（KB）単位で表示される。また、free -hとして実行すると、人間が読みやすい形式（キロバイト、メガバイト、ギガバイトなど）で表示できる。

```yaml:terminal
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       3.9Gi       6.5Gi       227Mi       5.0Gi        10Gi
Swap:          16Gi          0B        16Gi
```

# lsusbコマンド (cat /proc/bus/usb/devicesコマンド)
接続されているUSBデバイスの一覧が表示される。各デバイスにはベンダーID（Vendor ID）とプロダクトID（Product ID）などの情報が含まれている。

```yaml:terminal
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 005: ID 04f2:b40e Chicony Electronics Co., Ltd HD WebCam (Acer)
Bus 001 Device 004: ID 8087:0a2b Intel Corp.
Bus 001 Device 003: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 002: ID 04ca:3011 Lite-On Technology Corp. HP USB Multimedia Keyboard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

Bus: デバイスが接続されているUSBバスの番号を示す。USBバスは、デバイスが接続されている物理的なUSBポートを意味する。
Device: USBデバイスの番号を示す。USBデバイスは、各USBバスに接続されているデバイスの番号。
ID: デバイスのベンダーIDとプロダクトIDを示す。ベンダーIDはデバイスの製造元を識別し、プロダクトIDは製品の型番を示す。
Vendor: デバイスのベンダー（製造元）の名前を示す。
Product: デバイスの製品名を示す。

```yaml:terminal
$ cat /proc/bus/usb/devices
...
T:  Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#=  5 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=046d ProdID=c077 Rev=30.01
S:  Manufacturer=Logitech
S:  Product=M105 Optical Mouse
C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=98mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=usbhid
...

```

Bus: デバイスが接続されているUSBバスの番号を示す。USBバスは、デバイスが接続されている物理的なUSBポートを意味する。
Lev: USBデバイスのレベルを示す。この番号は、USBホストコントローラからの距離を表す。
Prnt: 親デバイスの番号を示す。USBデバイスはツリー状に接続されているため、親デバイスが何であるかを示す。
Port: デバイスが接続されているUSBポート番号を示す。
Dev#: デバイス番号を示す。USBデバイスは、各USBバスに接続されているデバイスの番号。
Spd: デバイスの速度を示す。
Vendor, ProdID, Rev: デバイスのベンダーID、プロダクトID、およびリビジョンを示す。これにより、デバイスの製造元、型番、およびバージョンを識別できる。
Manufacturer: デバイスの製造元（ベンダー）の名前を示す。
Product: デバイスの製品名を示す。
Cls, Sub, Prot: デバイスのクラス、サブクラス、およびプロトコルを示す。
MxPS: 最大パケットサイズを示す。
#Cfgs: デバイスの設定数を示す。
#Ifs, Cfg#, Alt: デバイスのインターフェース数、設定番号、代替設定を示す。
C: デバイスの構成を示す。
I: デバイスのインターフェースを示す。

# lspciコマンド （cat /proc/bus/pci/devicesコマンド）
Linuxシステムにおいてシステムに接続されているPCIデバイスの一覧や詳細な情報を表示するためのコマンド。

```yaml
$ lspci
00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (rev 05)
00:01.0 PCI bridge: Intel Corporation Skylake PCIe Controller (x16) (rev 05)
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 (rev 04)
00:14.0 USB controller: Intel Corporation 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller (rev 31)
00:16.0 Communication controller: Intel Corporation 100 Series/C230 Series Chipset Family MEI Controller #1 (rev 31)
...

```

- デバイス番号: 00:00.0
00: PCIバス番号を示す。PCIデバイスはこのバスに接続されている。
00: デバイス番号を示す。このバス上に接続された最初のデバイス。
.0: ファンクション番号を示す。PCIデバイスは複数のファンクションを持つ場合がありますが、このデバイスはファンクション0。

- デバイスのクラス: Host bridge
デバイスのクラスは、このデバイスが属するカテゴリを示す。ここでは「Host bridge（ホストブリッジ）」と表示されている。ホストブリッジは、CPUとメインメモリ（DRAM）を接続する役割を持ち、コンピュータのシステムにおいて非常に重要な役割を果たしている。

- デバイスの詳細: Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
デバイスの詳細は、デバイスの製造元と製品名を示す。ここでは「Intel Corporation」が製造元で、「Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers」というデバイスの名前が表示されている。これにより、このデバイスがインテル製のプロセッサであることが分かる。

- リビジョン: rev 05
リビジョンは、デバイスのバージョンを示す。PCIデバイスは製造元によってリビジョンが更新されることがある。ここでは「rev 05」と表示されているため、このデバイスは5番目のバージョンであることが分かる。

これらの情報により、00:00.0というデバイス番号に接続されたPCIデバイスが「Host bridge」というクラスのデバイスであり、インテル製の「Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers」という製品であり、バージョンは「rev 05」であることがわかる。この情報は、コンピュータのシステムの構成やハードウェアの特性を理解する際に役立つ。

```yaml:terminal
$ cat /proc/bus/pci/devices
0000	10de	1c82	0d00		3
0000	8086	5904	00		3
0000	8086	5907	00		3
0001	8086	1901	00		3
0001	8086	1902	00		3
...

```

- バス番号: 0000
PCIデバイスのバス番号を示す。PCIデバイスはこのバスに接続されています。バス番号は通常、16進数で表現される。

- ベンダーID: 10de
デバイスのベンダーIDを示す。ベンダーIDはPCIデバイスの製造元を識別するためのID。ここでは、10deはNVIDIA Corporationを表している。

- デバイスID: 1c82
デバイスのプロダクトIDを示す。デバイスIDは製品の型番を識別するためのID。ここでは、1c82は特定のNVIDIAデバイスを表している。

- サブシステムベンダーID: 0d00
サブシステムのベンダーIDを示す。サブシステムIDはデバイスが所属するサブシステム（システム内の特定のサブセット）を識別するためのID。

- サブシステムID: (空白なし)
サブシステムのプロダクトIDを示す。サブシステムIDは特定のサブシステム内のデバイスを識別するためのID。ここでは空白があるため、サブシステムIDは指定されていない可能性がある。

- PCIデバイスのリビジョン：　3
PCIデバイスのリビジョンは、製造元によってデバイスが更新される際に変更される番号であり、デバイスのバージョンを表す。リビジョン番号はデバイスの仕様や機能に影響を与える場合がある。

# cat /proc/ioportsコマンド
Linuxシステムにおいて現在使用されているI/O（Input/Output）ポートのアドレス範囲とそれに対応するデバイスの情報を表示するコマンド。

```yaml:terminal
$ cat /proc/ioports
0000-0cf7 : PCI Bus 0000:00
  0000-001f : dma1
  0020-0021 : pic1
  0040-0043 : timer0
  0050-0053 : timer1
  0060-0060 : keyboard
  0064-0064 : keyboard
  ...

```

- 0000-0cf7 : PCI Bus 0000:00
0000-0cf7: この範囲はPCIバス番号0000:00に関連するI/Oポートアドレスの範囲。この範囲はPCIバスに接続されているデバイスが使用するI/Oポートアドレスの範囲を表している。

- 0000-001f : dma1
0000-001f: この範囲はDMA1（Direct Memory Access）コントローラに関連するI/Oポートアドレスの範囲。DMAはメモリ間のデータ転送を制御するために使用される機能であり、DMAコントローラはその操作を制御する。

- 0020-0021 : pic1
0020-0021: この範囲はPIC1（Programmable Interrupt Controller）に関連するI/Oポートアドレスの範囲。PICは割り込みの制御を担当し、外部デバイスからの割り込みを受け付けるために使用される。

- 0040-0043 : timer0
0040-0043: この範囲はTimer0に関連するI/Oポートアドレスの範囲。タイマーはシステム内の時間を計測したり、イベントをタイミング制御するために使用される。

- 0050-0053 : timer1
0050-0053: この範囲はTimer1に関連するI/Oポートアドレスの範囲。Timer1もタイマーの一つで、特定の時間間隔を制御するために使用される。

- 0060-0060 : keyboardおよび0064-0064 : keyboard
0060-0060および0064-0064: これらの範囲はキーボードに関連するI/Oポートアドレスの範囲。キーボードは入力デバイスとして使用され、キー入力をコンピュータに伝えるためにこれらのI/Oポートを使用する。

# cat /proc/interruptsコマンド
システムが動作している間のIRQのカウンター値が表示される。システムの割り込み動作をモニタリングする際には、この情報が役立つ場合がある。

```yaml:terminal
$ cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       
  0:         49          0          0          0   IO-APIC   2-edge      timer
  1:          2          0          0          0   IO-APIC   1-edge      i8042
  8:          0          0          0          0   IO-APIC   8-edge      rtc0
  9:          0          0          0          0   IO-APIC   9-fasteoi   acpi
 12:          0          0          0          0   IO-APIC  12-edge      i8042
...

```

- CPU0, CPU1, CPU2, CPU3: 
各CPUコアの番号が表示されている。マルチコアのシステムでは、複数のCPUコアがあります。各CPUコアごとに割り込みのカウンターが表示される。

- 0: 49 0 0 0: 
この行はIRQ 0（タイマー）に関する情報。カラムの順に、CPU0, CPU1, CPU2, CPU3に対応する割り込み回数が表示されている。この例では、CPU0に対して49回のタイマー割り込みが発生しており、他のCPUコアではタイマー割り込みは発生していない。

- 1: 2 0 0 0: 
この行はIRQ 1（i8042、PS/2キーボードコントローラ）に関する情報。この例では、CPU0に対して2回のi8042割り込みが発生しており、他のCPUコアではi8042割り込みは発生していない。

- 8: 0 0 0 0: 
この行はIRQ 8（rtc0、リアルタイムクロック）に関する情報。この例では、いずれのCPUコアでもrtc0割り込みは発生していない。

- 9: 0 0 0 0: 
この行はIRQ 9（acpi）に関する情報。この例では、いずれのCPUコアでもacpi割り込みは発生していない。

- 12: 0 0 0 0: 
この行はIRQ 12（i8042、PS/2キーボードコントローラ）に関する情報。この例では、いずれのCPUコアでもi8042割り込みは発生していない。

- IO-APIC: 
I/O-APICは、マルチプロセッサシステムにおいて割り込みを効率的に配分するための高度なプログラマブル割り込みコントローラ。通常、モダンなコンピュータシステムではI/O-APICが使用されており、それぞれのCPUコアに対して割り込みを適切に割り当てて処理する。

- 8: 
これはIRQ番号。IRQ 8は一般的にリアルタイムクロック（RTC）割り込みに対応している。 

- edge: 
このIRQはエッジトリガー（edge-triggered）モードで動作している。エッジトリガー割り込みは、割り込み信号の立ち上がり（rising edge）や立ち下がり（falling edge）に応じて割り込みを発生させる方法。信号が立ち上がるたびに割り込みが発生する。

# HDDとSSDの比較
HDD（ハードディスクドライブ）とSSD（Solid State Drive）は、両方ともデータの保存装置だが、その技術や特性にはいくつかの違いがある。

- 技術:
HDD: ハードディスクドライブは、磁気ディスクとアームによってデータを読み書きする機械式の技術を使用している。データは円盤状のプラッタに磁気的に記録される。
SSD: ソリッドステートドライブは、フラッシュメモリという電子的な記憶素子を使用してデータを保存する。機械的な部品がないため、静音性と高い耐衝撃性を持つ。

- データアクセス速度:
HDD: ハードディスクは回転するプラッタとアームがデータを探し出す必要があるため、アクセス速度は比較的遅く、読み取り/書き込み時間が長い場合がある。
SSD: ソリッドステートドライブはフラッシュメモリでデータを直接アクセスするため、非常に高速な読み取り/書き込みが可能。アプリケーションの起動やファイルの転送が迅速に行える。

- 耐久性:
HDD: ハードディスクは機械的な部品を持っているため、振動や衝撃に弱く、故障のリスクがある。
SSD: ソリッドステートドライブは機械的な部品がないため、耐衝撃性に優れ、信頼性が高い。

- 消費電力:
HDD: ハードディスクは回転するプラッタとアームがエネルギーを消費する。そのため、HDDはSSDよりも多くの電力を消費する。
SSD: ソリッドステートドライブは電子的な素子を使用しているため、HDDよりも低消費電力。

- コストパフォーマンス:
HDD: 容量あたりのコストパフォーマンスが高く、大容量のストレージを比較的低い価格で提供。
SSD: HDDよりも高価ですが、高速性と耐久性の面で優れている。最近の技術進化により、価格も徐々に下がってきている。

- データ長期保存:
HDD: 長期間の保存には適しているが、機械的な部品の摩耗による故障のリスクがあるため、バックアップが重要。
SSD: フラッシュメモリの特性により、電力供給がない状態でもデータを保持できる。長期保存にも適していますが、書き込み回数の制約があるため、適切な管理が必要。

HDDとSSDはそれぞれ異なる用途や要件に合わせて選択されることがある。一般的に、高速性や耐久性を重視する場合はSSDを選択し、大容量でコストパフォーマンスを重視する場合はHDDを選択する傾向があります。また、SSDとHDDを組み合わせて使用することで、性能とストレージ容量の両方をバランスよく活用することも行われている。

# cat /proc/scsi/scsiコマンド
システムに接続されているSCSIデバイスの一覧と、それらのデバイスに関する詳細な情報が確認できる。SCSI（Small Computer System Interface）デバイスは、コンピュータと周辺機器（ストレージデバイスやプリンタなど）を接続するためのインターフェース規格。SCSIは、複数のデバイスを接続し、高速で信頼性の高いデータ転送を実現することを目的としている。

```yaml:terminal
$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: ABC     Model: 1234   Rev: 1.0
  Type:   Direct-Access                    ANSI SCSI revision: 06

Host: scsi1 Channel: 00 Id: 01 Lun: 00
  Vendor: XYZ     Model: 5678   Rev: 2.0
  Type:   CD-ROM                           ANSI SCSI revision: 05

```

Host: SCSIホストアダプタ（コントローラ）の番号を示す。
Channel: SCSIチャンネルの番号を示す。
Id: デバイスのID番号を示す。同じチャンネル上に接続された複数のデバイスは、ID番号で区別される。
Lun: ロジカルユニット番号を示す。LUNは、IDとチャンネルの組み合わせによりデバイスをさらに細分化するために使用される。
Vendor: デバイスの製造元を示す。
Model: デバイスのモデル名を示す。
Rev: デバイスのリビジョン（バージョン）を示す。
Type: デバイスのタイプを示す。"Direct-Access"はハードディスクやSSDなどの直接アクセス可能なデバイスを意味し、"CD-ROM"は光学ドライブ（CD/DVDドライブ）を意味する。
ANSI SCSI revision: デバイスが準拠しているSCSI規格のリビジョンを示す。

# modprobeコマンド
Linuxシステムでカーネルモジュールをロード（読み込み）するためのユーティリティ。モジュールのロードに関する設定をカスタマイズするためのファイルは、/etc/modprobe.d/ディレクトリに存在する。このディレクトリに設定ファイルを作成することで、特定のカーネルモジュールに関するロードオプションやエイリアスなどを指定できる。

```yaml:terminal
# 特定のカーネルモジュールをロードする場合：
modprobe モジュール名
# ロードオプションを指定してカーネルモジュールをロードする場合：
modprobe モジュール名 オプション名=値
# エイリアスを設定してカーネルモジュールをロードする場合：
modprobe デバイス名 モジュール名
```