デバイスファイル

# とりあえずデバイスファイルにアクセスしてみる
通常```/dev/ディレクトリ以下```に存在します。
Linuxでは、プロセスがデバイスファイルを操作すると、カーネルの中のデバイスドライバというソフトウェアが```ユーザの代わりにデバイスにアクセス```します。

```
vboxuser@*********:*************$ ls -l /dev/
合計 0
crw-r--r--  1 root     root     10, 235  5月 23 07:12 autofs
drwxr-xr-x  2 root     root         400  5月 23 07:12 block
...
brw-rw----  1 root     disk      7,   0  5月 23 07:12 loop0
...
crw-rw-rw-  1 root     tty       5,   0  5月 23 07:12 tty
...
```
### 気づき
lsというプロセスがカーネルがデバイスドライバを使って表示するように操作しているのか。

# デバイスファイルの情報
### ファイルの種類
```キャラクタデバイス```または```ブロックデバイス```がある。
...
行頭が```c```であればキャラクタデバイス、```b```であればブロックデバイス
で
### デバイスのメジャー番号、マイナー番号
メジャー番号とマイナー番号の組み合わせが```同じであれば同じデバイス```に対応しており、```そうでれば別のデバイスに対応```している
```第五フィールド```がメジャー番号、```第６フィールド```がマイナー番号

### 気づき
/div/autofsはキャラクタデバイスで別のデバイスに対応している。
/div/loop0はブロックデバイスでこれも別のデバイスに対応している.

別のデバイスはどこにあるんだろう？
# キャラクタデバイス
読み出しと書き込みはできますが、デバイス内でアクセスする場所を変更するシーク操作はできません。
### プロセスとそれに対応する端末を調べる
```
root@*********:*************# ps ax | grep bash
   2681 pts/0    Ss     0:00 bash
   3945 pts/0    S      0:00 bash
   4052 pts/0    S+     0:00 grep --color=auto bash

root@*********:*************# ps ax | grep bash
   2681 pts/0    Ss     0:00 bash
   3945 pts/0    S      0:00 bash
   4064 pts/1    Ss+    0:00 bash
   4160 pts/0    S+     0:00 grep --color=auto bash

```
### 気づき
pts/０という端末を使っている。/dev/pts/0というファイルがこの端末に対応するデバイスファイル
デバイスファイルが端末と繋がっているからといってどういうことになるんだろう。

# デバイスファイルに標準出力のリダイレクトをする
```
root@*********:*************# echo hello > /dev/pts/0
hello
root@*********:*************# echo hello > /dev/pts/1
```
これはecho helloコマンドを発行した場合と同じ結果です。

### 気づき
キャラクタデバイスは値をread()してwrite（）システムコールで端末に出力したのか

# ブロックデバイス
ファイルの読み書き以外に、シークができます。代表的なブロックデバイスは```HDDやSSDなどのストレージファイル```です。ブロックデバイスにデータを読み書きすることによって、通常のファイルのように、ストレージの所定の位置にあるデータにアクセスできます。

### シークとは
ITの分野では、目的のものを探し出す、目的の場所を見つけて移動する（させる）
### 出典
https://e-words.jp/w/%E3%82%B7%E3%83%BC%E3%82%AF.html#:~:text=IT%E3%81%AE%E5%88%86%E9%87%8E%E3%81%A7%E3%81%AF%E3%80%81%E7%9B%AE%E7%9A%84%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E6%8E%A2%E3%81%97%E5%87%BA%E3%81%99%E3%80%81%E7%9B%AE%E7%9A%84%E3%81%AE%E5%A0%B4%E6%89%80%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%81%A6%E7%A7%BB%E5%8B%95%E3%81%99%E3%82%8B%EF%BC%88%E3%81%95%E3%81%9B%E3%82%8B%EF%BC%89

### 気づき
エラーが起きてできなかった。
ストレージからいろんな情報を取得できるのはこれのおかげなのか
空きのパーティションがわからなかった。そして見つけたと思ってもサンプルコードのようにならなかった。
```
root@*********:*************# lsblk -ip
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
/dev/loop0    7:0    0  55.3M  1 loop /snap/core18/1885
....
/dev/sda      8:0    0    25G  0 disk 
|-/dev/sda1   8:1    0   512M  0 part /boot/efi
|-/dev/sda2   8:2    0     1K  0 part 
`-/dev/sda5   8:5    0  24.5G  0 part /
/dev/sr0     11:0    1  1024M  0 rom  
```
# ループデバイス
```空いているデバイスやパーティションが無かったり、あるいはディスクの内容を破壊しかねない操作はしたくない```などの理由が考えられます。このような場合はループデバイスという機能がが使えます。
```
root@*********:*************# fallocate -l 1G loopdevice.img
root@*********:*************# sudo losetup -f loopdevice.img
root@*********:*************# losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                        DIO LOG-SEC
/dev/loop1
             0      0         1  1 /*************/bare_5.snap   0     512
.....
             0      0         0  0 /*************/loopdevice.img
                                                                      0     512
.....
root@*********:*************# vim copy.txt
root@*********:*************# sudo mkfs.ext4 /dev/loop12
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done                            
...
Writing superblocks and filesystem accounting information: done

root@*********:*************# mkdir mnt
root@*********:*************# sudo mount /dev/loop12 mnt
root@*********:*************# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
....
/dev/loop12 on ************/mnt type ext4 (rw,relatime)
root@*********:*************#:/*************# echo "hello world" >/mnt/testfile
root@*********:*************# ls /mnt/
testfile
root@*********:*************# cat /mnt/testfile 
hello world
root@*********:*************# umount /mnt
umount: /mnt: not mounted.
root@*********:*************# umount /mnt/
umount: /mnt/: not mounted.
root@*********:*************# umount /mnt
umount: /mnt: not mounted.
root@*********:*************# strings -t x /dev/loop12
   1018 'V9Q
...
38001018 'V9Q
root@*********:*************# sudo umount mnt
root@*********:*************# strings -t x /dev/loop12
   1018 'V9Q
1091020 lost+found
...
38001018 'V9Q
root@*********:*************# sudo losetup -d /dev/loop12
root@*********:*************# rm loopdevice.img 
```

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
少ししか理解できないことが理解できた。
次は理解できるようにする