20201218のLinuxに関する記事は11件です。

io_uringを使うプログラムはCentOS 8上のDockerで動かない

Linux kernel 5.1から導入されたio_uringという非同期IOのカーネル機能がありますが、それを使うDockerイメージはCentOS 8で動きませんよと。
知ってる人にはまあ、そうだよねという事ではあるのですが。

Docker/Linuxコンテナのポータビリティは万能ではないんですよと議論したい場合の論拠として。

io_uring使うプログラムをUbuntu 20.10で作る

1.OSがUbuntu 20.10の仮想マシンを作る。
https://ubuntu.com/download

2.Dockerをインストールする。
https://docs.docker.com/engine/install/ubuntu/

3.Docker上でUbuntu 20.10イメージを起動する。
# docker run -it --rm --name=io_uring-test ubuntu:20.10 bash

4.一応、uname -aで利用中のカーネルを確認。
(c)# uname -a

(実行結果)
root@17003dd74a2f:/liburing/examples# uname -a
Linux 17003dd74a2f 5.8.0-33-generic #36-Ubuntu SMP Wed Dec 9 09:14:40 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

5.gccとio_uringのライブラリ、gitをインストールする。
(c)# apt-get update
(c)# apt-get install -y build-essential liburing-dev git

6.io_uringのサンプルプログラムを入手する。
https://blogs.oracle.com/linux/an-introduction-to-the-io_uring-asynchronous-io-framework
(c)# git clone https://github.com/axboe/liburing.git

7.サンプルプログラムをコンパイルする。
(c)# cd liburing/examples
(c)# gcc -Wall -O2 -D_GNU_SOURCE -o io_uring-test io_uring-test.c -luring

8.プログラムを実行する。当然、こちらは動作する。
(c)# ./io_uring-test io_uring-test.c

(実行結果)
root@08ad6f4c804c:/liburing/examples# ./io_uring-test io_uring-test.c
Submitted=1, completed=1, bytes=2256

9.コンテナからデタッチ(C-p, C-q)し、コミット、イメージ保存する。
# docker commit io_uring-test io_uring-test
# docker save io_uring-test -o io_uring-test.tar

CentOS 8のDockerでそのプログラムを動かす

1.OSがCentOS 8.3の仮想マシンを作る。
https://www.centos.org/download/

2.Dockerをインストールする。
https://docs.docker.com/engine/install/centos/

3.先のDockerイメージ(io_uring-test.tar)をCentOS 8マシンにコピーし、ロードする。
# docker load -i io_uring-test.tar

4.コンテナを起動する。
# docker run -it --rm io_uring-test bash

5.一応、uname -aで利用中のカーネルを確認。ホストのCentOS 8と同じ4.18なはず。
(c)# uname -a

(実行結果)
root@824c737193b6:/# uname -a
Linux 824c737193b6 4.18.0-240.1.1.el8_3.x86_64 #1 SMP Thu Nov 19 17:20:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

(ついでに)
root@824c737193b6:/liburing/examples# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.10 (Groovy Gorilla)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.10"
VERSION_ID="20.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=groovy
UBUNTU_CODENAME=groovy

5.サンプルプログラムを動かす。
(c)# cd liburing/examples/
(c)# ./io_uring-test io_uring-test.c

(実行結果)
root@824c737193b6:/liburing/examples# ./io_uring-test io_uring-test.c
queue_init: Function not implemented

まあ、動きませんよね、と。

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

io_uringを使うプログラムはCentOS 8上のDockerでは動かない

Linux kernel 5.1から導入されたio_uringという非同期IOのカーネル機能がありますが、それを使うDockerイメージはCentOS 8で動きませんよと。
知ってる人にはまあ、そうだよねという事ではあるのですが。

Docker/Linuxコンテナのポータビリティは万能ではないんですよと議論したい場合の論拠として。

io_uring使うプログラムをUbuntu 20.10で作る

1.OSがUbuntu 20.10の仮想マシンを作る。
https://ubuntu.com/download

2.Dockerをインストールする。
https://docs.docker.com/engine/install/ubuntu/

3.Docker上でUbuntu 20.10イメージを起動する。
# docker run -it --rm --name=io_uring-test ubuntu:20.10 bash

4.一応、uname -aで利用中のカーネルを確認。
(c)# uname -a

(実行結果)
root@17003dd74a2f:/liburing/examples# uname -a
Linux 17003dd74a2f 5.8.0-33-generic #36-Ubuntu SMP Wed Dec 9 09:14:40 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

5.gccとio_uringのライブラリ、gitをインストールする。
(c)# apt-get update
(c)# apt-get install -y build-essential liburing-dev git

6.io_uringのサンプルプログラムを入手する。
https://blogs.oracle.com/linux/an-introduction-to-the-io_uring-asynchronous-io-framework
(c)# git clone https://github.com/axboe/liburing.git

7.サンプルプログラムをコンパイルする。
(c)# cd liburing/examples
(c)# gcc -Wall -O2 -D_GNU_SOURCE -o io_uring-test io_uring-test.c -luring

8.プログラムを実行する。当然、こちらは動作する。
(c)# ./io_uring-test io_uring-test.c

(実行結果)
root@08ad6f4c804c:/liburing/examples# ./io_uring-test io_uring-test.c
Submitted=1, completed=1, bytes=2256

9.コンテナからデタッチ(C-p, C-q)し、コミット、イメージ保存する。
# docker commit io_uring-test io_uring-test
# docker save io_uring-test -o io_uring-test.tar

CentOS 8のDockerでそのプログラムを動かす

1.OSがCentOS 8.3の仮想マシンを作る。
https://www.centos.org/download/

2.Dockerをインストールする。
https://docs.docker.com/engine/install/centos/

3.先のDockerイメージ(io_uring-test.tar)をCentOS 8マシンにコピーし、ロードする。
# docker load -i io_uring-test.tar

4.コンテナを起動する。
# docker run -it --rm io_uring-test bash

5.一応、uname -aで利用中のカーネルを確認。ホストのCentOS 8と同じ4.18なはず。
(c)# uname -a

(実行結果)
root@824c737193b6:/# uname -a
Linux 824c737193b6 4.18.0-240.1.1.el8_3.x86_64 #1 SMP Thu Nov 19 17:20:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

(ついでに)
root@824c737193b6:/liburing/examples# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.10 (Groovy Gorilla)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.10"
VERSION_ID="20.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=groovy
UBUNTU_CODENAME=groovy

5.サンプルプログラムを動かす。
(c)# cd liburing/examples/
(c)# ./io_uring-test io_uring-test.c

(実行結果)
root@824c737193b6:/liburing/examples# ./io_uring-test io_uring-test.c
queue_init: Function not implemented

まあ、動きませんよね、と。

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

Alpine LinuxでLive USBを作る

Alpine Linuxとは

 なんでもbusyboxにやらせてしまう軽量Linuxです。軽量なのでDockerのコンポーネントに使われることも多いです。GUI?知らない子です。

※ この記事はWindows PC上での動作を想定しています。

Alpine LinuxのISOイメージ

 Alpine Linuxのイメージは以下にあります。

https://www.alpinelinux.org/downloads/

 通常はStandard ISOイメージを利用します。オフラインインストールの場合は、Extendを使うと良いでしょう。仮想OSにはVirtual ISOを使います。Virtualのイメージは40MBと桁外れに小さいです。

Alpine Linuxの特徴

メインのコマンドがbusyboxのシンボリックリンク

 busyboxは組込用のコマンドで、lsもcpもなんでもかんでもbusyboxのシンボリックにすることでファイルサイズを小さくしています。実はこれは罠があります(挙動が若干異なります)

ちなみにinitramfsの/binの下を見るとshとbusyboxしかない。

シェルはbashではない。

 Alpine Linuxは、ashと言うシェルを使っています。shと互換がありますが、bashと互換がありません。bash依存のスクリプトを動かしたい場合は、別途bashをインストールする必要あります。

Live USBを作る

  • Windowsの場合、rafusでISOモードで書き込みます。
  • Linuxは、公式参照

 試しに拾ってきた1GBのUSB入れてみましたが十分動きます。

インストールする

 Alpine Linuxはインストーラーの自動起動をしません。起動するとlogin画面が起動するだけです。rootでログインしてから、コマンドラインから

setup-alpine

 ――と打ち込むとインストール出来ますが、今回はしません。

Live USBに更新を反映させる

 ここからが本番。

Alpine LinuxにはAlpine local backupと言うシステムがあります。Ubuntuのlive usbのperticient(casper-rw)と似たような事ができますが、

lbu commit

 と打ち込まないと更新が反映されません。更新される範囲も/etc 他一部だけで、/rootとか/binなどは反映されないみたいです(/etc/lbu以下の設定を変えたり、lbu includeを使う方法があります)。lbuを動かす時は、最初に/etc/lbu/lbu.confを書き換える必要があります。

 この更新ファイルは、ルートに localhost.apkov.tar.gzなどと言う名前で吐き出されるので手で直せます。これをカスタマイズに利用します。casper-rwと違いマウントが必要なく、tar.gzなので簡単に書き直せます。さらに同期しないので軽量です。

 まず、日本の環境で実行する為には以下を実行。

## キーマップを変更
# setup-keymap 
##タイムゾーンを変更
# setup-timezone
## 変更を保存
# lbu commit

 日本語?知らない子

お手軽カスタムLive USB

 空きメディアにapkファイルをぶち込みます。USBは/media/usbにマウントされます、

 そこで/etc/inittab を書き換えます。

変更前

tty1::respawn:/sbin/getty 38400 tty1

変更後

tty1::respawn:/bin/sh /media/usb/init.sh 38400 tty1

 先ほど書いた通り、lbu commitを実行しないと更新は反映されません。

それからinit.shに実行させるスクリプトを書きます(/media/usbはread onlyモードなので直接書き換えられません)。ここでは/media/usbを呼び出していますが、/etcの配下に於いてしまえば、起動後USBメモリを抜いても動作します。

 ただし一回メモリを抜いてしまうと/media/usb以下は空になってしまうので注意。

  • 起動後挙動がおかしい場合CTRL+ALT+F2でターミナルを切り替えて処理

 これで面倒なカスタマイズ無しにHDDクリーナーなどが簡単に出来ます。

注意事項

例えば、ディスクシュレッダー擬きを作る時にshredを使いますが、Alpine Linuxのshredは、busyboxのシンボリックリンクです。busyboxのshredはファイルの消去以外が出来ませんしオプションも異なります。そこでGNU coreutilsを別途インストールする必要があります。

Alpine Linuxのパッケージマネージャーはapkで、インストールするときはaddを使います。

 apk add coreutils

 ――とするとbusyboxではないGNU shredが使える様になります。

 Alpine Linuxは軽量な分、ユーティリティを動かそうとするとライブラリが足りないケースがあると思われます

 だが、それらのapkは起動時にインストールしてしまえば良い。小さいバイナリならインストール時間は誤差範囲(/etc/lbu以下の設定を変える方法もあります)

USBにextraフォルダを作成し、インストールするapkを投げ込んでおきます。

 apk add --no-network --allow-untrusted --force-non-repository /media/usb/extra/*.apk

 こうやってinit.shから強引にインストールしてしまうのです(パッケージが無いものは作るしかないけど)カスタマイズしないのでお気楽LiveUSBが作れます。

lbu package使うのが正しいやりかたな気もする……

※ ここでdockerとdocker-compose入れたら何でもありな気が……。

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

Too many open files になったとき

概要

  • Jenkinsサーバで、 Caused by: java.io.IOException: error=24, Too many open files のようなエラーが発生
  • FD(File Descriptor)が枯渇しているっぽいのでulimitを上げる
  • OSはUbuntu 14.04

/etc/security/limits.conf

以下の記述を追加

* soft nproc 65535
* hard nproc 65535
* hard nofile 65535
* soft nofile 65535

rebootして ulimit -n すると...

$ ulimit -n
65535

良さそう。

ところがJenkinsは自分で勝手に上書きをしていた...

Jenkinsから見えるulimitの結果がおかしい場合

まさにこれ。

/etc/default/jenkins を書き換えて、 service restartして、真の対応完了。

(Systemd化されている最近のやつは別の箇所を編集する必要があるのであしからず)

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

「Linux 標準教科書」読みました!

スクリーンショット 2020-12-18 13.30.19.png
Linux 標準教科書読みました!
Linuxの役割やできることについて以下のことが大まかにわかりました。
・ファイルやフォルダの操作
・vimの使い方
・ユーザーによる権限とその変更
・シャルスクリプトについて
・ネットワークの確認と設定
・プロセスの実行と確認
正直パイプの繋ぎや正規表現あたりはいまいち飲み込めませんでしたがいずれは理解できるようになりたいです。
Amazonから基本情報技術者の本が届いたので次はこれを学習していきます!

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

Ubuntu + qemu 上の FreeBSD のデスクトップ環境の設定

はじめに

Linux + qemu 上の FreeBSD で、Xfce4 というデスクトップ環境を使用するためのインストールと設定の手順を説明します。
* Linux + qemu 上で FreeBSD を動かす も参照してください。

以下の各説明では実際に実行するコマンドを以下のような形で記述しています。

# pkg install パッケージ名

実際には上記のコマンドを実行するとパッケージインストールの進捗状況が表示されますが、本ページではそれらの表示を省いています。
* 上記の行頭にある "# " は、root のプロンプトを表しています。
* 一般ユーザ権限で実行する場合には、"$ " と表記します。

実行環境など

Ubuntu 20.04.1 LTS を使用します。
* 仮想マシンを起動する際に新しい Window が表示されるので、Desktop 環境で実行して下さい。
qemu 上で実行する FreeBSD は、12.2 RELEASE です。

パッケージのインストール

FreeBSD 上で root でログインし、以下のパッケージをインストールします。

# pkg install xorg
# pkg install xfce
# pkg install japanese/font-std
# pkg install ja-fcitx-mozc
# pkg install firefox

上から順番に
* X Window System
* Xfce4 デスクトップ環境
* 日本語フォント
* 日本語入力システム
* web browser
です。

上の例ではパッケージを一つずつ指定していますが、以下のようにまとめて指定しても構いません。

# pkg install xorg xfce japanese/font-std ja-fcitx-mozc firefox

システムの設定

Xfce4 で D-Bus を使用するので、以下の手順で D-Bus を起動します。

# sysrc dbus_enable="YES"
# service dbus start

個人環境の設定

root 権限で実行している shell を抜けてから、一般ユーザ権限でログインし直します。

# exit
logout

FreeBSD/amd64 (fbsd122) (ttyv0)

login: yamada
Password:

$ 

vi/emacs などのテキストエディタを使用して、ホームディレクトリに .xinitrc ファイルを作成し以下の設定を記述してください。
* FreeBSD では Emacs は標準ではインストールされていないので、root 権限で pkg install emacs を実行して Emacs をインストールしてください。

export LC_ALL=ja_JP.UTF-8
export LANGUAGE=ja_JP.UTF-8
export LANG=ja_JP.UTF-8
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=xim
export XMODIFIERS=@im=fcitx
/usr/local/bin/mozc start
/usr/local/bin/fcitx -r -d
exec /usr/local/bin/xfce4-session

日本語キーボードを使用している場合には、以下の行を最終行 xfce4-session の直前に入れてください。

/usr/local/bin/setxkbmap -layout jp

デスクトップ環境の起動

startx コマンドを実行し、デスクトップ環境を起動します。

$ startx

以下のように Xfce4 のデスクトップ環境が表示されれば成功です。
qemu-xfce4-start.png

左上の「アプリケーション」クリックするとメニューが表示されます。メニューの「ウェブブラウザー」をクリックすると、Firefox が起動します。
qemu-xfce4-japanese.png
日本語の入力には、Ctrl キーと SPACE キーを同時に押します。文字を入力して、SPACE キーで変換します。もう一度 Ctrl キーと SPACE キーを同時に押すと、英語の入力に戻ります。

右上の「ユーザー名」をクリックするとメニューが表示されるので、「ログアウト」をクリックするとデスクトップ環境が終了します。
qemu-xfce4-logout.png
qemu-xfce4-logout2.png

問題が発生した場合

「デスクトップ環境が表示されない」、「日本語が入力できない」といった問題が発生した場合には、ホームディレクトリ以下に作成した .xinitrc ファイルの中身を確認してください。
* 大文字・小文字を間違えていないか?
* アンダースコア (_)・ハイフン (-) などの記号を間違えていないか?
など、上記の例と食い違いがないか確認してください。

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

Linux 日本語配列のキーボードに対応させる方法

linuxで日本語キーボードに合わせるためのメモ

mainMenue -> Setting -> Keyboard -> Layout -> Keyboard layoutで
「japanese(OADG 109A)」を選択

スクリーンショット 2020-12-18 11.33.23.jpg

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

Linux + qemu で FreeBSD を動かす

はじめに

Linux + qemu 上で FreeBSD を動かす手順を説明します。

以下の各説明では実際に実行するコマンドを以下のような形で記述しています。

$ sudo apt install パッケージ名

実際には上記のコマンドを実行するとパッケージインストールの進捗状況が表示されますが、本ページではそれらの表示を省いています。

実行環境など

Ubuntu 20.04.1 LTS を使用します。
* 仮想マシンを起動する際に新しい Window が表示されるので、Desktop 環境で実行して下さい。
qemu 上で実行する FreeBSD は、12.2 RELEASE です。

パッケージのインストール

Ubuntu 上で、以下の設定を行います。
* パッケージ qemu-system-x86 をインストールする。
* /dev/kvm へのアクセス権を追加するために、qemu を使用するユーザーを kvm グループに追加する。

$ sudo apt install qemu-system-x86
$ sudo gpasswd -a $(whoami) kvm

FreeBSD のインストール

FreeBSD をインストールするために、Ubuntu 上で以下の操作を行います。
* 仮装ディスクを $HOME/VM/fbsd122 に作成
* 仮装ディスクの大きさは 16GB
* 仮想マシンに割り当てるメモリーは 1024GB
* FreeBSD のインストールメディアを取得
* FreeBSD のインストールメディアを使用して仮想マシンを起動
* FreeBSD をインストール

$ mkdir -p ~/VM/fbsd122
$ cd ~/VM/fbsd122
$ qemu-img create -f qcow2 fbsd122.qcow2 16g
$ wget https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.2/FreeBSD-12.2-RELEASE-amd64-disc1.iso

FreeBSD を FreeBSD-12.2-RELEASE-amd64-disc1.iso を起動します。

$ qemu-system-x86_64 -enable-kvm -m 1024 -boot order=d -cdrom FreeBSD-12.2-RELEASE-amd64-disc1.iso fbsd122.qcow2
  • -boot order=d で CD-ROM からの起動の指定、-cdrom で使用する ISO イメージを指定します。
  • Desktop 上に以下のような別 Window が表示され、FreeBSD のインストーラーが起動します。
    • インストール途中で操作を間違えたりした場合には、QEMU の Window のメニューから「Machine」->「Power Down」の操作を行うと仮想マシンの電源が OFF になるので、もう一度「qemu-system-x86_64」コマンドを実行してください。

qemu-freebsd-start.png
qemu-freebsd-installer.png
上記の QEMU の Window 上で FreeBSD の操作を行います。
* QEMU Window の内側をクリックすると、インストーラーに対する操作を行えます。
* QEMU Window から抜ける際には、Ctlr + Alt + G キーを押下します。

FreeBSD のインストール手順は、以下の資料を参考にしてください。
* 英語: HANDBOOK Installing FreeBSD
* 日本語: Share FreeBSD based information の「Install FreeBSD」->「インストール手順」

インストールの注意事項として、以下の二点に留意してください。
* root パスワードの設定
* 一般ユーザーの登録

root パスワードの設定

インストール中に以下の画面が表示され「root」のパスワードを入力するように指示されます。
* インストール後の操作でこのパスワードが必要になるので、忘れないようにしてください。
qemu-freebsd-install-rootPassword.png

一般ユーザーの登録

インストール中に以下の画面が表示され、一般ユーザーの登録を促されます。
* ここで一般ユーザーを登録し、通常 FreeBSD を使用する際にはこのユーザーでログインして下さい。
* 「Login group is USERNAME. Invite yamada into other groups? []: 」に対して、「wheel」を入力してください (下記二枚目)。
qemu-freebsd-install-adduser.png
qemu-freebsd-install-adduser-wheel.png

インストール終了時の操作

インストールが終了したら「Complete」というダイアログが表示されるので、TAB キーを押して「Live CD」を選択して Enter キーを押してください。
qemu-freebsd-complete.png
「login:」と表示されるので、「root」と入力して Enter キーを押してください。
* ここでは password の入力は不要です。
qemu-freebsd-login-root.png
「poweroff」と入力して Enter キーを押してください。
qemu-freebsd-poweroff.png
poweroff が完了すると、QEMU の Window が消えます。

HDDからの起動

インストール時の「-boot」と「-cdrom」を削除して実行すると、HDD から FreeBSD が起動されます。

$ qemu-system-x86_64 -enable-kvm -m 1024 fbsd122.qcow2

qemu-hdd-login.png
「login: 」に対して、「root」と入力し Enter キーを押します。
qemu-hdd-password.png
「Password: 」に対して、FreeBSD のインストール時に設定した「root」のパスワードを入力して Enter キーを押してください。
* この時入力したパスワードは、画面に表示されません。
qemu-hdd-root.png
ログインが成功すると、root のプロンプト「root@ホスト名:~ # 」が表示されます。

FreeBSDのシャットダウン

rootでログインし、「shutdown -p now」と入力して Enter キーを押し、FreeBSD をシャットダウンします。
qemu-hdd-shutdown.png
シャットダウンが完了すると、QEMU の Window が消えます。

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

nlコマンドで素数を求める

今回はあまり「行番号」にこだわらずnlコマンドを使ってみましょう。

nlコマンドで整数を生成する

つまりseqコマンドの代替です。yesと組み合わせることで無限数列を生成できます。初期値は-v、増加値は-i、終了値はheadを組み合わせるとそれぞれ変更可能です。終了値は数列の個数で指定することになるので、seqよりも直感的に利用できる場面もあるかもしれません。

coreutils
$ seq 0 2 10
0
2
4
6
8
10
$ yes '' | nl -b a -s '' -w 1 -v 0 -i 2 | head -n 6 
0
2
4
6
8
10

これでほぼ等価になります。余計なスペースやタブを入れないように様々なオプションをつけていますが、必須なのは-b aのみです。BSD系のnlでは-wを必要な値の大きさに合わせて設定する必要があります。上記の場合でも-wを指定すると10が正しく表示されないので、余計なスペースが入ってしまいますが次のようにすべきです。除去が必要ならsedなどで加工しましょう。

BSD
$ yes '' | nl -b a -s '' -w 1 -v 0 -i 2 | head -n 6
0
2
4
6
8
0
$ yes '' | nl -n ln -b a -s '' -w 10 -v 0 -i 2 | head -n 6
0         
2         
4         
6         
8         
10        
$ yes '' | nl -n ln -b a -s '' -w 10 -v 0 -i 2 | head -n 6 | xxd
00000000: 3020 2020 2020 2020 2020 0a32 2020 2020  0         .2    
00000010: 2020 2020 200a 3420 2020 2020 2020 2020       .4         
00000020: 0a36 2020 2020 2020 2020 200a 3820 2020  .6         .8   
00000030: 2020 2020 2020 0a31 3020 2020 2020 2020        .10       
00000040: 200a                                      .

ちなみにGNU coreutilsのseqinfというキーワードを指定すれば、無限数列が生成できます。昔は終了値を設定しなければならないseqでは無限数列が生成できないと思っていたので、「それnlならできるよ」とかドヤ顔で言ってた時代もありました。

coreutils
$ seq inf | head -n 1000 | tail 
991
992
993
994
995
996
997
998
999
1000

ちなみにinfについてはManpageにもTexinfoにも書かれていないようです。こういう謎の機能に気づくみなさんは日常的にソースとか読んでるのかな?

素因数分解して素数を得る

nlの本題からはズレますが、factorコマンドを利用することで簡単に素因数分解した結果を得ることができます。区切られた数列データがれば、素因数分解した結果を得ることができます。

$ seq 5
1
2
3
4
5
$ seq 5 | factor
1:
2: 2
3: 3
4: 2 2
5: 5
$ echo {1..5}
1 2 3 4 5
$ echo {1..5} | factor
1:
2: 2
3: 3
4: 2 2
5: 5

この通りfactorは縦でも横でもいい感じに素因数分解してくれます。ここから素数だけを抽出しましょう。素数とは「1と自分自身以外に正の約数を持たない自然数」のことで、一般には含みません。2: 2のように、2つの列からなる行だけを対象に数値を抜き出せば良さそうです。awkでフィルタしてみましょう。

$ seq 5 | factor | awk 'NF==2&&$0=$2'
2
3
5

素数だけをフィルタすることができました。awkのスクリプトの内容ですが、フィールド数(列数NF)が2なら、行全体($0)に2列目($2)を代入という意味です。上記はアクションレス記法で書いていますが、以下と同じです。

$ seq 5 | factor | awk 'NF==2{print $2}'
2
3
5

日付のリストを作る

これはdateコマンドを使うのが間違いないと思います。以下のようにフォーマットを指定して、X日からN日後という日付を出力することができます。

$ date -d '20201201 +0days' +'%Y%m%d'
20201201
$ date -d '20201201 +30days' +'%Y%m%d'
20201231

つまり2020年12月の日付をすべて得るには、20201201を0日目として、30日後までを出力します。このdatexargsを使って、nlで生成した数列を差し込んで実行すれば良さそうです。-Iで指定した@の部分に入力データが挿入されます。

$ yes '' | nl -b a -v 0 | head -n 31 | xargs -I @ date -d '20201201 +@days' +'%Y%m%d'
20201201
20201202
20201203
(略)
20201231
20201231

しかし、あらかじめ月をまたがないことがわかっていれば、以下のようにsedで頭に年月を付加してもいいですね。

$ yes '' | nl -n rz -b a -w 2 | head -n 31 | sed 's/^/202012/'
20201201    
20201202    
(略)

あまり深堀っていくと、nlを使わずに・・・という話になってくるのでこの辺にしておきます。

$ echo 202012{01..31} 
20201201 20201202 (略)

素数日のリストを作る

では、つなげて実行してみましょう。

$ yes '' | nl -b a -v 0 | head -n 31 | xargs -I @ date -d '20201201 +@days' +'%Y%m%d' | factor | awk 'NF==2&&$0=$2'
20201227
20201231

今年の12月の素数日は12/27と12/31ということがわかりました。


seq infのTexinfo反映

(12/19追記)
seq infについてはTexinfoに使用法を記載してもらうことになりました。ちなみにsleep infもあるらしく、そちらも同時に反映されたようです。

余談

本当は素数日の記事として書こうかなとぼんやり考えていたのですが、残念ながら2020年のAdvent Calendarには素数日がありませんでした。しかし、なんと次回のシェル芸勉強会は12/27開催なので素数日です!

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

[メモ] Raspbery Pi OS 64bit イメージ作成 (2020年冬版)

概要

  • Raspberry Pi OSの2020年12月2日(Release date: December 2nd 2020)から、64bitベータ版がオモテから消えましたよね?
  • Raspberry Pi OSイメージ作成スクリプトのpi-genのarm64というブランチで、raspiosの64bitを作成しよう。
  • 現在、Troubleshootingのところで、下のようにあるので、x86_64ではうまく動かないっぽい?

    Please note there is currently an issue when compiling with a 64 Bit O

  • 以前のメモ: [メモ] Raspbian: 最新イメージ作成

  • 結果

    • ラズパイ4BとSSDで、Liteと通常Desktopのイメージが30分程度(APTキャッシュサーバ使用で、初回ではないので、外部からのダウンロード時間は含まれてない、と思う)

環境

手順(概要)

  1. ビルド環境準備
    1. OS (Ubuntu arm64 か、Raspberry Pi OS 64bitベータ版)
    2. dockerインストール
    3. apt-cacher-ng : APTのキャッシュサーバ
  2. RPi-Distro/pi-gen
    1. config ファイル作成
    2. スクリプトをちょいと変更
    3. スクリプト実行

手順(詳細)

注意点

  • build-docker.sh でビルド時、deployフォルダが存在してると、生成物がうまくコピーされないので、削除しておく

ビルド環境準備

  1. ベースOSを焼く
    1. imgファイルを入手
    2. Raspberry Pi Imagerで、
      • CHOOSE OS => Use custom にて、イメージファイルを指定。(zipのままいける。)
  2. dockerインストール

    # Docker
    # https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    sudo usermod -aG docker ${USER}
    
    # docker-compose
    sudo apt update
    sudo apt install -y python3-pip libffi-dev
    sudo pip3 install docker-compose
    
  3. apt-cacher-ng : APTのキャッシュサーバ

pi-gen: イメージ作成

  • キホン (実際には、echo "IMG_NAME='raspios64'" > configの代わりに、configをうまく編集・設定してから、やる)

    # レポジトリをクローン、ついでに、arm64ブランチをCheckout
    git clone https://github.com/RPi-Distro/pi-gen.git -b arm64
    
    cd pi-gen
    git reset --hard # リセット
    git clean -fdx   # クリーン
    
    # config 作成 (必要最小限)
    echo "IMG_NAME='raspios64'" > config
    
    # スクリプト変更 i386のイメージを持ってきてしまうのをなおす
    sed -i -e 's@i386/@@g' build-docker.sh
    
    # ビルドスクリプト実行
    time bash ./build-docker.sh 2>&1 | tee ../build.log
    
    # deployフォルダの中に、zipファイルがある、はず
    
  • config を設定する
    configファイルを編集することで、初期設定ができる。(時間帯、言語、キーボードとか、ラズパイの公式イメージは、英国がデフォルト。)

    • IMG_NAME(必須): 生成物のファイル名に使用される
    • APT_PROXY: aptキャッシュサーバ指定
    • DEPLOY_ZIP: 1:ZIPで出力(既定値) / 0:imgで出力
    • LOCALE_DEFAULT: 言語(既定値:en_GB.UTF-8)
    • KEYBOARD_KEYMAP: キーマップ(既定値:gb)
    • KEYBOARD_LAYOUT: キーレイアウト(既定値:English (UK))
    • TIMEZONE_DEFAULT: タイムゾーン (既定値:Europe/London)
    • FIRST_USER_NAME: ユーザ(既定値:pi)
    • FIRST_USER_PASS: ユーザパスワード(既定値:raspberry)
    • WPA_ESSID WPA_PASSWORD WPA_COUNTRY: Wifi設定
    • ENABLE_SSH: SSH 1:有効 / 0:無効(既定値)
    config例
    IMG_NAME=orenoraspios64
    APT_PROXY=http://172.17.0.1:3142
    DEPLOY_ZIP=0
    LOCALE_DEFAULT=en_US.UTF-8
    KEYBOARD_KEYMAP=us
    KEYBOARD_LAYOUT="English (US)"
    TIMEZONE_DEFAULT="America/Los_Angeles"
    ENABLE_SSH=1
    FIRST_USER_NAME=`ore`
    FIRST_USER_PASS=`orenopasuwa-do`
    WPA_ESSID=wifi-ssid
    WPA_PASSWORD=wifi-no-password
    WPA_COUNTRY=US
    ENABLE_SSH=1
    

Liteイメージだけ作りたい。

  • build-docker.shを実行する前に、↓をする
touch ./stage3/SKIP ./stage4/SKIP ./stage5/SKIP
rm -rfv ./stage3/EXPORT* ./stage4/EXPORT* ./stage5/EXPORT*
  • 説明
    • 下の、機械翻訳したところみると、stageX(X=0,1,2,3,4,5)フォルダごとにすすむ。
    • stage2で、Lite、stage4で、通常デスクトップ版、stage5がFullといってるイメージ
    • stage*/のフォルダ内に、SKIPというファイルがあると、処理されずに次のステージにいく。
    • EXPORT_IMAGEという設定ファイルがあると、そこでの結果をimgに出力する

パッケージを追加したい

  • うまい段階のstageX/00-install-packages/ フォルダの中の、00-packages または、00-packages-NR に、記述する。
  • `-NRのほうは、--no-install-recommendsオプション付きとのこと。
    • stage4/00-install-packages/00-packageに、fcitx-mozcとか、追加してみてはどうだろうか?

その他

  • deployフォルダの削除は忘れずに



メモ)2020-12-16 (一部)日本語訳 ~ www.DeepL.com/Translator(無料版)で翻訳

  • image画像と訳されてたところを、イメージに変更

How the build process works (ビルドプロセスの仕組み)

以下のような手順でイメージを構築していきます。

  • すべてのステージディレクトリを英数字順にループします。

  • このステージディレクトリに "SKIP"というファイルが含まれている場合は、次のディレクトリに移動します。

  • prerun.sh スクリプトの実行。これは通常、ステージ間でビルドディレクトリをコピーするために使用されます。

  • 各ステージのディレクトリでは、各サブディレクトリをループして、それに含まれるインストールスクリプトをそれぞれ実行してください。これらのスクリプトには、先頭に 2 桁の数字を入れて名前を付ける必要があります。いくつかの異なるファイルやディレクトリがあり、ビルドプロセスの異なる部分を制御するために使用できます。

    • 00-run.sh - unix シェルスクリプト。実行可能にする必要があります。
    • 00-run-chroot.sh - イメージのビルドディレクトリの chroot で実行される unix シェルスクリプト。実行するためには実行可能にする必要があります。
    • 00-debconf - このファイルの内容は、ロケールなどを設定するために debconf-set-selections に渡されます。
    • 00-packages - インストールするパッケージのリスト。1 行に複数個、スペースで区切って書くことができます。
    • 00-packages-NR - 00-packages と同じですが、apt-get の --no-install-recommends -y パラメータを使ってインストールされます。
    • 00-patches - quilt を使って適用されるパッチファイルを含むディレクトリ。もし 'EDIT' という名前のファイルがディレクトリ内にある場合、ビルドプロセスは bash セッションで中断され、パッチを作成/修正できるようになります
  • ステージディレクトリに "EXPORT_NOOBS"または "EXPORT_IMAGE"というファイルがある場合、このステージをイメージのリストに追加して生成します。

  • 指定したステージのイメージを生成する

詳細については、build.shを調べてみることをお勧めします。


Stage Anatomy (ステージの詳細)

Raspbian Stage Overview(概要)

Raspbian のビルドは論理的にわかりやすく、モジュール化するためにいくつかの段階に分けられています。これは初期の複雑さの原因となりますが、メンテナンスを簡素化し、より簡単なカスタマイズを可能にしています。

  • Stage 0 - bootstrap

    このステージの主な目的は、使用可能なファイルシステムを作成することです。これは主に debootstrap を使用することで達成されます。これは Debian システム上で base.tgz として使用するのに適した最小限のファイルシステムを作成します。この段階では、apt の設定も行い、debootstrap が見逃した raspberrypi-bootloader をインストールします。ミニマルコアはインストールされていますが、設定はされていません。

  • Stage 1 - truly minimal system (真のミニマムシステム)

    このステージでは、/etc/fstab のようなシステムファイルをインストールしてシステムを起動可能にし、ブートローダを設定し、ネットワークを操作可能にし、raspi-config のようなパッケージをインストールします。この段階では、システムはローカルコンソールに起動し、そこからシステムの設定やインストールに必要な基本的なタスクを実行する手段を持っています。これは、システムができる限り最低限のものであり、伝統的な意味では、おそらくまだ実際には使えないでしょう。それでも、最低限のことをしたいのであれば、これは最低限のことであり、残りの部分はシステム管理者として自分で合理的に行うことができます。

  • Stage 2 - lite system

    このステージでは Raspbian-Lite イメージを生成します。最適化されたメモリ機能のインストール、timezone と charmap のデフォルト設定、fake-hwclock と ntp のインストール、無線 LAN と bluetooth のサポート、dphys-swapfile、その他ハードウェア管理のための基本的な機能のインストールを行います。また、必要なグループを作成し、πユーザに sudo と標準コンソールのハードウェア権限グループへのアクセス権を与えます。

    基本的なPythonやLuaパッケージ、build-essentialパッケージなど、ミニマムなシステムでの開発にはあまり意味のないツールがいくつかあります。pi-gen と一緒である必要はありませんが、これらはより重要なパッケージと一緒にまとめられています。これらは Raspbian のターゲット層にとっては理解できるものですが、もし本当にミニマルなものと Raspbian-Lite の中間のものを探していたならば、ここからトリミングを始めることになります。

  • Stage 3 - desktop system

    ここでは、X11とLXDE、Webブラウザ、開発用のgit、RaspbianのカスタムUIの強化など、完全なデスクトップシステムを手に入れることができます。これは基本的なデスクトップシステムで、いくつかの開発ツールがインストールされています。

  • Stage 4 - Normal Raspbian image

    4GB のカードに収まるように設計されています。これはシステムドキュメントのように、Raspbian を新しいユーザに優しいものにするためのほとんどのものをインストールする段階です。

  • Stage 5 - The Raspbian Full image

    Raspbianのフルイメージ。より多くの開発ツール、メールクライアント、Scratchのような学習ツール、sonic-piのような専門的なパッケージ、オフィスの生産性など。

Stage specification (仕様)

指定したステージまでビルドしたい場合(ライトシステムの場合はステージ2までビルドするなど)、インクルードしないようにしたい./stageディレクトリにSKIPという名前の空のファイルをそれぞれ配置します。

そして、SKIP_IMAGES という空のファイルを ./stage4 と ./stage5 (ステージ2までビルドする場合)、または ./stage2 (ミニマムシステムをビルドする場合) に追加します。

# Example for building a lite system ライトシステムの構築例
echo "IMG_NAME='Raspbian'" > config
touch ./stage3/SKIP ./stage4/SKIP ./stage5/SKIP
touch ./stage4/SKIP_IMAGES ./stage5/SKIP_IMAGES
sudo ./build.sh  # or ./build-docker.sh

lite システムの上に (例えば) 更なる設定を構築したい場合は、./stage3./stage4 の内容を削除して、同じフォーマットで独自の内容に置き換えることもできます

Skipping stages to speed up development (ステージをスキップして開発を加速させる)

特定のステージでの作業であれば、推奨される開発プロセスは以下のようになります。

  • EXPORT_*ファイルを含むディレクトリにSKIP_IMAGESというファイルを追加します(現在はstage2、stage4、stage5)
  • ビルドしたくないステージにSKIPファイルを追加します。例えば、ライトイメージをベースにしている場合、ステージ3、4、5に追加します。
  • build.sh を実行してすべてのステージをビルドします。
  • ビルドに成功した初期のステージにSKIPファイルを追加します。
  • ラストステージの修正
  • sudo CLEAN=1 ./build.sh を使って、最後のステージだけを再構築します。
  • イメージに満足したら、SKIP_IMAGES ファイルを削除して、テスト用にイメージをエクスポートします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

2−1.WEB系エンジニアになるためのインプット(Linux基礎)

はじめに

こちらの記事の続きとなる。
1−1.WEB系エンジニアになるためのインプット(準備)
Linux基礎を作るためにインプットとそのアウトプットの記事となります。
また、内容が多いため記事を分けて掲載する。

先の記事でも記載しておりますが、教材と環境は下記の通りです。
・教材はUdemy for businessを活用する。
 【5日でできる】はじめての Linux 入門(LPIC Level1対応)
 (講師:井上 博樹 (Hiroki Inoue))
・Linux環境(Ubuntu)はAWSのEC2インスタンスを活用する。
 -リージョン:アジアパシフィック (東京)ap-northeast-1
 -AMI:Ubuntu Server 20.04 LTS (HVM), SSD Volume Type
 -インスタンスタイプ:t2.micro

Linuxのコマンド(UNIX)

Linuxを操作するためのコマンドを記述していく。
ただし、自身が既に扱える箇所は省かせていただきます。

相対パスと絶対パス

絶対パス

ルートディレクトリからのパスを全て入力。

/usr/local/bin/***

相対パス

カレントディレクトリからの相対的な位置関係を指定。

現在の位置
./

また、/usr/local/binから/usr/local/を指定したいときは下記を使う。

1つ上の階層
../

シェルの操作

シェルの種類

  • bash
  • csh
  • tcsh

標準はbash(bourne again shell)となる。

コマンドの履歴

historyコマンドを使う。

コマンドの履歴
history

また、過去のコマンドには番号が振られており、番号を使って再利用できる。
これにより、タイプミスを防ぐことができる。
例えば、[117 pwd]という履歴があった場合の再利用コマンドは下記

コマンドの再利用
!117

コマンドラインの先頭と末尾

コマンドラインに入力した文字が長い時、矢印キーで横に進むのはめんどくさい!そこで一発で移動する方法があります。

先頭に移動
Ctr + a
末尾に移動
Ctr + e

シェル変数

コマンドライン上で変数を作って確認する

変数の作成
INFILE="infile.txt"

下記コマンドで[infile.txt]と表示され、確認できる。

変数の確認(1)
echo $INFILE
もしくは
echo "$INFILE"

下記コマンドの場合は[$INFILE]と表示される。

変数の確認(2)
echo '$INFILE'

下記コマンドで変数のリセットができる。変数の確認(1)で、リセットされていることが確認できる。(空白が表示)

変数のリセット
unset INFILE

環境変数

envコマンドで環境変数の設定を確認できる.

環境変数の確認
env | more
※moreでスクロールで中身を確認できる

環境変数を追加したいときは下記コマンド

環境変数の追加
export INFILE

viエディタ

テキストエディタの使い方を記載する。
例えば、result.txtをテキストエディタで開く場合は下記コマンド。
また、このファイルが存在しない場合は新規作成も同時に行われる。

テキストエディタ
vi result.txt

操作方法が複雑のため、下記表にまとめた。

カテゴリ コマンド 内容
終了キー :q セーブしないで終了
:q! 変更した行もセーブせずに終了
:w セーブするが終了しない
:wq セーブして終了
編集モードへ移るキー i 現在のカーソル位置から挿入
R 現在のカーソル位置から置換
A 現在行の末尾に追加
O 現在行の前に行挿入
o 現在行の次に行挿入
カーソル移動キー h(←)
j(↓)
k(↑)
l(→)
0 行頭へ
$ 行末へ
[Enter] 次の行の先頭へ
w 次の単語へ
b 前の単語へ
ctrl + f 次画面へ
ctrl + b 前画面へ
1G 文頭へ
G 文末へ
nnG nn行目へ
変更キー x 1文字削除
dd 1行削除(カット)
cw 1語変更
c$ カーソル位置から行末まで変更
dw 1語削除
d$ カーソル位置から行末まで削除
検索 /正規表現 前方検索
?正規表現 後方検索
n 次の候補
N 前の候補
置き換え :1,$s/正規表現/置き換え文字列/g 文書内の全ての「正規表現」を「置き換え文字列」に置換
ショートカット yy 1行コピー
dd 1行カット
p ペースト(張り付け)

ファイルの操作

lsのオプション

隠しファイルも含めて表示
ls -a
ファイルの詳細
ls -l
隠しファイルも含めて、ファイルの詳細(組み合わせ)
ls -la
iノード番号も表示
ls -i

ファイルの属性を確認

属性を確認
file text.txt

ファイルのコピー(ddコマンド)

[if=]はコピー元ファイル名、[of=]はコピー先ファイル名、[bs]はコピーするブロックサイズ(バイト)、[count]はコピーするブロックの数

ファイルのコピー(dd)
dd if=/dev/zero of=zero.dat bs=512 count=1024

ファイルのコピー(cpコマンド)

コピー元をhello.txt、コピー先をhello1.txtとすると下記
コピー元のhello.txtは残ったままとなる。

ファイルのコピー(cp)
cp hello.txt hello1.txt

ファイルの削除

ファイルの削除
rm hello2.txt

ファイルの移動

移動するファイルをhello2.txt、移動先をsourcecodeとする。
元のhello2.txtは移動して、元のディレクトリからは無くなる。

ファイルの移動
mv hello2.txt sourcecode/

ディレクトリの削除

そのままではその中にディレクトリが格納されていると削除できないので、オプションをつけて強制的に削除する

ディレクトリの強制削除
rm -fR sourcecode

ファイルの検索

ディレクトリにあるファイルを検索することができる.
例えば、今いるディレクトリに[networks]と付くファイル名を一覧で表示するためのコマンドは下記となる。
また、sudoをつけることで許可がないファイルに対する検索エラーを回避することができる。

名前指定のファイル検索
sudo find . -name networks

圧縮とアーカイブ

圧縮・展開方法にはいくつか種類がある

  • tar
  • gzip(=gunzip) tarと併せて使う
  • bzip2 tarと併せて使う
  • xz
  • cpio バックアップ装置と一緒に使う

tarコマンド

tarコマンドが主流のため、こちらを学ぶ

オプション

オプション 内容
f ファイル名
c 作成
x 展開
r 末尾に追加
v 詳細を表示
j bzip2ファイルを扱う
z gzipファイルを扱う

圧縮

tarを使って、work2というディレクトリを圧縮し、work2.tar.gzというファイルを作成するコマンドは下記となる。
また、zオプションによりgzipも併せて使って圧縮する。
なお、tarコマンドで圧縮した元のファイルやディレクトリは残る。
tarコマンド単体で展開したときは圧縮ファイルは残る。

圧縮
tar czf work2.tar.gz work2

展開

圧縮して作成されたファイルを展開するコマンドは下記となる。

展開
tar xvzf work2.tar.gz

gzip単体の場合

tarコマンドと併せないで、単体でgzipを使える。
text.txtをgzipで圧縮すると、text.txt.gzファイルが生成される。

gzip単体で圧縮
gzip text.txt
gzip単体で展開
gzip -vd text.txt.gz
※vは詳細を表示

gzipコマンド単体で展開したときは圧縮ファイルは消える。

bzip2コマンドの場合

使い方はgzipコマンド単体と同じとなる。圧縮されて生成されるファイルはtest3.txt.bz2となる。

xzコマンドの場合

使い方はgzipコマンド単体と同じとなる。圧縮されて生成されるファイルはtest3.txt.xzとなる。

cpioコマンドの場合

CPIOlコマンドには3つのモードがある。

  • コピーアウトモード
  • インサートモード
  • コピーパスモード

ファイル名一覧が格納されたfilelist.txtとしたとき、アーカイブファイルを作成するには下記コマンドとなる。

cpioコマンドでの圧縮
cpio -o < filelist.txt > files.cpio
もしくは
ls | cpio -o > files.cpio
cpioコマンドでの展開
cpio -i < files.cpio

また、コピーパスモードによりファイルの移動もできる。
例えば、copytoというディレクトリに移動するコマンドが下記となる。

cpioコマンドのコピーパスモード
cpio -pd copyto < filelist.txt

リンク

ファイルに別の名前でアクセスする仕組み

  • ハードリンク:同じiノードに異なる名前
  • シンボリックリンク:iノード番号を持たない。別名のみ管理

ファイルシステムとは「ファイルを管理するし仕組み」(VFS)であり、各デバイスとはiノードを使って関連つけている。

ハードリンク

ハードリンクを作成するのはlnコマンドを使う。この2つを比較すると、それぞれは同じiノードを持っていることが確認できる。片方を削除してももう片方は参照できる。

ハードリンクの作成
ln test.txt sample.txt
iノードの確認
ls -li

シンボリックリンク

ハードリンクを作成するのはlnコマンドを使う。この2つを比較すると、異なるiノードを持っており、sample.txtがtest.txtに紐づいていることが確認できる。元のファイルを削除するともう片方は参照できなくなる。

シンボリックリンクの作成
ln -s test.txt sample.txt
iノードの確認
ls -li

ストリーム&パイプ&リダイレクト

標準入出力

入出力 役割
標準入力(stdin[0]) 入力チャネル
標準出力(stdout[1]) 出力チャネル
標準エラー(stderr[2]) エラーを出力するチャネル

リダイレクト

リダイレクト 動作
cmd > file 出力をリダイレクト
cmd >> file 出力をファイルにアペンド(追加)
cmd < file 入力のリダイレクト
cmd << xxx 入力終端文字列の指定(EOFなど)
cmd 2> file エラー出力をファイルに
cmd file 2>&1 標準出力とエラー出力をファイルに

パイプ

リダイレクト 動作
cmd1 | cmd2 cmd1の標準出力をcmd2の標準入力に渡す
cmd1 2>&1 | cmd2 cmd1の標準出力とエラー出力をcmd2の標準入力に渡す
cmd1 | tee file | cmd2 cmd1の標準出力をfileに書き込み、cmd2の標準入力に渡す

テキストストリームとフィルタ

cutコマンドを利用する

cutコマンド
cut [オプション] ファイル名
オプション 機能
-d: 区切り文字の指定。左の場合は「:」
-f*,* 処理対象の番号指定

例えば、[root: x:0:0:root:/root:/bin/bash]からユーザ名とホームディレクトリを取り出すコマンドは下記となる。

cutコマンド
cut -d: -f1,6 passwd

正規表現と検索

正規表現とは文字列集合をパターン化すること

  • メタキャラクター:なんらかの文字を表すための文字
  • リテラル:文字そのもの

メタキャラクタ

表現 機能
^word 行の先頭が一致
$word 行の末尾が一致
. 任意の一文字
* 直前の文字の繰り返し
? 直前の文字の0個または1個に一致
+ 直前の文字の1回以上の繰り返し
[] []うちのいずれか一文字にマッチ
¥< word ¥> 単語にマッチする文字列
¥{n,m¥} n回以上、m回以下の繰り返し
| 複数条件を指定
¥ 次の文字をメタキャラクタではなくリテラルに

文字クラス

表現 機能
[:alnum:] アルファベットと数字
[:alpha:] アルファベット
[:digit:] 数字
[:lower:] 小文字
[:upper:] 大文字
[:space:] スペース

リテラル

文字そのもの。メタキャラクタと組み合わせて使う。
例えば、xyz[1-4]としたとき、xyz1,xyz2,xyz3,xyz4のいずれか

正規表現を使う

正規表現
grep [オプション] 'パターン (正規表現) 'ファイル名
もしくは
egrep [オプション] 'パターン (正規表現) 'ファイル名
もしくは
fgrep [オプション] 文字列 ファイル名
オプション 機能
-c 一致した行だけ表示
-i 大文字・小文字を区別しない
-n 先頭に行番号をつけて一致行を表示
-v パターンに一致しない行を表示
-E egrepと同じ
-F fgrepと同じ

sedによる置換

置換
sed 's/[パターン]/置換文字' ファイル名

プロセスの操作と制御

ジョブは[ls -l | more]で、プロセスは[ls -l][more]となる。
プロセス番号(PID)が自動的に割り当てられ、psコマンドで確認できる。
また、topコマンドでリソース消費量などを確認できる。

さいごに

linux基礎として、コマンドの基本を学んだ。
次回は管理業務・ファイルシステム管理を学ぶ

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