- 投稿日:2020-02-28T23:00:19+09:00
サーバが何もしてないのに調子が悪くなった時に確認するコマンド
何もしてないのサーバの調子が悪くなったと言いたいくらい心あたりがない時に、確認するコマンド
ディスク容量確認
ディスク使用量がMaxかそれに近いとファイル作成などのコマンドが失敗する。
df -h
でディスク使用量が確認できる。$ df -h Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s6 233Gi 10Gi 139Gi 7% 484247 2447617073 0% / /dev/disk1s1 233Gi 79Gi 139Gi 37% 1215180 2446886140 0% /System/Volumes/DataAvailが100%に近いものがあったら
Mounted on
に書いてる配下のファイルでサイズが大きいものを削除した方が良い。
Mounted on
の中の具体的にどこが容量を圧迫してるか?は、du -sh
で確認。
/
配下を見たい場合はdu -sh /*
で/配下のディレクトリ毎にいくら使用されているか確認できる。
権限次第では一部見れなかったりするのでsudoを使ってroot権限で実施するのがおすすめ。$ du -sh ./* 26M ./Desktop 1.5M ./Documents 1.4G ./Downloads
/*
で実施したらレスが遅かったので、例では./*
で実施してます。CPU使用率、負荷の確認
負荷の大きいプロセスがあれば
CPU usage
かLoad Avg
などが高くなってるはず。
確認はtop
コマンドを使用。もし負荷が高ければps
コマンドでプロセスを確認してみる。負荷の高いプロセスが特定出来たらkill
コマンドでプロセスを殺すか、systemctlコマンドなどで、対象のサービスを再起動してみる。終わりに
上記2点で大体何かしらわかるので、全く検討がつかない時はとりあえず試してみると良いかもしれないです。
もしそれでもわからなけれればログを確認したり、エラーから読み取りましょう。悪いこと何もしてないなら、上記のコマンドだけでも何かしらわかるはず。。
- 投稿日:2020-02-28T22:12:45+09:00
LVMで論理ボリュームのサイズを拡張してみた
つい先日うちの部で管理しているデータベースサーバの容量が100%になってお亡くなりになられたので、新しくディスクを追加してLVMで論理ボリュームのサイズを拡張して復旧、ということをやりました。
ですが、この作業、知らない単語や知識が多すぎて全然やっていることの意味がわかっていませんでした。そこで何をやっているかちゃんと理解しておくためにも復習したので忘れないためにもまとめておく。そもそもLVMって何ぞ?
複数のハードディスクやパーティションにまたがった記憶領域を一つのボリュームグループにまとめ、単一の論理ボリューム(LV)として扱うことのできるディスク管理機能
とのことでした。これ使うと後から論理ボリュームが拡張出来て便利とかなんとか。
LVMって調べたらさらに知らない単語が出てきたのでメモ。・物理ボリューム: ハードディスクやパーティションそのものを指す
・ボリュームグループ: 1個以上の物理ボリュームをまとめたもの
・論理ボリューム: ボリュームグループから切り出したボリューム新しいディスクにパーティションを作成
追加したディスク名は/dev/sdcです。
まず以下のコマンドでfdiskを対話モードで起動させる$ fdisk /dev/sdc
すると対話モードが起動するので以下の手順でパーティションを作成
Command (m for help): n #nでパーティションの新規作成、いろいろ選択肢が出てくるがすべてデフォルトで Command (m for help): t #tでパーティションタイプを変更。パーティションタイプ=そのパーティションを利用しているファイルシステムの種類 Partition number: 1 Hex code (type L to list codes) : 8e #8eはLinux LVMのパーティション番号 Command (m for help): p #パーティションテーブルを表示して、パーティション/dev/sdc1が作成されていることを確認 Command (m for help): w #パーティションテーブルの変更を保存して終了ディスクに物理ボリュームを作成
先ほどパーティション/dev/sdc1を作成したので、これをLVMで管理するために物理ボリュームを作成
$ pvcreate /dev/sdc1 #物理ボリューム作成 $ pvscan #/dev/sdc1が物理ボリュームとして表示されていることを確認ボリュームグループに物理ボリュームを登録
次に先ほど物理ボリュームを作成しましたが、まだどのボリュームグループにも割り当てられていません。
ということで既存のボリュームグループに登録してやりましょう。$ vgextend centos /dev/sdc1 #ボリュームグループcentosに物理ボリューム/dev/sdc1を登録 $ pvscan #/dev/sdc1がボリュームグループcentosに属しているか確認ボリュームグループから論理ボリュームを作成
ボリュームグループの拡張した部分を全て論理ボリュームに割り当てる。
$ lvextend -l +100%FREE /dev/centos/rootこれで終わりと思ったらファイルシステムを拡張しないと、ファイルシステムが論理ボリュームの拡張した部分を使えるようにならないらしいので拡張する。そうすると論理ボリュームのサイズが拡張しているはずなので、対象の論理ボリュームが拡張しているかlvscanで確認
$ xfs_growfs /dev/centos/root #ファイルシステムを拡張 $ lvscan #論理ボリュームの一覧を表示。最後に
この一連の流れ、最初はわかったようでわかってない微妙な理解度だったんだけど以下のサイトのこの画像見たら納得しました。
https://www.atmarkit.co.jp/ait/articles/0302/08/news002_2.html
- 投稿日:2020-02-28T22:04:59+09:00
SereneLinuxでフォントサイズを変更する
- 投稿日:2020-02-28T19:04:32+09:00
LXC上の仮想マシンがIPv4アドレスを取得できない問題
LXC(Linux Containers)という技術があります。Linux上でアプリケーションレベルの仮想化環境を提供するものですが、最近そのマシン上でうまくIPv4アドレスが取得できない問題が発生しました。本記事では、その原因および対処について紹介します。注)記事中LXCとLXDを混同して使っています。
TL; DR
仮想マシン上で、
systemctl edit systemd-networkd.service
を実行して、起動したエディタに[Service] BindReadOnlyPaths=/sysを入力して保存する。
続いてsystemctl restart systemd-networkd.service
を実行してサービスを再起動する。問題の識別
この問題は、主に以下の条件を満たす環境で発生することがわかっています。
- DHCPクライアントにsystemd-networkdを採用している
- systemdのバージョンが244.1以上である
現在、この環境を満たすのは、ArchLinux、Fedora など先端を行くディストリビューションに限られますが、ディストリビューションに依存する問題ではないため、今後問題の影響を受けるシステムは拡大しそうです。
原因
LXC側では問題の原因を把握しており、現在対処中です。
https://discuss.linuxcontainers.org/t/no-ipv4-on-arch-linux-containers/6395/23
によると、このリグレッションはsystemd-224.1のバグ修正によるもので、/sysディレクトリがコンテナ内でリードオンリーになっていないことに起因するそうです。コンテナ内ではudevやネットワーク操作など様々な理由から/sysへの書き込み権限が必須ですが、systemd側はこの問題に対するLXC側の修正提案を拒否したようです。
そのため、対処は可能ですが、LXC側の軽微な修正では済まなくなり、カーネルレベルまでエスカレーションしての修正になるそうです。
いずれは修正されますが、パッチの適用された新しいカーネルが提供されるまで、この問題に暫定的に対処する必要があります。
対処
ユーザー側でできる暫定的対処策としては以下が提案されています。
- コンテナで/sysをリードオンリーでマウント
- systemd-networkdユニットファイルをオーバーライドして/sysをリードオンリーでマウントする(冒頭の方法)
現在、LXCではディストリビューションイメージにsystemd-networkdオーバーライドファイルを含めて配信することを検討しているそうです。
以上、取り急ぎですが参考になれば幸いです。
- 投稿日:2020-02-28T16:27:08+09:00
Opencv install奮闘記
- 投稿日:2020-02-28T15:15:06+09:00
SONiCでip vrfを使いたい
SONiCでVRFを使うの続きです。
ip vrf
が使えないSONiCは、Debian/GNU Linuxをベースにしたホワイトボックススイッチ用のOSです。現在はDebian 9.0(stretch)ベースとなっています。カーネルバージョンは4.9.189-3+deb9u2とのことです。
SONiCはホワイトボックススイッチ用のOSということで、ネットワーク関連機能の設定、参照、動作確認などを提供しています。しかし、VRF (Virtual Routing and Forwarding) の機能確認のため
ip vrf
コマンドを使用することはできません。
ip vrf
コマンドを使えない理由は
- iproute2パッケージのバージョンが古く、サポートされていない
- linux kernelのバージョンが古く、サポートされていない
となります。iproute2パッケージ自体はstretch-backportsにより
ip vrf
をサポートするバージョンが提供されていますので、そちらをインストールすることで解決しますが、カーネルが古いままだとip vrf exec
を実行することができません。その1 単純にカーネルを入れ替えるだけ(失敗)
カーネルを更新できれば解決しそう、ということで、早速やってみることにしました。
新しいカーネルのインストール
sudo apt-get -t stretch-backports install linux-image-4.19.0-0.bpo.6-amd64リブートすると、無事……元々入っていた4.9.0が起動してきます。あれ?
GRUBで新しいカーネルを指定する
んー。GRUBかな。ということで再度リブートし、GRUBのメニュー画面で
e
を叩くと、たしかに4.9.0のまま。一時編集ですが4.19に書き換えて、起動させます。動作確認
起動はしました。マネジメントポートは生きています。sshでログインしてバージョン確認。ヨシ!
ip vrf exec
も動かしてみよう、えーとIPアドレスは、show ip interfaces
で確認……
あれ、Ethernet*がひとつも見えてないぞ? ログを見てみます。show logging|less
すると、INFO pmon#supervisord: 2020-02-21 07:59:43.276 INFO exited: syseepromd (exit status 1; not expected)あーーー。そういえばSONiCはスイッチASICだとかSFP周りの制御のためにカーネルモジュールを用意しているので、バージョンが合わなきゃ動かないってことをすっかり忘れてました。これは標準のLinux kernelには含まれないので、ビルドするところから手を入れないとどうしようもないです。残念ですが、このやり方はここまで。
その2 新しいカーネルを含むSONiCをビルドする(失敗)
SONiCでは、Linuxカーネルを含むイメージをソースコードから作成できます。このとき、外からバイナリイメージを取得してビルド時間を短縮することもできるのですが、通常はLinuxカーネル自体もソースコードからビルドします。その部分が4.9を対象としているので、4.19など新しいバージョンに置き換えればうまくいくのでは? と思い、試してみました。
src/sonic-linux-kernel/Makefile
を変更(不十分)
sonic-linux-kernel
はsubmoduleです。この下にカーネルソースが展開されたりしていますしMakefile
もありますので、ここを変更すれば良さげです。Makefile.diffdiff --git a/Makefile b/Makefile index 4d3a28a..6bf651f 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,10 @@ SHELL = /bin/bash .SHELLFLAGS += -e -KERNEL_ABI_MINOR_VERSION = 2 -KVERSION_SHORT ?= 4.9.0-11-$(KERNEL_ABI_MINOR_VERSION) +KVERSION_SHORT ?= 4.19.0-0.bpo.6 KVERSION ?= $(KVERSION_SHORT)-amd64 -KERNEL_VERSION ?= 4.9.189 -KERNEL_SUBVERSION ?= 3+deb9u2 +KERNEL_VERSION ?= 4.19.67 +KERNEL_SUBVERSION ?= 2+deb10u2~bpo9+1 kernel_procure_method ?= build LINUX_HEADER_COMMON = linux-headers-$(KVERSION_SHORT)-common_$(KERNEL_VERSION)-$(KERNEL_SUBVERSION)_all.deb @@ -20,11 +19,11 @@ ifneq ($(kernel_procure_method), build) # Downloading kernel diff --git a/Makefile b/Makefile index 4d3a28a..6bf651f 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,10 @@ SHELL = /bin/bash .SHELLFLAGS += -e -KERNEL_ABI_MINOR_VERSION = 2 -KVERSION_SHORT ?= 4.9.0-11-$(KERNEL_ABI_MINOR_VERSION) +KVERSION_SHORT ?= 4.19.0-0.bpo.6 KVERSION ?= $(KVERSION_SHORT)-amd64 -KERNEL_VERSION ?= 4.9.189 -KERNEL_SUBVERSION ?= 3+deb9u2 +KERNEL_VERSION ?= 4.19.67 +KERNEL_SUBVERSION ?= 2+deb10u2~bpo9+1 kernel_procure_method ?= build LINUX_HEADER_COMMON = linux-headers-$(KVERSION_SHORT)-common_$(KERNEL_VERSION)-$(KERNEL_SUBVERSION)_all.deb @@ -20,11 +19,11 @@ ifneq ($(kernel_procure_method), build) # Downloading kernelこれでいいんじゃないかな。
make
してみます。"SONIC_DEBUGGING_ON" : "" "SONIC_PROFILING_ON" : "" "KERNEL_PROCURE_METHOD" : "build" "BUILD_TIMESTAMP" : "20200221.131016" "BLDENV" : "stretch" "VS_PREPARE_MEM" : "yes" "ENABLE_SFLOW" : "y" [ 01 ] [ target/debs/stretch/linux-headers-4.9.0-11-2-common_4.9.189-3+deb9u2_alあれ?
残存する4.9指定部分を変更していく
よく見ると、
build_debian.sh
の下の方にパッケージ取得の記述があり、そこのURLが4.9を取りに行くよう書かれていました。追加のパッチを用意します。build_debian.sh.diffdiff --git a/build_debian.sh b/build_debian.sh index 37db2bde..bb58d7ab 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -37,7 +37,7 @@ if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then else DOCKER_VERSION=5:18.09.8~3-0~debian-stretch fi -LINUX_KERNEL_VERSION=4.9.0-11-2 +LINUX_KERNEL_VERSION=4.19.0-0.bpo.6 ## Working directory to prepare the file system FILESYSTEM_ROOT=./fsroot @@ -139,9 +139,7 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/initramfs-tools_*.deb || \ sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/linux-image-${LINUX_KERNEL_VERSION}-*_${CONFIGURED_ARCH}.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install acl -if [[ $CONFIGURED_ARCH == amd64 ]]; then - sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install dmidecode hdparm -fi +[[ $CONFIGURED_ARCH == amd64 ]] && sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install dmidecode ## Update initramfs for booting with squashfs+overlay cat files/initramfs-tools/modules | sudo tee -a $FILESYSTEM_ROOT/etc/initramfs-tools/modules > /dev/null他多数は
s/4\\.9\\.0-11-2/4.19.0-0.bpo.6/
でだいたい大丈夫なので,perl -pi
で一気に置換します。あとは
rules/linux-kernel.mk
です。linux-kernel.mk.diffdiff --git a/rules/linux-kernel.mk b/rules/linux-kernel.mk index e6742bdf..ec36b382 100644 --- a/rules/linux-kernel.mk +++ b/rules/linux-kernel.mk @@ -1,9 +1,9 @@ # linux kernel package -KVERSION_SHORT = 4.9.0-11-2 +KVERSION_SHORT = 4.19.0-0.bpo.6 KVERSION = $(KVERSION_SHORT)-$(CONFIGURED_ARCH) -KERNEL_VERSION = 4.9.189 -KERNEL_SUBVERSION = 3+deb9u2 +KERNEL_VERSION = 4.19.67 +KERNEL_SUBVERSION = 2+deb10u2~bpo9+1 ifeq ($(CONFIGURED_ARCH), armhf) # Override kernel version for ARMHF as it uses arm MP (multi-platform) for short version KVERSION = $(KVERSION_SHORT)-armmpこれで4.9を参照しに行くことはなくなったはず、ということで、再度ビルドしてみます。
Initialized empty Git repository in /sonic/src/sonic-linux-kernel/linux-signed-amd64-4.19.67+2+deb10u2~bpo9+1/.git/ error: patch failed: debian/changelog:1248 error: debian/changelog: patch does not apply stg import: Diff does not apply cleanly Makefile:52: recipe for target '/sonic/target/debs/stretch/linux-headers-4.19.0-0.bpo.6-common_4.19.67-2+deb10u2~bpo9+1_all.deb' failed make[1]: *** [/sonic/target/debs/stretch/linux-headers-4.19.0-0.bpo.6-common_4.19.67-2+deb10u2~bpo9+1_all.deb] Error 2あれ?
結論: カーネルの更新は断念
src/sonic-linux-kernel/patch
に、カーネルに当てるパッチが置かれていますが、ファイル数は105もあります。中を見ると、
- 「4.10からbackportした」(つまり当てなくてよい)
- 「5.1からbackportした」(当たるかわからないけど変更が必要)
- 「backportした」(どこから持ってきたか不明なので調査が必要)
- コメントなし(同じく調査が必要)
といったふうにどのパッチが必要なのかは個別に判断しなければいけないことがわかりました。中には「これはMellanoxのスイッチ向けだ」というのもあって、ターゲット次第では当てずに済むパッチもいくつかあるようでした。
1日1パッチ片付ければ105日で、1日10パッチ片付ければ11日で105個こなせると言えばそのとおりなのですが、パッチ整理だけにそんなに時間を使うわけにも行かないので、4.19への置き換えは断念しました。残念ですがしかたありません。
作業の残骸をgithubに置いておきますので、頑張れる方はこれを取っ掛かりにしてもいいかもしれません。
https://github.com/iMasaruOki/sonic-buildimage/tree/linux-kernel-4.19最初の問題:
ip vrf exec
はどうなるの?いろいろさまよっていたところ、代替手段としてcgroupsを使ってどうにかできることがわかりました。
ごそごそとシェルスクリプトを作りました。gistに放り込んでるので、コピペしてご自由にお使いください。
https://gist.github.com/iMasaruOki/a4e4cf03f4b754cb5d5f17633276a381動作はこんな感じです。
admin@sonic:~$ ip addr show Ethernet0 8: Ethernet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9100 qdisc pfifo_fast master Vrf1 state UP group default qlen 1000 link/ether 6c:b9:c5:16:88:cc brd ff:ff:ff:ff:ff:ff inet 172.21.1.1/31 scope global Ethernet0 valid_lft forever preferred_lft forever inet6 fe80::6eb9:c5ff:fe16:88cc/64 scope link valid_lft forever preferred_lft forever admin@sonic:~$ ping 172.21.1.0 PING 172.21.1.0 (172.21.1.0) 56(84) bytes of data. --- 172.21.1.0 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1006ms admin@sonic:~$ sudo ./ip-vrf-exec Vrf1 ping 172.21.1.0 PING 172.21.1.0 (172.21.1.0) 56(84) bytes of data. 64 bytes from 172.21.1.0: icmp_seq=1 ttl=64 time=0.421 ms --- 172.21.1.0 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.421/0.421/0.421/0.000 ms admin@sonic:~$というわけで、どうにかできました。ヨシ!
- 投稿日:2020-02-28T12:40:51+09:00
ファイル名一括変換
- 投稿日:2020-02-28T02:32:31+09:00
Linux勉強会 第4回:ファイル操作とディレクトリ操作
*この記事は、株式会社Ancarで行っている勉強会のおさらい & 外部発信記事として公開されています。
まえがき
こんにちは、WebエンジニアのMass-minと申します。
社内で始まったLinux勉強会も気づけば今回で第4回。Linuxチョットデキルようになってきたかな!?(チョットデキたら苦労はしない?)
第1回からずっと勉強してきたファイル操作に加えて、今回はディレクトリ操作についても学んでいきますよ〜。お品書きはこんな感じです。それでは今回も頑張っていきましょう!前提
OS: macOS Catalina(10.15.3)
シェル: bashおしながき
- ファイル操作
- ファイルの日付を変更する( touch コマンド)
- 現在の日時の表示・設定( date コマンド)
- ディレクトリ操作
- ディレクトリ内容の表示( ls コマンド)
- ディレクトリの作成( mkdir コマンド)
- ディレクトリの削除( rmdir コマンド)
- ディレクトリの移動と名前変更( mv コマンド)
ファイル操作
ファイルの日付を変更する( touch コマンド)
第1回でも触れたように、touchコマンドは本来ファイルの更新日時を変更するためのコマンドです。
man
コマンドでtouchコマンドのマニュアルを見てみると、たしかに「ファイルアクセス日時とファイル変更日時の変更をする」って書いてありますね。man touchTOUCH(1) BSD General Commands Manual TOUCH(1) NAME touch -- change file access and modification timestouchコマンドの使い方やオプションはいろいろありますが、その中でも代表的な使い方をおさらいしていくことにします。
現在の日時に修正する
現在の日時に修正するには、以下のようにします。
touchで更新日時を現在の日時に修正する$ touch ファイル名$ ls -l afile -rw-r--r-- 1 mass-min staff 0 2 27 23:25 afileこの状態から、afileの更新日時を現在時刻にしてみましょう。
$ date 2020年 2月27日 木曜日 23時59分46秒 JST $ touch afile $ ls -l afile -rw-r--r-- 1 mass-min staff 0 2 27 23:59 afile変更できてますね!?
指定の日時に修正する
指定の日時に修正するには、
t
オプションを使います。touchで更新日時を指定の日時に修正するtouch -t [[CC]YY]MMDDhhmm[.SS] ファイル名実際にやってみます。
# 2020年2月28日10時10分にする $ touch -t 202002281010 afile # タイムスタンプを見る $ ls -l afile -rw-r--r-- 1 mass-min staff 0 2 28 2020 afileおやっ、変更はできているようですが、時刻の表記がなくなって日付だけになってしまいました。
どうやらt
オプションで時刻指定をすると、年月日だけの表記になるっぽいですね。
@angel_p_57 さんからコメントをいただいた通り、lsがタイムスタンプの出力形式を、「ここ最近の日付かどうか」で判断して使い分けているから
最近の日付でないものはタイムスタンプの形式が年月日だけの表記になるようです。この
最近
というのがミソで、Macでは日付が6ヶ月以上前、または1分でも未来
だと最近の日付ではないと判断されるようです。過去の日付を入れたときのタイムスタンプの表示$ date 2020年 2月29日 土曜日 12時12分04秒 JST $ ls -l afile -rw-r--r-- 1 mass-min staff 0 2 29 12:12 afile $ touch -t 201908311212 afile $ ls -l afile -rw-r--r-- 1 mass-min staff 0 8 31 2019 afile $ touch -t 201908311213 afile $ ls -l afile -rw-r--r-- 1 mass-min staff 0 8 31 12:13 afile未来の日付を入れたときのタイムスタンプの表示$ date 2020年 2月29日 土曜日 11時56分00秒 JST $ ls -l afile -rw-r--r-- 1 mass-min staff 0 2 29 11:56 afile $ touch -t 202002291157 afile $ ls -l afile -rw-r--r-- 1 mass-min staff 0 2 29 2020 afile本題に戻ります!
ls
コマンドには完全な時刻表記をするT
オプションがありますので、それを使って再度確認してみましょう。$ ls -lT afile -rw-r--r-- 1 mass-min staff 0 2 28 10:10:00 2020 afile正しく変更できていることが確認できました!
他のファイルと同じタイムスタンプにする
他のファイルと更新日時を揃えたいときの使い方を見ましょう。
r
オプションで参照(reference)するファイルを指定します。touchで更新日時を他のファイルの日時に揃えるtouch -r 参照するファイル名 変更対象のファイル名実際にやってみます。
$ ls -l total 0 -rw-r--r-- 1 mass-min staff 0 2 28 2020 afile -rw-r--r-- 1 mass-min staff 0 2 27 23:18 bfile $ touch -r bfile afile $ ls -l total 0 -rw-r--r-- 1 mass-min staff 0 2 27 23:18 afile -rw-r--r-- 1 mass-min staff 0 2 27 23:18 bfileafileの更新日時がbfileの日時に合わせられました!?
納品前にファイルのタイムスタンプを合わせておくと、いつのタイミングの納品で変更があったのか判別する材料にもなりますね(まぁこういうのはGit管理するのが一番ですけどね?)空のファイルを作成する
touchコマンドは、指定したファイルが存在しなかったらその名前のファイルを作成してくれます。
空のファイルを先に作っておきたいときに使えますね
実際に作ってみましょう。$ ls -l total 0 -rw-r--r-- 1 mass-min staff 0 2 27 23:18 afile -rw-r--r-- 1 mass-min staff 0 2 27 23:18 bfile $ touch cfile $ ls -l total 0 -rw-r--r-- 1 mass-min staff 0 2 27 23:18 afile -rw-r--r-- 1 mass-min staff 0 2 27 23:18 bfile -rw-r--r-- 1 mass-min staff 0 2 28 00:45 cfiletouchコマンドで、新たにcfileを作成することが出来ました!?
現在の日時の表示・設定( date コマンド)
既にちょっと出てきていますが、dateコマンドは日時の表示、設定が出来るコマンドです。
システムが持っている時計機能の取得・設定を行うってことですね。現在時刻の取得
dateとそのまま打つと、現在時刻が取得できます。
現在時刻の取得$ date 2020年 2月28日 金曜日 00時50分33秒 JST現在時刻を設定
dateの引数にタイムスタンプ形式で時刻を渡すことで、その時刻を現在時刻として設定できます。
試しに現在時刻を2020年2月28日1時2分にしてみましょう。日時の設定$ date 022801022020 date: settimeofday (timeval): Operation not permitted $ sudo date 022801022020 Password: 2020年 2月28日 金曜日 01時02分00秒 JST日時情報の設定は、スーパーユーザーだけに許可されているんですね。まぁそうですよね、時間がコロコロ変えられちゃったら困りますからね?
ちなみにこうやって手動で時刻を変更しても、システムがインターネット経由で時刻を合わせる設定になっている場合はすぐに修正されます。
Macだと、
システム環境設定 > 日付と時刻
で日付と時刻を自動的に設定
にチェックが入っている場合はインターネット経由で自動的に時刻合わせがされます。
試しにこのチェックをはずして、コマンドで打った時刻が設定され続けるのを確認してみましょう。日付を2/27に変えてみます。
$ sudo date 022701022020 sudo: ignoring time stamp from the future Password: 2020年 2月27日 木曜日 01時02分00秒 JSTちゃんと変更できてますね!
とはいえ基本的には、時刻合わせはntpdとかで自動的に行うのが良いです。さっきも書きましたが、サーバー内の時間設定をコロコロ変えられたら溜まったもんじゃないですからね?ディレクトリ操作
ディレクトリ内容の表示( ls コマンド)
もういまさら言うまでもなく、めちゃくちゃ使う
ls
コマンド。ディレクトリの内容を表示するのに使います。ls [オプション] [パス名]パス指定の仕方は第2回の特殊なディレクトリ記号でも触れましたね。ここでは、実践で使える使い方をピックアップします。
更新時刻の新しい順に表示
t
オプションで、最近更新された順に並び替えて表示します。ファイル名とともに更新時刻もフルで表示したいので、さっき使ったl
オプション、T
オプションと合わせて表示してみます。更新時刻の新しい順に表示$ ls -tlT total 0 -rw-r--r-- 1 mass-min staff 0 2 28 00:45:58 2020 cfile -rw-r--r-- 1 mass-min staff 0 2 27 23:18:10 2020 afile -rw-r--r-- 1 mass-min staff 0 2 27 23:18:10 2020 bfileちゃんと新しい順に並んでますね!
サイズを見やすく表示
以下のように表示されたファイル群、サイズがどのくらいなのかがスッと入ってきづらいですね
$ ls -l ~/Desktop/ total 32 drwxr-xr-x 26 mass-min staff 832 2 10 2019 Videos drwxr-xr-x 11 mass-min staff 352 1 18 17:42 asahi_images -rw-r--r--@ 1 mass-min staff 14793 2 27 18:07 スクリーンショット 2020-02-27 18.07.45.pngそんなときは、
h
オプションで人間にとって読みやすい(human readable)表記にしましょう!$ ls -lh ~/Desktop/ total 32 drwxr-xr-x 26 mass-min staff 832B 2 10 2019 Videos drwxr-xr-x 11 mass-min staff 352B 1 18 17:42 asahi_images -rw-r--r--@ 1 mass-min staff 14K 2 27 18:07 スクリーンショット 2020-02-27 18.07.45.pngおおっ!理解しやすくなりましたね!?バイト単位の表記だと数字が大きすぎてサイズ感がつかめなかったファイルも、こうすればスッと入ってきます!
サブディレクトリの内容も表示
lsコマンドでは、 指定したディレクトリパスだけではなくサブディレクトリの内容も確認できる
R
オプションが用意されています。親階層を指定してls -R
とすれば、いっきに中身が確認できますね!実際にどう表示されるのか確認してみましょう。$ mkdir Dir1 $ mkdir Dir1/Dir2 $ touch Dir1/aafile $ touch Dir1/Dir2/aaafile $ touch Dir1/Dir2/bbbfile $ ls -R Dir1 afile bfile cfile ./Dir1: Dir2 aafile ./Dir1/Dir2: aaafile bbbfileおお!孫階層までもちゃんと表示されていますね!
色をつけて表示
G
オプションで、ファイルタイプごとに色分けして表示をしてくれます。 ファイルタイプを記号として付加してくれるF
オプションと合わせて、Laravelアプリのルートを表示してみます。色がついてる!これが
G
オプションのパワー!それから、ディレクトリには名前の後ろに/
がついてますね。こちらはF
オプションのパワーです!?ディレクトリの作成( mkdir コマンド)
これもまたまた先に出てきてしまってますが、ディレクトリの作成は
mkdir
コマンドで行います。mkdir [オプション] ディレクトリ名sこれもみんな結構な頻度使ってるかな?便利な使い方だけピックアップします?
複数ディレクトリを一度に作成
mkdir [オプション] ディレクトリ名s
のsってなんだよ!って思った人。気になるよね。実はmkdir
では、複数のディレクトリをいっぺんに作ることができちゃいます。こんな感じ。$ ls Dir1 afile bfile cfile $ mkdir Dir2 Dir3 $ ls Dir1 Dir2 Dir3 afile bfile cfile2ついっぺんに作ることができちゃいました!複数指定すれば、指定した分だけディレクトリを作ってくれます。
子ディレクトリの同時作成
mkdirは、ディレクトリパスを指定したときに親のディレクトリがないとエラーになります。
$ ls Dir1 Dir2 Dir3 afile bfile cfile # Dir3は存在するので、Dir3/Dir3_1は作成できる $ mkdir Dir3/Dir3_1 # Dir4は存在しないので、Dir4/Dir4_1は作成できない $ mkdir Dir4/Dir4_1 mkdir: Dir4: No such file or directoryいちいち
Dir4を作る
->Dir4/Dir4_1を作る
としてもよいのですが、面倒なので一気に作っちゃおうっていうのがここで紹介するp
オプションです。ディレクトリパスのうち、存在しないディレクトリを作成しつつ最終的に対象のディレクトリを作成します。$ ls Dir1 Dir2 Dir3 afile bfile cfile $ mkdir -p Dir4/Dir4_1 $ ls -R Dir1 Dir2 Dir3 Dir4 afile bfile cfile ./Dir1: Dir2 aafile ./Dir1/Dir2: aaafile bbbfile ./Dir2: ./Dir3: Dir3_1 ./Dir3/Dir3_1: ./Dir4: Dir4_1 ./Dir4/Dir4_1:
Dir4/Dir4_1
が一気に作成できていますね!?権限設定しながらディレクトリ作成
作成したディレクトリに対して権限の変更をかけるには
chmod
コマンドを実行します。
でも実は、mkdir
コマンドでディレクトリを作成するときにm
オプションで指定すれば予め権限設定をした状態でディレクトリが作れるんですよ。知ってました?自分は知りませんでした?$ ls -la total 0 drwxr-xr-x 9 mass-min staff 288 2 28 02:09 . drwxr-xr-x 13 mass-min staff 416 2 27 23:13 .. drwxr-xr-x 4 mass-min staff 128 2 28 01:33 Dir1 drwxr-xr-x 2 mass-min staff 64 2 28 01:59 Dir2 drwxr-xr-x 3 mass-min staff 96 2 28 02:02 Dir3 drwxr-xr-x 3 mass-min staff 96 2 28 02:09 Dir4 $ chmod 400 Dir4 $ ls -la total 0 drwxr-xr-x 6 mass-min staff 192 2 28 02:13 . drwxr-xr-x 13 mass-min staff 416 2 27 23:13 .. drwxr-xr-x 4 mass-min staff 128 2 28 01:33 Dir1 drwxr-xr-x 2 mass-min staff 64 2 28 01:59 Dir2 drwxr-xr-x 3 mass-min staff 96 2 28 02:02 Dir3 dr-------- 3 mass-min staff 96 2 28 02:09 Dir4権限設定しつつディレクトリを作成してみます。
$ mkdir -m 400 Dir5 $ ls -l total 0 drwxr-xr-x 4 mass-min staff 128 2 28 01:33 Dir1 drwxr-xr-x 2 mass-min staff 64 2 28 01:59 Dir2 drwxr-xr-x 3 mass-min staff 96 2 28 02:02 Dir3 dr-------- 3 mass-min staff 96 2 28 02:09 Dir4 dr-------- 2 mass-min staff 64 2 28 02:15 Dir5ちゃんと権限設定できてますね!地味に便利!
ディレクトリの削除( rmdir コマンド)
ディレクトリを削除するときに使うのが
rmdir
コマンド...なのですが、自分は正直ほとんど使ってません。
というのも、このコマンドが消せるのは空のディレクトリのみ
と超限定的で、使いみちがほとんど思いつかないからです。rm -r
で代用できちゃうよね。タイプ数も変わらないし。というわけで実例だけ載せてさらっといきます。$ ls -l total 0 drwxr-xr-x 4 mass-min staff 128 2 28 01:33 Dir1 drwxr-xr-x 2 mass-min staff 64 2 28 01:59 Dir2 drwxr-xr-x 3 mass-min staff 96 2 28 02:02 Dir3 dr-------- 3 mass-min staff 96 2 28 02:09 Dir4 dr-------- 2 mass-min staff 64 2 28 02:15 Dir5 $ rmdir Dir5 $ ls -la total 0 drwxr-xr-x 6 mass-min staff 192 2 28 02:20 . drwxr-xr-x 13 mass-min staff 416 2 27 23:13 .. drwxr-xr-x 4 mass-min staff 128 2 28 01:33 Dir1 drwxr-xr-x 2 mass-min staff 64 2 28 01:59 Dir2 drwxr-xr-x 3 mass-min staff 96 2 28 02:02 Dir3 dr-------- 3 mass-min staff 96 2 28 02:09 Dir4はい、削除できました。ちなみに
中身がら空でないディレクトリ
に対してrmdir
コマンドを実行するとこうなります。$ rmdir Dir1 rmdir: Dir1: Directory not emptyそっすねって感じです?
ディレクトリの移動と名前変更( mv コマンド)
ファイルの移動にも
mv
コマンドを使いますが、ディレクトリも同じくmv
コマンドで移動させることが出来ます。ディレクトリの移動
第2回で学んだ通りですね!特に新しいことはありません。
ディレクトリの移動mv ディレクトリ名1 ディレクトリ名2実際にやってみます。
$ ls Dir1 Dir2 Dir3 $ mv Dir2 Dir3 $ ls -R Dir1 Dir3 ./Dir1: Dir2 aafile ./Dir1/Dir2: aaafile bbbfile ./Dir3: Dir2 Dir3_1 ./Dir3/Dir2: ./Dir3/Dir3_1:Dir2をDir3の中に移動させることが出来ました!
ディレクトリ名の変更
これもそのままですね。ディレクトリ名2が存在しなければ、ディレクトリ名1がディレクトリ名2となります。
ディレクトリ名の変更mv ディレクトリ名1 ディレクトリ名2実際に変更してみます。
$ ls Dir1 Dir3 $ mv Dir1 Dir11 $ ls Dir11 Dir3Dir1がDir11に変わりましたね!?ディレクトリの中身は引き継がれ、ディレクトリ名のみ変わっています。
まとめ
本当に基礎的な部分ですし、よく使うコマンドばかりだったので、つまづくところは殆どなかったかと思います。こういう基礎コマンドを使うときこそ、
man
コマンドで引数のとり方やオプション見て便利な使い方を探る練習をしましょう。ググり方を覚えるのと同じで、マニュアル見るのに慣れておくと作業が数段捗ります。それに、あまり知られていない意外な使い方が隠れているかもしれませんよ〜?ステキな使い方を見つけたら、是非教えてくださいね?では今回はこの辺にて!また次回の勉強会記事でお会いしましょう!?
過去の勉強会の概要とリンクはこちら↓
- Linux勉強会 第1回:仮想コンソールとファイル操作
- 仮想コンソール
- 仮想コンソールで何ができるのか
- ttyを指定して出力
- ファイル操作
- ファイルの簡易作成方法
- ファイル名の指定方法
- Linux勉強会 第2回:ファイル操作
- 特殊なディレクトリ記号について
- ファイル内容を表示する
- ファイルの移動と名前変更をする
- Linux勉強会 第3回:ファイルの削除禁止設定と検索機能
- ファイルの削除禁止設定
- ファイルを探す
- その他の検索機能
- 投稿日:2020-02-28T00:03:18+09:00
PostgreSQLをソースからビルドしよう
はじめに
直近かかわってるプロジェクトでPostgreSQLの話が出ました。Postgre触ってないのが5年ぐらい経つと思います。はっきり覚えていませんが、最後に使ったのが9系だったと思います。家に帰って調べようと思いましたが、どこから調べたらいいか悩みました。
さぁ、ソースからビルドしようか!となり、やった事を共有することにしました。
今回はUbuntu18.04でビルドをしました。ちなみにDockerでUbuntuのイメージをpullしました。Dockerは日ごろ大変お世話になっています。PRE INSTALLATION
① パッケージリストのアップデート
まずは、パッケージを管理しているDBを最新の状態にします。(パッケージの更新自体はしません。)
root@2b4511afa430:/# apt-get update Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB] Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB] Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB] .... ....② ビルド用ライブラリのインストール
ビルドに必要とするライブラリは以下のページに書いてあります。
https://www.postgresql.org/docs/12/install-requirements.html
※今回ビルドするのが12.2なので上記のURLになっています。
上記のサイトを参考にインストールしてもいいですが、僕は以下の一つのコマンドで一気に入れました。# apt-get install build-essential Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: binutils binutils-common binutils-x86-64-linux-gnu cpp cpp-7 dirmngr dpkg-dev fakeroot g++ g++-7 gcc gcc-7 gcc-7-base gnupg gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf gpgsm libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan4 libasn1-8-heimdal libassuan0 libatomic1 libbinutils libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libdpkg-perl libfakeroot libfile-fcntllock-perl libgcc-7-dev libgdbm-compat4 libgdbm5 libgomp1 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libisl19 libitm1 libkrb5-26-heimdal libksba8 libldap-2.4-2 libldap-common liblocale-gettext-perl liblsan0 libmpc3 libmpfr6 libmpx2 libnpth0 libperl5.26 libquadmath0 libreadline7 libroken18-heimdal libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0 libssl1.1 libstdc++-7-dev libtsan0 libubsan0 libwind0-heimdal linux-libc-dev make manpages manpages-dev netbase patch perl perl-modules-5.26 pinentry-curses readline-common xz-utils Suggested packages: binutils-doc cpp-doc gcc-7-locales dbus-user-session libpam-systemd pinentry-gnome3 tor debian-keyring g++-multilib g++-7-multilib gcc-7-doc libstdc++6-7-dbg gcc-multilib autoconf automake libtool flex bison gdb gcc-doc gcc-7-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan4-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libmpx2-dbg libquadmath0-dbg parcimonie xloadimage scdaemon glibc-doc git bzr gdbm-l10n libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql libstdc++-7-doc make-doc man-browser ed diffutils-doc perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl pinentry-doc readline-doc The following NEW packages will be installed: binutils binutils-common binutils-x86-64-linux-gnu build-essential cpp cpp-7 dirmngr dpkg-dev fakeroot g++ g++-7 gcc gcc-7 gcc-7-base gnupg gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf gpgsm libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan4 libasn1-8-heimdal libassuan0 libatomic1 libbinutils libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libdpkg-perl libfakeroot libfile-fcntllock-perl libgcc-7-dev libgdbm-compat4 libgdbm5 libgomp1 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libisl19 libitm1 libkrb5-26-heimdal libksba8 libldap-2.4-2 libldap-common liblocale-gettext-perl liblsan0 libmpc3 libmpfr6 libmpx2 libnpth0 libperl5.26 libquadmath0 libreadline7 libroken18-heimdal libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0 libssl1.1 libstdc++-7-dev libtsan0 libubsan0 libwind0-heimdal linux-libc-dev make manpages manpages-dev netbase patch perl perl-modules-5.26 pinentry-curses readline-common xz-utils 0 upgraded, 83 newly installed, 0 to remove and 18 not upgraded. Need to get 50.5 MB of archives. After this operation, 222 MB of additional disk space will be used. Do you want to continue? [Y/n]Yを入力してエンターキーを押します。
これら以外に二つの重要パッケージがあります。それら使わずにビルドする事が可能ですが、その反面一部便利な機能が使えなくなります。
1. readline:矢印キーを押した時にコマンドの履歴を表示するツール
2. zlib: pg_dumpやpg_restoreがデータの圧縮に使うツール
今回は1つかわず、2だけ使いたいので「zlib」をインストールします。# apt-get install zlib1g-dev
もし、「readline」使いたいと思ったら、以下のコマンドを実行すると
# apt-cache search readline
readlineに関連するパッケージ欄が表示されます。
③ ソースのダウンロード
以下のリンクからビルドしたいバージョンのソースをダウンロードします。
https://www.postgresql.org/ftp/source/
今回は、12.2を使います。
以下のコマンドでダウンロードと解凍を行います。# cd /usr/local/src/ # wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz # tar zxf postgresql-12.2.tar.gz※「wget」がなかった場合は、apt-get install wgetでダウンロードできます。
INSTALLATION
やっとビルドの出番です。
① configure
今回はビルドようのディレクトリを別に用意します。こうすることで何か問題になった時にそのディレクトリを削除し、再ビルドすれば前のデータが邪魔しません。
root@2b4511afa430:/usr/local/src# cd postgresql-12.2 root@2b4511afa430:/usr/local/src/postgresql-12.2# mkdir tmp_build_dir root@2b4511afa430:/usr/local/src/postgresql-12.2# cd tmp_build_dir/ root@2b4511afa430:/usr/local/src/postgresql-12.2/tmp_build_dir#この場所から以下のコマンドを実行します。
/usr/local/src/postgresql-12.2/configure --prefix=/opt/postgresql12 --without-readline上ですでに説明していますが、今回はreadlineを使わないため--without-readlineを追加しています。
--prefixはあとで出ますが、ここで指定したディレクトリに実行ファイル、ライブラリファイルなどの重要なファイルがインストールされます。
※詳しく知りたい場合は「--prefix」でググってくださいね。ここで何しているかというと、ソースディレクトリにある「configure」ファイルを実行し、インストールに必要な環境変数やライブラリのチェックを行っています。チェックした結果、MakeFileが作られます。
② make
続いては、configureで作成されたMakeFileに基づいてコンパイルします。
# make
少し時間かかりますが、最後に以下のようなメッセージがでたらOKです。
省略 make[1]: Entering directory '/usr/local/src/postgresql-12.2/tmp_build_dir/config' make[1]: Nothing to be done for 'all'. make[1]: Leaving directory '/usr/local/src/postgresql-12.2/tmp_build_dir/config' All of PostgreSQL successfully made. Ready to install.③ install
そして、上記でコンパイルされたものを--prefixで指定したディレクトリにインストールします。
# make install
最後に以下のようなメッセージがでたらOKです。
省略 /usr/bin/install -c -m 755 /usr/local/src/postgresql-12.2/config/missing '/opt/postgresql12/lib/pgxs/config/missing' make[1]: Leaving directory '/opt/temp/build_dir/config' PostgreSQL installation complete.インストール先の中身が以下のようになります。
postgresql12/ |-- bin |-- include |-- lib `-- sharePOST INSTALLATION
各ツールがどこからでも実行でいるように、実行ファイル群があるディレクトリのパスをPATHに追加します。
export PATH=/opt/postgresql12/bin:$PATHそして最後に、正しくインストールできたかどうか確認するために、インストールしたpostresqlのバージョンを確認します。
# psql --version psql (PostgreSQL) 12.2上記のやり方は一時的なものです。タミナルを終了するとPATHの値が元の値に戻ります。常に記憶させたい場合は、スタートアップで実行されるファイルに上記のコマンドを追加する必要があります。
例えば、~/.bash_profile、/etc/profile、、最後に
今日はインストールまでとします。また次回は初期セットアップあたりから実践したいと思います。何かの参考になれば幸いです。