- 投稿日:2020-10-13T23:50:03+09:00
tar コマンドを使ってテープにバックアップ・リストアしてみた
はじめに
サーバ管理者なら誰でも実行したことがある
tar
コマンドですが、先輩から「実は Tape Archive なんだよ」と教わった記憶があります1。というわけで、テープを使ってバックアップ・リストアをしてみました。FreeBSD の tar2 でテープドライブを操作する様子を動画で紹介しながら、コマンドを解説していきます。
テスト環境
- OS ... FreeBSD 12.1
- テープドライブ ... Quantum TC-L32AX (LTO3)
- SCSI カード ... Adaptec AHA-2940U2W
- SCSI ケーブル ... 内蔵用 68pin ケーブル
テープドライブは /dev/sa0, /dev/nsa0 として見えています。man sa(4) にあるように、
sa
は "Rewind on close" 、nsa
は "No rewind on close" なデバイスです。今回は複数のバックアップを取って行ったり来たりするので/dev/nsa0
を使います。テープの操作
テープドライブを扱うには、テープにはどのような構造で記録されるかを理解しておく必要があります。
%<--file 0-->|<--file 1-->| % ... BOP (beginning of the partition) | ... EOF
file
は名前のないデータのかたまりで、テープの中のファイル番号は 0 から始まります。また、EOF はファイルの末尾の次の位置に記録されるファイルの終端マークで、ファイルの一部ではありません。
file 0 の終端マークは、同時に file 1 の開始を表すのに用いられるようで、mt status の File Number は以下のように EOF からを次のファイルとして報告するようです。%<--file 0-->|<--file 1-->| <---- 0 ----><---- 1 ----><-- 2 ... File Number書き込み・読み出しは、BOP または EOF にヘッドを移動させてから行います。そのため、
mt
の fsf, bsf や、tar
コマンドを実行したあとに、テープヘッドがどの位置に移動されるのかを把握しておく必要があります。
操作 操作後のヘッド位置 mt fsf 次のEOF mt bsf 前のEOFを(巻き戻し方向に)超えたところ=前のファイルの末尾 tar cvf ファイルを書き込んだ直後のEOF tar tvf 内容を表示したファイルの末尾 tar xvf 展開したファイルの末尾 fsf, bsf は移動する数を指定することもできます。
EOF
の位置から fsf で移動するときは、今いる EOF はカウントされません。しかし、EOF
の位置から bsf で移動するときは、今いる EOF がカウントされますので注意が必要です。%<--file 0-->|<--file 1-->|<--file 2-->| ^ initial position ^ mt fsf ^ mt bsf ^ mt bsf 2実際のバックアップ・リストア
バックアップ
tar コマンドを使ってテープドライブのテープにバックアップする様子 pic.twitter.com/g7UoiaVJta
— maya_shack (@maya_shack) October 13, 2020まずテープの状況を確認します。
# mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 0 Calc Record Number: 0 Residual: 0 Reported File Number: 0 Reported Record Number: 0 Flags: BOP% ^テープドライブのヘッドはテープの先頭(BOP)にあります。
backup1 をテープの今の位置から書き込みます。
# tar cvf /dev/nsa0 backup1 a backup1 # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 1 Calc Record Number: 0 Residual: 0 Reported File Number: 1 Reported Record Number: 1026 Flags: None%<--file 0-->| ^tar で書き込みが終わると、テープドライブのヘッドはファイルを書き込んだ直後の EOF に来ています。
次に backup2 をテープの今の位置から書き込みます。
# tar cvf /dev/nsa0 backup2 a backup2 a backup2/file2 a backup2/file1 # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 2 Calc Record Number: 0 Residual: 0 Reported File Number: 2 Reported Record Number: 1642 Flags: None%<--file 0-->|<--file 1-->| ^テープドライブのヘッドはファイルを書き込んだ直後の EOF に来ています。
リストア
tar コマンドを使ってテープドライブのテープからリストアする様子 pic.twitter.com/Ee9ekMB8WT
— maya_shack (@maya_shack) October 13, 2020テープを先頭まで巻き戻します。
# mt -f /dev/nsa0 rewind # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 0 Calc Record Number: 0 Residual: 0 Reported File Number: 0 Reported Record Number: 0 Flags: BOPテープのヘッドドライブはテープの先頭に来ています。
テープの今の位置(BOP)から抽出します。
# tar xvf /dev/nsa0 x backup1 # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 0 Calc Record Number: 1025 Residual: 0 Reported File Number: 0 Reported Record Number: 1025 Flags: None%<--file 0-->|<--file 1-->| ^tar での抽出が終わると、テープドライブのヘッドは今(0番目)のファイルの最後尾(EOFではない)に来ています。
テープのヘッダを次の EOF に移動し、次のファイルを扱えるようにします。
# mt -f /dev/nsa0 fsf # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 1 Calc Record Number: 1026 Residual: 0 Reported File Number: 1 Reported Record Number: 1026 Flags: None%<--file 0-->|<--file 1-->| ^テープの今の位置からファイルの一覧を表示してみます。
# tar tvf /dev/nsa0 drwxr-xr-x 0 root wheel 0 Sep 21 17:40 backup2/ -rw-r--r-x 0 root wheel 4194304 Sep 21 17:40 backup2/file2 -rw-r--r-x 0 root wheel 2097152 Sep 21 17:40 backup2/file1 # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 1 Calc Record Number: 615 Residual: 0 Reported File Number: 1 Reported Record Number: 1641 Flags: None%<--file 0-->|<--file 1-->| ^tar でファイルの一覧を表示した後も、テープドライブのヘッドは表示したファイル(1番目)の最後尾に来ています。
もういちど同じファイルを操作するために、直前の EOF に移動します。これを 1 回で操作できるコマンドはない3ので、mt bsf で一つ前(0番目)のファイル(の最後尾)に移動して、mt fsf で次の EOF に移動します。
# mt -f /dev/nsa0 bsf # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 0 Calc Record Number: 0 Residual: 0 Reported File Number: 0 Reported Record Number: 1025 Flags: None%<--file 0-->|<--file 1-->| ^# mt -f /dev/nsa0 fsf # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 1 Calc Record Number: 0 Residual: 0 Reported File Number: 1 Reported Record Number: 1026 Flags: None%<--file 0-->|<--file 1-->| ^テープの今の位置から抽出します。
# tar xvf /dev/nsa0 x backup2/ x backup2/file2 x backup2/file1 # mt -f /dev/nsa0 status (snip) Partition: 0 Calc File Number: 1 Calc Record Number: 615 Residual: 0 Reported File Number: 1 Reported Record Number: 1641%<--file 0-->|<--file 1-->| ^tar での抽出が終わったときも、テープドライブのヘッドは今(1番目)のファイルの最後尾に来ています。
# mt -f /dev/nsa0 offlineテープを巻き戻して取り出します。
わかったこと
Web を検索すると、Linux で mt を操作する資料はすぐ見つかりましたが、FreeBSD での資料はあまり見つかりませんでした。Linux の資料を見ながら試していたのですが、FreeBSD の mt と Linux の mt には違いがあり、出力やコマンドが異なります。
- FreeBSD ではテープヘッドが先頭にあるときの mt status の出力に、BOT (Beginning of Tape) ではなく BOP (beginning of the partition) が表示されます。
- FreeBSD ではテープヘッドが EOF にあっても、mt status の出力にそのことが表示されません。
- FreeBSD では bsfm, fsfm で移動することができません。
特に移動コマンドの移動先についての説明が違うため、動作の仕様を理解するのに時間がかかりました。この違いについては、別の記事で解説してみたいと思います。
Linux の man tar(1) では "an archiving utility" と紹介されていますが、FreeBSD の man tar(1) では "manipulate tape archives" と紹介されています。 ↩
もちろん、Linux の tar でもテープにバックアップを取ることができます。 ↩
Linux では
mt bsfm 1
で移動できます。 ↩
- 投稿日:2020-10-13T17:04:49+09:00
NTP(Chrony)インストール方法 - CentOS 8
ネットワークタイムプロトコル(NTP)はリモートインターネットタイムサーバーと
時刻を同期するためのネットワークプロトコルです。ChronyはNTPの実装であり、以前のバージョンのエンタープライズLinuxオペレーティングシステムで使用されていた古いNtpdの代わりになります。
CentOS 8のNTP(Chrony)インストールと下記の二つの設定方法解説します。
①、NTPサーバーとして構成
NTPサーバーとして構成するとクライアントPC又クライアントサーバーが
NTPサーバーの時刻を同期可能になります。
②、NTPクライアントとして構成
NTPクライアントとして構成すると設定NTPサーバーの時刻を同期することができます。
NTPサーバーとして構成
1.Chronyインストール
下記のコマンドを実行してインストールする。(既にインストールされていることもあります)
# yum install -y chrony2.設定ファイルを変更-クライアントへアクセス許可
# vi /etc/chrony.conf上記のコマンドを実行し、Confファイルの下記の箇所を追記します。
今回は192.168.0.0から192.168.0.254までのローカルネットワークのクライアントPCへアクセス時刻を同期にアクセス許可設定をします。# Allow NTP client access from local netwok → 説明コメント # allow 192.168.0.0/16 → 設定の例 allow 192.168.0.0/24 → こちらは追加
注. [/24]はサブネットマスク255.255.255.0の192.168.0.0から192.168.0.255まで256個のIP数を表しています。3.chrony再起動
# systemctl restart chronyd
4.OS再起動時にchronyを自動起動するように設定
# systemctl enable chronyd
5.ファイアウォール設定
クライアントPCからのNTP要求を許可するファイアウォールルールを追加します。
# firewall-cmd --permanent --add-service=ntp # firewall-cmd --reload
6.クライアントPCの時刻を同期設定
クライアントPCに上記設定したサーバーをNTPサーバーとして時刻を同期に追加します。
7.同期設定しているクライアントPC確認
下記のコマンドを実行する時刻を同期のためにアクセスしているクライアント一覧の確認できます。
# chronyc clients
NTPクライアントとして構成
1.Chronyインストール
# yum install -y chrony
2.設定ファイルを変更-サーバーディレクティブを追加
# vi /etc/chrony.conf既存のサーバーディレクティブをコメントアウトし、NTPサーバーの新しいサーバーディレクティブを追加します。
# Use public servers from the pool.ntp.org project. → 説明コメントアウト # Please consider joining the pool (http://www.pool.ntp.org/join.html). → 確認サイトについてコメントアウト # pool 2.centos.pool.ntp.org iburst → 現在時刻を同期ですが、こちらは先頭に#を追記してコメントアウトする server 192.168.0.21 → 時刻を同期するNTPサーバーのIPアドレスを追記3.chrony再起動
# systemctl restart chronyd4.NTPサーバーに到達確認
タイムソースをチェックして、クライアントが正しいNTPサーバーに到達していることを確認します。
# chronyc sourcesOutput: 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^? 192.168.0.21 3 6 1 25 +2525us[+2525us] +/- 87ms
5.手動時刻を同期
デフォルトは64秒ごとにNTPサーバーにポーリングして同期していますが、同期タイミング待たないで下記のコマンドで同期できます。
# chronyc makestep以上。
- 投稿日:2020-10-13T17:04:49+09:00
NTP(Chrony)インストール方法 (CentOS8)
はじめに
ネットワークタイムプロトコル(NTP)はリモートインターネットタイムサーバーと時刻を同期するためのネットワークプロトコルです。
ChronyはNTPの実装であり、以前のバージョンのエンタープライズLinuxオペレーティングシステムで使用されていた古いNtpdの代わりになります。
CentOS 8のNTP(Chrony)インストールと下記の二つの設定方法解説します。
①、NTPサーバーとして構成
NTPサーバーとして構成するとクライアントPC又クライアントサーバーがNTPサーバーの時刻を同期可能になります。
②、NTPクライアントとして構成
NTPクライアントとして構成すると設定NTPサーバーの時刻を同期することができます。
NTPサーバーとして構成
1.Chronyインストール
下記のコマンドを実行してインストールする。(既にインストールされていることもあります)
# yum install -y chrony2.設定ファイルを変更-クライアントへアクセス許可
# vi /etc/chrony.conf上記のコマンドを実行し、Confファイルの下記の箇所を追記します。
今回は192.168.0.0から192.168.0.254までのローカルネットワークのクライアントPCへアクセス時刻を同期にアクセス許可設定をします。# Allow NTP client access from local netwok → 説明コメント # allow 192.168.0.0/16 → 設定の例 allow 192.168.0.0/24 → こちらは追加
注. [/24]はサブネットマスク255.255.255.0の192.168.0.0から192.168.0.255まで256個のIP数を表しています。3.chrony再起動
# systemctl restart chronyd
4.OS再起動時にchronyを自動起動するように設定
# systemctl enable chronyd
5.ファイアウォール設定
クライアントPCからのNTP要求を許可するファイアウォールルールを追加します。
# firewall-cmd --permanent --add-service=ntp # firewall-cmd --reload
6.クライアントPCの時刻を同期設定
クライアントPCに上記設定したサーバーをNTPサーバーとして時刻を同期に追加します。
7.同期設定しているクライアントPC確認
下記のコマンドを実行する時刻を同期のためにアクセスしているクライアント一覧の確認できます。
# chronyc clients
NTPクライアントとして構成
1.Chronyインストール
# yum install -y chrony
2.設定ファイルを変更-サーバーディレクティブを追加
# vi /etc/chrony.conf既存のサーバーディレクティブをコメントアウトし、NTPサーバーの新しいサーバーディレクティブを追加します。
# Use public servers from the pool.ntp.org project. → 説明コメントアウト # Please consider joining the pool (http://www.pool.ntp.org/join.html). → 確認サイトについてコメントアウト # pool 2.centos.pool.ntp.org iburst → 現在時刻を同期ですが、こちらは先頭に#を追記してコメントアウトする server 192.168.0.21 → 時刻を同期するNTPサーバーのIPアドレスを追記3.chrony再起動
# systemctl restart chronyd
4.NTPサーバーに到達確認
タイムソースをチェックして、クライアントが正しいNTPサーバーに到達していることを確認します。
# chronyc sourcesOutput: 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^? 192.168.0.21 3 6 1 25 +2525us[+2525us] +/- 87ms
5.手動時刻を同期
デフォルトは64秒ごとにNTPサーバーにポーリングして同期していますが、同期タイミング待たないで下記のコマンドで同期できます。
# chronyc makestep以上。
- 投稿日:2020-10-13T11:49:29+09:00
MacBookにArchLinuxを入れる
間違って完成していないのに投稿してしまいました…
完成したらここの表示は消します…
完成するまでの順序は不定です…はじめに
この記事であなたのMacライフが良くなれば嬉しいです。
また、不適切な点があればご指摘いただければ幸いです。注意
WiFiについて
MacBook15まで(~2018)は内臓のWiFiが使えますが、 MacBook16(2019~)からは使う方法が確立されてないみたいです。
私はMacBookP15(2018)
なので知りませんが、それ以降のモデルをお持ちの方は有線LANか無線LANカードを刺さないと動きません。戯言
お急ぎの方へ。急いで読んでください。
私はMacOSが正直嫌いです。MacにWindowsをプリインストールしたらもっと売れるのではと思います。
さて、Macにして得られるものはXcode以外にあるのでしょうか?
まあ、様々な理由故にWindowsを入れてWSLを使うT2チップ難民が続出した訳ですね。
脱MacOSを推進するために書かせていただきます。要件
詳しくないのなら揃えることをおすすめします。
- USB Storage (あることを前提に書いています) [任意]
- External Keyboard1 (あることを前提に書いています)[任意]
- Refind2 (あることを前提に書いています)[任意]
内容について
ArchLinuxをインストールします。
明記していないものはすべてRun As Root
です。
ArchISOのBoot段階でカーネルパニックが起きるモデルでは諦めるか、ログを提出するしかないです。ヒント
1: ArchISOはrootをパスワードなしでログインします。
2: 作業の途中で中断したいときはsystemctl suspend
を使用します
3: chmodしてる方は流石にいないと思いますが、viなら:wq!
で保存できます。下準備
パーティショニング(NTFS,APFS関連)
私のMacのSSDは元々Windows10のシングルブートでしたが、Linuxとのデュアルブートにします。 (左がLinux)
この場合ではNTFSの縮小をしました。 各自パーティショニングをしてください。
ArchISOの準備
1: dl.t2linux.org/archlinux/iso/ から最新のISOを取ってきます。
2:Rufus
,Balenaetcher
,dd
などのツールを使い書き込みます。ventoy
を使ってもいいと思います。起動
これの起動は
Refind
ではなく、StartupManager
から起動してください。StartupManagerとは
Option
キーを長押ししながら起動するやつです。
#インストール = ArchISOでの工程 - キーボード
へ続きます。インストール
ArchISOでの工程
キーボード
日本語:
jp106
US:us
(default)loadkeys-for-jp106loadkeys jp106ネットワーク
<Interface>
をdevice list
から採れる実際のものに置き換えて下さい。
<SSID>
をstation <Interface> get-networks
から採れる実際のものに置き換えて下さい。
上矢印と下矢印が使えます。Networkiwctl # iwd> device list station <Interface> scan station <Interface> get-networks station <Interface> connect <SSID> exit # bash> systemctl start dhcpcd@wlan0 ## or dhclientその他準備
wiki.archlinux.jp/index.php
/インストールガイド をフォローします。システムクロックの更新
bashtimedatectl set-ntp true
パーティショニング
私の場合は、SSDの2番目のパーティション:
/dev/nvme0n1p2
をフォーマットして、マウントしました、
パーティションへのパスは置き換えてください。
また、Linux一本にしたりも出来ます。私の場合
cgdisk1 1000.0 KiB free space 2 1024.0 MiB EFI system partition ESP 3 150.0 GiB Linux filesystem LINUX-BTRFS 4 82.8 GiB Microsoft basic data WIN-NTFS
partitioning# パーティショニング (例) gdisk /dev/nvme0n1 :o :w cgdisk /dev/nvme0n1 # フォーマット mkfs.btrfs /dev/nvme0n1p2 -m dup # ROOTFSのマウント mount /dev/nvme0n1p2 /mnt # EFIパーティションのフォーマット (任意) mkfs.fat -F32 -s2 /dev/nvme0n1p1 # EFIパーティションのマウント mkdir /mnt/esp mount /dev/nvme0n1p1 /mnt/espOSのインストール
pacmanの構成
pacman.d/mirrorlist
これを最適化することでインストール時間を短縮できます。
exampleServer = https://mirrors.cat.net/archlinux/$repo/os/$arch
pacman.conf
他にRepoを使いたいならこれを編集します。
/mnt
へのインストールパッケージが置き換えられる事があるので都度
sed
で置き換えます。
Import PGP key
と出たら、サーバーからフェッチ出来てない事だと思うので、pacman -Scc
をして試しても出るなら諦めてpacman.conf
のSiglevel
をNever
にします。pacstrap /mnt base-devel linux-firmware p7zip $(pacman -Qq|tr '\n' ' '|sed s/xorg-luit//g) genfstab -U /mnt >> /mnt/etc/fstab arch-chroot /mntOSの初期設定
親の顔より見た設定。
タイムゾーン
# For residents of Japan ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime hwclock --systohcローカリゼーション
/etc/locale.gen
eng和jaen_US.UTF-8 ja_JP.UTF-8 # Other Lang ...locale-genlocale-gen
ja_JP.UTF-8
とen_US.UTF-8
を有効にすることが多いです。
/etc/locale.conf
englishLANG=en_US.UTF-8
/etc/vconsole.conf
jp106KEYMAP=jp106ホストネーム
簡単に言うとPCのニックネームですね。
<HostName?>
に使いたいホスト名を代入してください。/etc/hostname<HostName?>
/etc/hosts127.0.0.1 localhost ::1 localhost 127.0.1.1 <HostName?>.localdomain <HostName?>Rootのパスワード
passwdpasswdブートローダー
直接インストールするのは良くないのでRefindを使うことを前提にしています。
refindがきれいになるのでgrubを推奨します。Systemd-boot
[手動でエントリを追加する必要があります。その点grubは楽チン]
bootctl --path=/esp installGrub
Installgrub-install --target=x86_64-efi --efi-directory=/esp --bootloader-id=grub --boot-directory=/esp grub-mkconfig -o /esp/grub/grub.cfgここを参考にします。
ファームウェア
bashexit # arch-chrootから出る # ネットワーク cp -n /lib/firmware/brcm/* /mnt/lib/firmware/brcmOSインストール後の作業
ネットワーク
まずネットワーク関連。
やり方を忘れてしまったのなら、前に行ったネットワーク設定を参照してください。shell# Broadcom Firmware Mac modprobe brcmfmac iwctl # iwd> device list station <Interface> scan station <Interface> get-networks station <Interface> connect <SSID> systemctl enable dhcpcd@<Interface> systemctl start dhcpcd@<Interface> systemctl enable NetworkManager systemctl start NetworkManager systemctl enable iwd systemctl start iwd touch /etc/modules-load.d/brcmfmac.conf
/usr/lib/modprobe.d/broadcom-wl.conf
からbrcm*
の行を消します。
下のものが完成形になります。/usr/lib/modprobe.d/broadcom-wl.confblacklist b43 blacklist b43legacy blacklist ssb blacklist bcm43xx blacklist bcma一般ユーザーの作成
Linuxでは一般ユーザーで運用する事、及びそれ前提が多いです。
useradd
ユーザー名 -md $home_dir -s $user_shell -c $user_comment
例:
-: $home_dir:/home/ユーザー名
(これが無いとホームディレクトリが作られません)
-: $user_shell:/usr/bin/(bash,zsh,fishなど)
(任意)
-: $user_comment:'How do you use'
(任意)useradduseradd # 危険ですが、危険ですが、使いやすくなります。 echo 'ユーザー名 ALL=NOPASSWD:ALL' >> /etc/sudoers passwd ユーザー名Pacman関連
1:
pacman.conf
を編集。
2:pacman -Syyuu
でOSのアップグレード。
mbp
repoをフェッチしていない場合、pacman.conf
をarchisoからコピーします。
mbp
の下にSigLevel = Never
を追加します。3:
yay
のインストールmakepkgsu ユーザー名 $> git clone https://aur.archlinux.org/yay-git.git ~/yay cd ~/yay makepkg -siキーボード
[**]を存在するものに置き換えて下さい。
shell# KeyBoard (これは動かないみたいです。書いてる途中です。) pacman -Sy apple-bce-dkms-git touch /etc/modules-load.d/apple-bce.conf # Contain TouchBar git clone --branch mbp15 https://github.com/roadrunner2/macbook12-spi-driver.git /usr/src/apple-ibridge-0.1 dkms install -m apple-ibridge -v 0.1 touch /etc/modules-load.d/industrialio_triggered_buffer.conf touch /etc/modules-load.d/apple-ibridge.conf touch /etc/modules-load.d/apple-ib-tb.conf touch /etc/modules-load.d/apple-ib-als.confデスクトップ
ここでは
swaywm
を入れます。取り敢えずfirefox
,dmenu
,alacritty
,noto-fonts-cjk
を入れるといいです。
サイズが小さいのと、依存が少なく消しやすいところがいいと感じます。ログインマネージャーに関してやりがちなのが、systemctlなど以外から起動している事です。ものによっては動きません。
私はlightdmのwebkit2-greeterが凄く好きです。遂に公式パッケージにもなりましたしね!# インストール pacman -Syy sway lightdm lightdm-webkit2-greeter # 構築初めてなら cp -n /etc/sway/config ~/.config/sway/config # Waylandでfirefox使うなら alias firefox='MOZ_ENABLE_WAYLAND=1 firefox' # lightdmを自動起動させる。 systemctl enable lightdm/etc/lightdm/lightdm.conf[Seat:*] ... greeter-session=lightdm-webkit2-greeter私の場合102行目に有りました。
ArchWiki:LightDMより
Firefoxでcaエラーが出るときは システムクロックの更新 を再度試してください。引用
- 投稿日:2020-10-13T00:28:21+09:00
デフォルトアプリでファイルを開く
- 投稿日:2020-10-13T00:16:53+09:00
ふつうのLinuxプログラミング(の第1部だけ)を読んでいく
雑にまとめているのであとで書き直す。
第0部
- Linux の世界は3 つの概念によって成立している。
- ファイルシステム
- プロセス
- ストリーム
第1部
Linuxの基本用語解説
第1章
- ある関数を使うためにどのヘッダファイルをインクルードすればよいか、ということはmanに書いてある。
- 「*」や「?」のようなファイル名展開機能(グロブ)はシェルの機能。
- argc
- コマンドライン引数の数
- argv
- コマンドライン引数の実体(charへのポインタの配列)
- man
- リファレンスマニュアル。
- printfにはコマンドのprintf(1)とライブラリ関数のprintf(3)があったりする。
- info
- ドキュメントシステム。
- ウェブ
- man, info 以外のUNIXの情報源 ※グーグル検索。
第2章
Linxのソフトウェアパッケージ
- シェル(bash, ash, csh, tcsh, zsh, pdksh, ...)
- util-linux(init, getty, login, reset, fdisk, ...)
- procps(ps, pstree, top, ...)
- GNU coreutils(ls, cat, mkdir, rmkidr, cut, chmod, ...)
- GNU grep, findutils, diffutils(grep, find, diff, ...)
- GNU libc
- 各種の基本ライブラリ(ncurses, zlib, GDBM, ...)
- 開発環境(gcc, binutils, make, biscon, flex, ヘッダファイル類, ...)
- X Window System
- GNOMEやKDE
Linux ディストリビューション
- Red Hat, CentOS, Ubuntu, Debian, SUSE, Gento
Linux は Unix 風OSの一種。
macOSは大半がFreeBSDからの派生。
カーネル
- OSの核である。
- 1つのプログラムで構成されている。
- コンピュータを構成する全てのハードウェアとソフトウェアを管理している。
ルートディレクトリにある vmlinuz, vmlinux, vmlinuz-XXX といった名前のファイルがLinuxカーネルのプログラム本体。
厳密には「Linux」という単語はカーネルを指す。
デバイス
- カーネルは、以下のような物理的なハードウェアを統括する。
- CPU
- メモリ
- HDD(ハードディスクドライブ)
- SSD(ソリッドステートドライブ)
- DVD-ROMドライブ
- CD-ROMドライブ
- グラフィックアダプタ(画像モニタに送る部品)
- ネットワークアダプタ
- サウンドカード
- 時計(ハードウェアロック)
デバイスドライバ
- 特定のデバイスを操作するためのソフトウェア部品のこと。
システムコール
- カーネルに仕事を頼む仕組み。
- システム -> カーネル
- 前提
- ハードウェアと直接やり取りできるのはカーネルだけに(つまりデバイスドライバだけに)限定されているので、普通のプログラムがハードウェアを操作したいときはカーネルに仕事を頼んで間接的に操作するしかない。
- カーネルはシステムで一番偉いプログラムだが、一方で一番下っ端にいてこき使われるプログラムでもある。
- システムコールの呼び出しも見た目はごく普通の関数呼び出し。
- 例
- open, read, write, fork, exec, stat, unlink
カーネルまとめ
- Linux世界とは、Linuxカーネルの作り出す世界であり、そのカーネルに仕事をさせるにはシステムコールを使うしかない。
- ファイルシステム・プロセス・ストリームについても、システムコールを通じてイメージを作り上げていく。
ライブラリ関数
- プログラミングするときに、システムコール以外にも使える関数。
- 例: printf(), exit(), strlen(), strcpy(), ...
- ライブラリ関数を リンク(link) すると、その関数を呼び出すことができるようになる。
libc
- 標準Cライブラリ(standard C library)
- Ubuntuなら /lib, CentOSなら /lib64 ディレクトリの下に中核となるファイルがある。
- GNU libc
- Linuxで普通使われているlibc。
- GNUプロダクトの一部なので、Linuxカーネル開発者のLinusさんではない別の人が作っている。
API
- 例えば、libxのAPIは関数やマクロ、カーネルのAPIはシステムコール。
第3章
3-1. ファイルシステム
ファイル
- 広義のファイル
- ls で表示されるもの
- 狭義のファイル
- regular file
- 内容がそのまま記録されているファイル。
- テキストファイル、画像ファイル、動画ファイルなど。
- ディレクトリ
- 他のファイルを複数入れることができるファイル。
- シンボリックリンク
- 他のファイルの名前を格納したファイル。
- 別名ソフトリンク(soft link)。
- デバイスファイル
- デバイス(ハードウェア)をファイルとして表現したもの。
- APIを使ってSSDやHDDに記録されているデータを操作できるが、非常に危険なので試してはいけない。
- キャラクタデバイスファイル
- プリンタやモデム
- ブロックデバイスファイル
- SSDやHDD
- 名前付きパイプ
- プロセス間通信に使うファイル。FIFO。
- 使用頻度は低い。
- UNIXドメインソケット
- プロセスかん通信に使うファイル。
- 現在ではTCPソケットで代替できる。
ls -l コマンド
- ファイルの付帯情報を表示できる。
- ファイルの種類
- パーミッション
- サイズ
- 更新時刻
まとめ
- 何らかのデータを保持する
- 付帯情報がついている
名前(パス)で指定できる
ファイルシステムはSSDやHDD、USBメモリのような、物理的な記憶媒体の上にある。
- パーティション
- ディスクの区画の区切り。
- マウント
- パーティションの上にファイルシステムを用意して、一本の巨大なディレクトリツリーを作る。
3-2. プロセス
- プロセス
- 動作中のプログラムのこと。
- 1つのプログラムがあればプロセスはいくつでも作れる。
プログラム
- ファイルのような形態で存在しているデータのことも含む言葉。
プロセスID
- psコマンドの出力の左から2番目の欄の番号。
- プロセスを一意に指定する。
シグナル
- Ctrl + C を押してプロセスを止める仕組みを支えている。
- カーネルが該当プロセスに割り込みシグナルを送り、それを受け取ったプロセスは自発的に終了する。
- UNIXに古くからある仕組みで、UNIX(Linux)プログラミングでは非常に重要な位置を占める。
3-3. ストリーム
- ストリーム
- バイトの流れのことを指す。バイト列が流れる通り道。
- 他書では「ファイル」や「open file」と呼ばれている。
- FILE型の値
- FILE型
- ストリームを操作するときに使うデータ構造。
- STREAMSカーネルモジュール
- STREAMS
- ストリームを提供するために使われるカーネルモジュール
- ストリームが使用されている例 1
- プロセスがファイルの内容にアクセスしたいとき。
- ファイルにつながるストリームを作ってもらえるようにカーネルに(システムコールを使って)頼む。
- そしてまたシステムコールを使い、ストリームを操作してファイルの中身を取り出す。
- read
- ストリームからバイト列を取り出すこと
- ファイルの内容を読む
write
- ストリームからバイト列を流し込むこと
- ファイルに書く
ストリームが使用されている例 2
- キーボードのキーの押下。
- 押下されたキーを表すバイトの列を送りつけてくるストリームだと考えられる。
デバイスファイルは、ストリームを得るためのとっかかりとして存在する。
パイプ
- プロセスが両端にいるストリーム
- less コマンドや grep コマンドを使うときのパイプ
- パイプの仕組み
- まず各コマンドを独立したプロセスとして同時に実行する。
- そのプロセス間をストリーム(パイプ)で繋ぐ。
ネットワーク通信
- ストリームが別のコンピュータまで延びていること。
- 一方のコンピュータのプロセスから、もう一方のコンピュータのプロセスに繋ぐ。
- バイト列がちゃんと輸送される限り問題ない。
プロセス間通信
- パイプやネットワーク通信のように、プロセス同士がストリームを通じてデータをやりとりしたり意思の疎通を図ること。
- ストリーム以外を使ったプロセス間通信機構もある。
- POSIX IPC
まとめ
- ファイルシステム
- データに名前をつけて保存する場所
- プロセス
- 何らかの活動をする主体
ストリーム
- プロセスがファイルシステムや他のプロセスとデータをやり取りする手段
これだけで、Linux OSの構造はおおむね語ることができてしまう。
第4章
4-1. ユーザーとグループ
login
- Linuxを使うとき、まず最初にユーザー名とパスワードを入力する。
- 自分専用のホームディレクトリに移動し、自分用のシェル(bash)が起動して、自分に許可されているファイルを読み書きできるようになる。
マルチユーザーシステム
- Linuxのように複数のユーザーが同時に使えるシステムのこと。
- UNIXがそうだった。
- システムにとって重要なファイルは普段使うユーザーとは別のユーザーの所有にしておき、所有者以外には変更できないようにすることで、重要なファイルをうっかり消してしまうことがなくなる。
スーパーユーザー
- root
- あらゆるファイルを変更、削除、プロセスを停止できる権限を持っている。
グループ
- ユーザーのグループ。
- グループに権限を与えるとそのグループのメンバ全員に権限を与えたことになる。
- 特定のデバイスファイルの使用許可。
- 各ユーザーは常に最低1つのグループに所属している。
- useraddコマンドでユーザーを作成するなら、-gオプションでグループを指定できる。
パーミッション
- 3つのユーザー区分と3つの権限がある。
- ファイルにはそれを所有するユーザーとグループが決まっている。
- ファイルを所有するユーザー
- ファイルを所有するグループに所属するユーザー
- それ以外のユーザー
- 権限の種類
- 読み込み(read, r)
- 書き込み(write, w)
- 実行(execute, x)
- 例:
- rw-r--r--
- 所有者読み書き可能、所有グループ読み込み可能、その他のユーザ読み込み可能。
- 普通のファイル。
- rwxr-xr-x
- 所有者読み書き実行可能、所有グループ読み込み実行可能、その他のユーザ読み込み実行可能。
- プログラムやディレクトリ。
- rw-------
- 所有者のみ読み書き可能。
- SSHの秘密鍵など、本人以外に見られてはまずいファイル。
パーミッションの8進表記
- 例:
- rwxr-xr-x
- rwx=4+2+1, r-x=4+0+1, r-x=4+0+1 = 755
- rw-r--r--
- 644
ディレクトリのパーミッション
- 読み込み可能の場合
- その中のファイル一覧を得られる
- lsコマンドなど
- 書き込み可能の場合
- その中に新しいファイルを作成したり削除できる
- 実行可能の場合
- そのディレクトリ中のファイルにアクセス(読み書き実行)できる
クレデンシャル
- プロセスの属性としてのユーザーのこと
- 「ユーザーAとして操作する」=「ユーザーAの属性を持ったプロセス群を操作する」
- 「このプロセスはLinux上においてこのユーザーの代理人として動作しているぞ」という証明書のこと。
- カーネルはその証明書を見てパーミッションを判断する。
- ログイン(login)の過程で、証明書を持つプロセスがシステム上に作成される。
ユーザー名とユーザーID
- カーネルはユーザー名に対応するユーザーIDのみを扱う。
ユーザーデータベース
- ユーザー名とユーザーIDの対応が書いてあるファイル。
- 一般的には /etc/password にある。
- 例:
- root:\x:0:0:root:/root/:/bin/bash
- ユーザー root, パスワード x, ユーザーID 0, ユーザーグループ 1
4-2. シェルと端末
コマンドラインとは、以下の2つからなる。
- シェル(shell)
- 端末(terminal)
端末
- コンピュータのハードウェアのうち、人が直接に接する部分。
端末の歴史
- テレタイプ
- UNIXの黎明期に大量に使われていた端末。
- ディスプレイがなかった時代の、コンピュータからのプリンタ出力やタイプライター入力。
- テレタイプに由来して、UNIXでは端末のことを tty と呼ぶことがある。
- ダム端末
- テレタイプの後に登場した端末。
- 文字だけを表示可能なディスプレイと、キーボードと、それに付随するハードウェア。
- キャラクタ端末
- 初期のダム端末。
- ディスプレイに文字しか表示することができない。
- ビットマップディスプレイ
- 細かい色の点の集まりで全てを表現する。
- X端末
- X Window Systemを動作させるために使われた、ビットマップディスプレイを装備した機種。
- 端末エミュレータ
- 元々ハードウェアであった端末を全てソフトウェアにしてしまったもの。
- macOSのTerminal.appやiTerm2など。
- 現代的なビットマップディスプレイを持った端末であるパソコンの中で、あえてキャラクタ入出力を行う、最先端のような先祖返りのような端末。
仮想コンソール
- Linuxでは物理的な端末がそのまま使われるわけではなく、仮想コンソールというものが間に挟まっている。
- ソフトウェア的な端末。
キャラクタ端末とASCII
- 現代的なGUIを備えたコンピュータで「a」を表示するときは、あらかじめメモリ上に「a」を表現する画像を作っておき、「このような画像を表示せよ」と命令する。
- ASCII
- 文字コード。
- 端末に「aという文字を表示しろ」と指定するとき、文字と数値を対応づけて、その数値を伝える。
ファイルとしての端末、ストリームとしての端末
- ファイルとして表現されていると、表現されているものに接続するためのストリームが得られる。
- 端末につながったストリームを読むとキーボードからの入力が得られ、端末につながったストリームに書くとディスプレイに文字を出力できる。
シェル
- ユーザーからの命令を解釈して実行するプログラムのこと。
- sh, bash, csh, tcsh, zsh, ksh, ash
- シェルはログイン時に起動されるという点で少し特別なだけで、それ自体はストリームからコマンドを読み込んで実行するプログラムに過ぎない。
- そのストリームが端末につながっている場合、「$」や「%」のようなコマンドラインプロンプトを出力する。