20200228のLinuxに関する記事は9件です。

サーバが何もしてないのに調子が悪くなった時に確認するコマンド

何もしてないのサーバの調子が悪くなったと言いたいくらい心あたりがない時に、確認するコマンド

ディスク容量確認

ディスク使用量が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/Data

Availが100%に近いものがあったらMounted onに書いてる配下のファイルでサイズが大きいものを削除した方が良い。
Mounted onの中の具体的にどこが容量を圧迫してるか?は、du -shで確認。
/配下を見たい場合はdu -sh /*で/配下のディレクトリ毎にいくら使用されているか確認できる。
権限次第では一部見れなかったりするのでsudoを使ってroot権限で実施するのがおすすめ。

$ du -sh ./*
 26M    ./Desktop
1.5M    ./Documents
1.4G    ./Downloads

/*で実施したらレスが遅かったので、例では./*で実施してます。

CPU使用率、負荷の確認

負荷の大きいプロセスがあればCPU usageLoad Avgなどが高くなってるはず。
確認はtopコマンドを使用。もし負荷が高ければpsコマンドでプロセスを確認してみる。負荷の高いプロセスが特定出来たらkillコマンドでプロセスを殺すか、systemctlコマンドなどで、対象のサービスを再起動してみる。

終わりに

上記2点で大体何かしらわかるので、全く検討がつかない時はとりあえず試してみると良いかもしれないです。
もしそれでもわからなけれればログを確認したり、エラーから読み取りましょう。

悪いこと何もしてないなら、上記のコマンドだけでも何かしらわかるはず。。

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

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

r5zu03.gif

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

SereneLinuxでフォントサイズを変更する

今回はSereneLinuxでのフォントサイズの変更方法についてです。
また、こちらの方法はXfce4のLinuxディストリビューションであれば適応可能です。

まず、whisker menuを開いて設定マネージャをクリックしてください。
スクリーンショット_2020-02-28_21-54-21.png

次に、Xfce4の設定マネージャが表示されたら、「外観」を選択してください。
スクリーンショット_2020-02-28_21-55-04.png

フォントの項に移動したら...
スクリーンショット_2020-02-28_21-55-21.png

下へスクロールさせてください。
スクリーンショット_2020-02-28_21-55-30.png

カスタムDPI設定にチェックを入れ、お好みのDPI値を設定してください。
スクリーンショット_2020-02-28_21-55-42.png
これでフォントサイズが大きくなりました!
右上の×をクリックして終了させましょう。

フォントサイズを調整して快適なSereneLinuxライフを!

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

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オーバーライドファイルを含めて配信することを検討しているそうです。

以上、取り急ぎですが参考になれば幸いです。

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

Opencv install奮闘記

環境

ubuntu:16.04
GPU:GeForce GTX 970
CUDA:10.2
cudnn:7.6.5

WITH CUDAについて

ONにした場合

  • GPUでの高速処理が可能
  • 自分の場合はエラーが止まらなかった→ので、諦めた

opencv-contribについて

CUDA使わないのであれば、いらなさそう

参照サイト

  1. https://stackoverflow.com/questions/46584000/cmake-error-variables-are-set-to-notfound
  2. https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/
  3. https://qiita.com/tomoaki_teshima/items/4401349431ce266dc319
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.diff
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
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.diff
diff --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.diff
diff --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:~$

というわけで、どうにかできました。ヨシ!

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

ファイル名一括変換

はじめに

フォルダ構造が複雑であり、リネームしたいファイルが散らばっているときに有効なリネーム方法。

実行

この例だと、".nii.gz"という拡張しがあるファイルはすべてAAA.nii.gzというファイルにリネームするといったもの。

find . -name "*.nii.gz" | xargs -i echo 'rename "$(basename {})" AAA.nii.gz {}' | bash
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux勉強会 第4回:ファイル操作とディレクトリ操作

*この記事は、株式会社Ancarで行っている勉強会のおさらい & 外部発信記事として公開されています。

まえがき

こんにちは、WebエンジニアのMass-minと申します。
社内で始まったLinux勉強会も気づけば今回で第4回。Linuxチョットデキルようになってきたかな!?(チョットデキたら苦労はしない?)
第1回からずっと勉強してきたファイル操作に加えて、今回はディレクトリ操作についても学んでいきますよ〜。お品書きはこんな感じです。それでは今回も頑張っていきましょう!:tada:

前提

OS: macOS Catalina(10.15.3)
シェル: bash

おしながき

  • ファイル操作
    • ファイルの日付を変更する( touch コマンド)
    • 現在の日時の表示・設定( date コマンド)
  • ディレクトリ操作
    • ディレクトリ内容の表示( ls コマンド)
    • ディレクトリの作成( mkdir コマンド)
    • ディレクトリの削除( rmdir コマンド)
    • ディレクトリの移動と名前変更( mv コマンド)

ファイル操作

ファイルの日付を変更する( touch コマンド)

第1回でも触れたように、touchコマンドは本来ファイルの更新日時を変更するためのコマンドです。 manコマンドでtouchコマンドのマニュアルを見てみると、たしかに「ファイルアクセス日時とファイル変更日時の変更をする」って書いてありますね。

man touch
TOUCH(1)                  BSD General Commands Manual                 TOUCH(1)

NAME
     touch -- change file access and modification times

touchコマンドの使い方やオプションはいろいろありますが、その中でも代表的な使い方をおさらいしていくことにします。

現在の日時に修正する

現在の日時に修正するには、以下のようにします。

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

正しく変更できていることが確認できました!:tada:

他のファイルと同じタイムスタンプにする

他のファイルと更新日時を揃えたいときの使い方を見ましょう。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 bfile

afileの更新日時がbfileの日時に合わせられました!?
納品前にファイルのタイムスタンプを合わせておくと、いつのタイミングの納品で変更があったのか判別する材料にもなりますね(まぁこういうのはGit管理するのが一番ですけどね?)

空のファイルを作成する

touchコマンドは、指定したファイルが存在しなかったらその名前のファイルを作成してくれます。
空のファイルを先に作っておきたいときに使えますね :thumbsup:
実際に作ってみましょう。

$ 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 cfile

touchコマンドで、新たに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だと、システム環境設定 > 日付と時刻日付と時刻を自動的に設定にチェックが入っている場合はインターネット経由で自動的に時刻合わせがされます。
image.png

試しにこのチェックをはずして、コマンドで打った時刻が設定され続けるのを確認してみましょう。日付を2/27に変えてみます。

$ sudo date 022701022020
sudo: ignoring time stamp from the future
Password:
2020年 2月27日 木曜日 01時02分00秒 JST

結果は...?
image.png

ちゃんと変更できてますね!
とはいえ基本的には、時刻合わせは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

ちゃんと新しい順に並んでますね! :ok_hand:

サイズを見やすく表示

以下のように表示されたファイル群、サイズがどのくらいなのかがスッと入ってきづらいですね:thinking:

$ 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

おお!孫階層までもちゃんと表示されていますね!:tada:

色をつけて表示

G オプションで、ファイルタイプごとに色分けして表示をしてくれます。 ファイルタイプを記号として付加してくれるFオプションと合わせて、Laravelアプリのルートを表示してみます。

image.png

色がついてる!これがGオプションのパワー!それから、ディレクトリには名前の後ろに / がついてますね。こちらは F オプションのパワーです!?

ディレクトリの作成( mkdir コマンド)

これもまたまた先に出てきてしまってますが、ディレクトリの作成は mkdir コマンドで行います。

mkdir [オプション] ディレクトリ名s

これもみんな結構な頻度使ってるかな?便利な使い方だけピックアップします?

複数ディレクトリを一度に作成

mkdir [オプション] ディレクトリ名s のsってなんだよ!って思った人。気になるよね。実は mkdir では、複数のディレクトリをいっぺんに作ることができちゃいます。こんな感じ。

$ ls
Dir1    afile   bfile   cfile
$ mkdir Dir2 Dir3
$ ls
Dir1    Dir2    Dir3    afile   bfile   cfile

2ついっぺんに作ることができちゃいました!複数指定すれば、指定した分だけディレクトリを作ってくれます。

子ディレクトリの同時作成

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

ちゃんと権限設定できてますね!地味に便利!:joy:

ディレクトリの削除( 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の中に移動させることが出来ました!:tada:

ディレクトリ名の変更

これもそのままですね。ディレクトリ名2が存在しなければ、ディレクトリ名1がディレクトリ名2となります。

ディレクトリ名の変更
mv ディレクトリ名1 ディレクトリ名2

実際に変更してみます。

$ ls
Dir1    Dir3
$ mv Dir1 Dir11
$ ls
Dir11   Dir3

Dir1がDir11に変わりましたね!?ディレクトリの中身は引き継がれ、ディレクトリ名のみ変わっています。

まとめ

本当に基礎的な部分ですし、よく使うコマンドばかりだったので、つまづくところは殆どなかったかと思います。こういう基礎コマンドを使うときこそ、 man コマンドで引数のとり方やオプション見て便利な使い方を探る練習をしましょう。ググり方を覚えるのと同じで、マニュアル見るのに慣れておくと作業が数段捗ります。それに、あまり知られていない意外な使い方が隠れているかもしれませんよ〜?ステキな使い方を見つけたら、是非教えてくださいね?

では今回はこの辺にて!また次回の勉強会記事でお会いしましょう!?

過去の勉強会の概要とリンクはこちら↓

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

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
`-- share

POST INSTALLATION

各ツールがどこからでも実行でいるように、実行ファイル群があるディレクトリのパスをPATHに追加します。

export PATH=/opt/postgresql12/bin:$PATH

そして最後に、正しくインストールできたかどうか確認するために、インストールしたpostresqlのバージョンを確認します。

# psql --version
psql (PostgreSQL) 12.2

上記のやり方は一時的なものです。タミナルを終了するとPATHの値が元の値に戻ります。常に記憶させたい場合は、スタートアップで実行されるファイルに上記のコマンドを追加する必要があります。
例えば、~/.bash_profile、/etc/profile、、

最後に

今日はインストールまでとします。また次回は初期セットアップあたりから実践したいと思います。何かの参考になれば幸いです。

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