とりあえずデバイスファイルにアクセスしてみる
通常/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
であればブロックデバイス
で
デバイスのメジャー番号、マイナー番号
メジャー番号とマイナー番号の組み合わせが同じであれば同じデバイス
に対応しており、そうで�れば別のデバイスに対応
している
第五フィールド
がメジャー番号、第6フィールド
がマイナー番号
気づき
/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/0という端末を使っている。/dev/pts/0というファイルがこの端末に対応するデバイスファイル
デバイスファイルが端末と繋がっているからといってどういうことになるんだろう。
デバイスファイルに標準出力のリダイレクトをする
root@*********:*************# echo hello > /dev/pts/0
hello
root@*********:*************# echo hello > /dev/pts/1
これはecho helloコマンドを発行した場合と同じ結果です。
気づき
キャラクタデバイスは値をread()してwrite()システムコールで端末に出力したのか
ブロックデバイス
ファイルの読み書き以外に、シークができます。代表的なブロックデバイスはHDDやSSDなどのストレージファイル
です。ブロックデバイスにデータを読み書きすることによって、通常のファイルのように、ストレージの所定の位置にあるデータにアクセスできます。
シークとは
ITの分野では、目的のものを探し出す、目的の場所を見つけて移動する(させる)
出典
気づき
エラーが起きてできなかった。
ストレージからいろんな情報を取得できるのはこれのおかげなのか
空きのパーティションがわからなかった。そして見つけたと思ってもサンプルコードのようにならなかった。
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
出典
感想
少ししか理解できないことが理解できた。
次は理解できるようにする