20201013のLinuxに関する記事は6件です。

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

実際のバックアップ・リストア

バックアップ

まずテープの状況を確認します。

# 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 に来ています。

リストア

テープを先頭まで巻き戻します。

# 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 で移動することができません。

特に移動コマンドの移動先についての説明が違うため、動作の仕様を理解するのに時間がかかりました。この違いについては、別の記事で解説してみたいと思います。


  1. Linux の man tar(1) では "an archiving utility" と紹介されていますが、FreeBSD の man tar(1) では "manipulate tape archives" と紹介されています。  

  2. もちろん、Linux の tar でもテープにバックアップを取ることができます。 

  3. Linux では mt bsfm 1 で移動できます。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 chrony

 2.設定ファイルを変更-クライアントへアクセス許可

    # 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.0192.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 sources 
Output:

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

以上。
  

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 chrony

 2.設定ファイルを変更-クライアントへアクセス許可

# 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.0192.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 sources 
Output:

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

以上。
  

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の縮小をしました。 各自パーティショニングをしてください。
image.png

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-jp106
loadkeys jp106

ネットワーク

<Interface>device listから採れる実際のものに置き換えて下さい。
<SSID>station <Interface> get-networksから採れる実際のものに置き換えて下さい。
上矢印と下矢印が使えます。

Network
iwctl
# 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/インストールガイド をフォローします。

システムクロックの更新
bash
timedatectl set-ntp true

パーティショニング

私の場合は、SSDの2番目のパーティション: /dev/nvme0n1p2をフォーマットして、マウントしました、
パーティションへのパスは置き換えてください。
また、Linux一本にしたりも出来ます。

私の場合

cgdisk
1   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/esp

OSのインストール

pacmanの構成

pacman.d/mirrorlist

これを最適化することでインストール時間を短縮できます。

example
Server = https://mirrors.cat.net/archlinux/$repo/os/$arch
pacman.conf

他にRepoを使いたいならこれを編集します。

/mnt へのインストール

パッケージが置き換えられる事があるので都度sedで置き換えます。
Import PGP keyと出たら、サーバーからフェッチ出来てない事だと思うので、pacman -Sccをして試しても出るなら諦めてpacman.confSiglevelNeverにします。

pacstrap /mnt base-devel linux-firmware p7zip $(pacman -Qq|tr '\n' ' '|sed s/xorg-luit//g)
genfstab -U /mnt >> /mnt/etc/fstab
arch-chroot /mnt

OSの初期設定

親の顔より見た設定。

タイムゾーン
# For residents of Japan
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
hwclock --systohc
ローカリゼーション
/etc/locale.gen
eng和ja
en_US.UTF-8
ja_JP.UTF-8
# Other Lang
...
locale-gen
locale-gen

ja_JP.UTF-8en_US.UTF-8を有効にすることが多いです。

/etc/locale.conf
english
LANG=en_US.UTF-8
/etc/vconsole.conf
jp106
KEYMAP=jp106
ホストネーム

簡単に言うとPCのニックネームですね。
<HostName?> に使いたいホスト名を代入してください。

/etc/hostname
<HostName?>
/etc/hosts
127.0.0.1   localhost
::1     localhost
127.0.1.1   <HostName?>.localdomain  <HostName?>
Rootのパスワード
passwd
passwd
ブートローダー

直接インストールするのは良くないのでRefindを使うことを前提にしています。
refindがきれいになるのでgrubを推奨します。

Systemd-boot

[手動でエントリを追加する必要があります。その点grubは楽チン]

bootctl --path=/esp install
Grub
Install
grub-install --target=x86_64-efi --efi-directory=/esp --bootloader-id=grub --boot-directory=/esp
grub-mkconfig -o /esp/grub/grub.cfg

ここを参考にします。

ファームウェア
bash
exit # arch-chrootから出る
# ネットワーク
cp -n /lib/firmware/brcm/* /mnt/lib/firmware/brcm

OSインストール後の作業

ネットワーク

まずネットワーク関連。
やり方を忘れてしまったのなら、前に行ったネットワーク設定を参照してください。

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.conf
blacklist 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' (任意)

useradd
useradd
# 危険ですが、危険ですが、使いやすくなります。
echo 'ユーザー名 ALL=NOPASSWD:ALL' >> /etc/sudoers
passwd ユーザー名

Pacman関連

1: pacman.confを編集。
2: pacman -SyyuuでOSのアップグレード。

mbprepoをフェッチしていない場合、pacman.confをarchisoからコピーします。
mbpの下にSigLevel = Neverを追加します。

3: yayのインストール

makepkg
su ユーザー名
$>
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エラーが出るときは システムクロックの更新 を再度試してください。

引用


  1. External Keyboardを使わずにインストールをするときは、
    ArchISOでインストールを完結させればキーボードは不要です。
    ここでは2回に分けているだけです。 

  2. Refindを使わずに起動をしたいときは、
    EFIをSSDのEFIパーティションにおいてください。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

デフォルトアプリでファイルを開く

コマンドライン環境だと、カレントディレトリにあるファイルをプラットフォームのデフォルトアプリで開きたくなることがあります。各プラットフォームでの方法を調べてみました。

Linux

$ xdg-open ファイル名

Windowsのコマンドプロンプト

> start ファイル名

cygwin

$ cygstart ファイル名
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ふつうの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
    • プロセスがファイルの内容にアクセスしたいとき。
      1. ファイルにつながるストリームを作ってもらえるようにカーネルに(システムコールを使って)頼む。
      2. そしてまたシステムコールを使い、ストリームを操作してファイルの中身を取り出す。
  • read
    • ストリームからバイト列を取り出すこと
    • ファイルの内容を読む
  • write

    • ストリームからバイト列を流し込むこと
    • ファイルに書く
  • ストリームが使用されている例 2

    • キーボードのキーの押下。
    • 押下されたキーを表すバイトの列を送りつけてくるストリームだと考えられる。
  • デバイスファイルは、ストリームを得るためのとっかかりとして存在する。

  • パイプ

    • プロセスが両端にいるストリーム
    • less コマンドや grep コマンドを使うときのパイプ
    • パイプの仕組み
      1. まず各コマンドを独立したプロセスとして同時に実行する。
      2. そのプロセス間をストリーム(パイプ)で繋ぐ。
  • ネットワーク通信

    • ストリームが別のコンピュータまで延びていること。
      • 一方のコンピュータのプロセスから、もう一方のコンピュータのプロセスに繋ぐ。
      • バイト列がちゃんと輸送される限り問題ない。
  • プロセス間通信

    • パイプやネットワーク通信のように、プロセス同士がストリームを通じてデータをやりとりしたり意思の疎通を図ること。
    • ストリーム以外を使ったプロセス間通信機構もある。
      • 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つからなる。

    1. シェル(shell)
    2. 端末(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
    • シェルはログイン時に起動されるという点で少し特別なだけで、それ自体はストリームからコマンドを読み込んで実行するプログラムに過ぎない。
      • そのストリームが端末につながっている場合、「$」や「%」のようなコマンドラインプロンプトを出力する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む