どこかに向かうらしい話

迷走エンジニアの放浪記

rpmコマンドまとめ

はじめに

インフラ屋にとって、パッケージ管理は非常に大事なテーマである。
Infrastructure as Codeが流行っている今だからこそ、負担なく確実にパッケージをインストールできる技術というのは必要になるのではないかと考える。

パッケージ管理のポリシーはいろいろあるとは思うが、共通して必要になるテーマは以下の3点になるのかと思う。

しかし、大前提として、パッケージ管理のコマンド(RPM系ならrpm/yum/dnf、DEB系ならdpkg/apt)を知るところから始めるのは迂遠なことではないと思う。

まずは自分の手馴れているRPMパッケージから扱う。
初回である今回は、特に上記に挙げた3点に結びつくようなrpmコマンドについて説明していく。

検索

インストールしたRPMパッケージの検索

インストールしたrpmパッケージ全てを出力させるには、「-qa」オプションを使用する。
grepコマンドと組み合わせることで、特定のRPMパッケージがインストールされたかがわかる。
coreutilsパッケージがインストールされているかを確認する例を示す。

# rpm -qa | grep coreutils
coreutils-8.22-18.el7.x86_64
policycoreutils-2.5-17.1.el7.x86_64

使用しているコマンドがのどのRPMパッケージのコマンドかの検索

コマンド名は必ずしもパッケージ名と一致しないことも多い。
使用してるコマンドがどのパッケージに含まれるかを知りたい場合には、「-qf」オプションを使用する。
ただし、「-qf」オプションはフルパスでないと指定ができないため、whichコマンドでフルパスを調べ、その結果を使用してrpmコマンドを使用する。
lsコマンドのパス先を調べ、そのパッケージ収録元を確認する例を示す。

# which ls
alias ls='ls --color=auto'
        /usr/bin/ls

# rpm -qf /usr/bin/ls
coreutils-8.22-18.el7.x86_64

インストールしたRPMパッケージが提供するコマンドの検索

インストールしたRPMパッケージが提供するコマンドを知りたい場合には、「-ql」オプションを使用し、binでgrepする。

# rpm -ql rpm-build | grep bin
/usr/bin/gendiff
/usr/bin/rpmbuild
/usr/bin/rpmspec

インストール

新規インストール

「-i」オプションでRPMパッケージの新規インストールが可能。
「-vh」オプションを付けると、「#」マークを用いたプログレスバーが表示されるようになる。
なお、「#」50個で100%を示す。

test-1.0.0.x86_64.rpmを新規インストールするときは以下の通り、「-ivh」オプションを使う。

# rpm -ivh test-1.0.0.x86_64.rpm
test ##################################################

アップグレード

インストール済のRPMパッケージをアップグレードする場合は「-U」オプションを指定する。
「-i」オプションのときと同様に、「-vh」オプションを付けると、「#」マークを用いたプログレスバーが表示されるようになる。
test-1.0.1.x86_64.rpmにアップデートするときは以下の通り、「-Uvh」オプションを使う。

# rpm -Uvh test-1.0.1.x86_64.rpm
test ##################################################

yumコマンドとのすみわけ

「-i」オプションによるインストールもできるが、yumコマンドの「localinstall」オプションを使うことでもRPMパッケージのインストールができる。
この違いについては、別途記述する。

アンインストール

「-e」オプションでインストール済のRPMパッケージをアンインストールが可能。
test-1.0.1.x86_64.rpmをアンインストールするときは、以下の通り。

# rpm -e test-1.0.1.el7.x86_64

依存等により、アンインストールしようとしているRPMパッケージが他のRPMで使用されている場合は、エラーによりアンインストールできない。
「--nodeps」オプションにより強制的にアンインストールすることもできるが、そうすると依存関係にあるプログラムが動作しなくなる可能性もあるので注意すること。

# rpm -e --nodeps test-1.0.1.el7.x86_64

バッチファイルで現在時刻をyyyy/mm/dd hh:mn:ss形式で取得するための備忘録

バッチファイルget_time.batを適当なフォルダに配置し、C:\scripts\logフォルダに各ファイルを出力するスクリプト。 気をつけるポイントはコメントを参考に。

@echo off

REM 日付をyyyy/mm/dd形式で取得する
set d=%date%

REM 日付を年、月、日に分解する
set yyyy=%d:~-10,4%
set mm=%d:~-5,2%
set dd=%d:~-2,2%

REM 時間をhh:mn:ss形式で取得する
REM たんにtimeコマンドと入れるだけだと、hh:mn:ss形式で取得できないことに注意
set t=%time: =0%

REM 時間を時、分、秒に分解する
set hh=%t:~0,2%
set mn=%t:~3,2%
set ss=%t:~6,2%

REM 日付の出力
echo %d% > C:\scripts\log\get_time.log
echo %yyyy% >> C:\scripts\log\get_time.log
echo %mm% >> C:\scripts\log\get_time.log
echo %dd% >> C:\scripts\log\get_time.log

echo; >> C:\scripts\log\get_time.log

REM 時間の出力
echo %t% >> C:\scripts\log\get_time.log
echo %hh% >> C:\scripts\log\get_time.log
echo %mn% >> C:\scripts\log\get_time.log
echo %ss% >> C:\scripts\log\get_time.log

REM 日付と時間の出力(出力先のファイル名に時間を反映)
echo %d% %t% >> C:\scripts\log\time_%yyyy%%mm%%dd%_%hh%%mn%%ss%.log

get_time.logの中身はこんな感じ。

2017/10/14 
2017 
10 
14 

00:24:11.90 
00 
24 
11 

time_20171014_002411.logの中身はこんな感じ。

2017/10/14 00:24:11.90 

「シェルプログラミング実用テクニック」 CentOS7向け補足事項(5章~8章)

「シェルプログラミング実用テクニック」 CentOS7向け補足事項(1章~4章)の続き。

5章

hdparmコマンド

普通にyumでインストール可能。

# yum install hdparm

smartctlコマンド

普通にyumでインストール可能。

# yum install smartmontools

6章

xxdコマンド

普通にyumでインストール可能。

# yum install vim-common

ImageMagick

普通にyumでインストール可能。

# yum install ImageMagick

7章

wgetコマンド

意外なことに最小インストールだと入ってない。
普通にyumでインストール可能。

# yum install wget

ncコマンド

普通にyumでインストール可能。

# yum install nmap-ncat

netstatコマンド

net-toolsパッケージをインストールすればよいのだが、net-toolsを「deprecated(廃止予定)」としているため、ssコマンドに置き換えましょう。

nmapコマンド

普通にyumでインストール可能。

# yum install nmap

telnetコマンド

普通にyumでインストール可能。

# yum install telnet

postfix

postfixに関しては、最小インストールでも入るので、特に気にする必要はない。

8章

bcコマンド

普通にyumでインストール可能。

# yum install bc

numsumコマンド

以下のURLよりnum-utilsパッケージのダウンロードを行い、rpmよりインストールを行う。

# curl -O http://suso.suso.org/programs/num-utils/downloads/rpm/num-utils-0.5-1.noarch.rpm
# yum install num-utils-0.5-1.noarch.rpm

蛇足だが、

num-utilsパッケージでは、以下のコマンドが用意されている。

  • average
  • bound
  • interval
  • normalize
  • numgrep
  • numprocess
  • numsum
  • random
  • range
  • round

詳しくはhttps://orebibou.com/2016/06/%E3%80%8Enumutils%E3%80%8F%E3%81%A7linux%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E4%B8%8A%E3%81%A7%E3%81%AE%E8%A8%88%E7%AE%97%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E8%A1%8C%E3%81%88%E3%82%8B/を参照するとよい。

JOIN on SQL

事前準備

Salesテーブル

sales_id sales_date kokyaku_id
0001 2016-10-01 C001
0002 2016-10-02 C002
0003 2016-10-03 C003
0004 2016-10-04 AAAA
0005 2016-10-05
0006 2016-10-06 C001
CREATE TABLE Sales
(sales_id     VARCHAR(4),
 sales_date  DATE,
 kokyaku_id VARCHAR(4));

INSERT INTO Sales VALUES ('S001', '2016-10-01', 'C001');
INSERT INTO Sales VALUES ('S002', '2016-10-02', 'C002');
INSERT INTO Sales VALUES ('S003', '2016-10-03', 'C003');
INSERT INTO Sales VALUES ('S004', '2016-10-04', 'AAAA');
INSERT INTO Sales VALUES ('S005', '2016-10-05', NULL);
INSERT INTO Sales VALUES ('S006', '2016-10-06', 'C001');

Kokyakuテーブル

kokyaku_id kokyaku_name
C001 田中
C002 鈴木
CREATE TABLE Kokyaku
(kokyaku_id   VARCHAR(4),
 kokyaku_name VARCHAR(30));

INSERT INTO kokyaku VALUES ('C001', '田中');
INSERT INTO kokyaku VALUES ('C002', '鈴木');

本題

INNER JOIN

SELECT *
  FROM Sales INNER JOIN Kokyaku 
    ON Sales.kokyaku_id = Kokyaku.kokyaku_id;
sales_id sales_date kokyaku_id kokyaku_id kokyaku_name
S001 2016-10-01 C001 C001 田中
S002 2016-10-02 C002 C002 鈴木
S006 2016-10-06 C001 C001 田中

LEFT OUTER JOIN

SELECT * 
  FROM Sales LEFT OUTER JOIN Kokyaku
    ON Sales.kokyaku_cd = Kokyaku.kokyaku_cd
 ORDER BY sales_id;
sales_id sales_date kokyaku_id kokyaku_id kokyaku_name
S001 2016-10-01 C001 C001 田中
S002 2016-10-02 C002 C002 鈴木
S003 2016-10-03 C003
S004 2016-10-04 AAAA
S005 2016-10-05
S006 2016-10-06 C001 C001 田中

RIGHT OUTER JOIN

SELECT * 
  FROM Sales RIGHT OUTER JOIN Kokyaku
    ON Sales.kokyaku_id = Kokyaku.kokyaku_id
 ORDER BY sales_id;
sales_id sales_date kokyaku_id kokyaku_id kokyaku_name
S001 2016-10-01 C001 C001 田中
S002 2016-10-02 C002 C002 鈴木
S006 2016-10-06 C001 C001 田中

「シェルプログラミング実用テクニック」 CentOS7向け補足事項(1章~4章)

最近シェルスクリプトに興味を持ち始め、以下の書籍を読んでいるところである。

シェルプログラミング実用テクニック

シェルプログラミング実用テクニック

ただ、この本はUbuntu14.04がベースになっており、CentOSに関する記述はない。
そのため、CentOS7でもこの書籍を堪能したいぞということで、読むうえで必要になる知識を記事にしてみた(主にコマンドの導入についてですね)。
なお、全部を書くのは長くなるし、とりあえず読み終えた1章から4章に関して記載する。

最初に

該当の書籍のサンプルはGithubに以下のとおり存在する。

ryuichiueda/GihyoShellBookSamples

第1章

manコマンドの日本語化

日本語manページを以下の通りインストールする。

# yum install man-pages-ja 

なお、サーバーのローケルを日本語にすること。

treeコマンド

普通にyumでインストール可能。

# yum install tree 

AWKsedについて

基本的にCentOSに入っているAWKGAWKsedはgsedであるので、特別注意する必要はない。

# awk --version
GNU Awk 4.0.2
【中略】

# sed --version
sed (GNU sed) 4.2.2
【中略】

Open-usp-Tukubaiについて

以下のGitHubのサイトよりダウンロードを行う。

usp-engineers-community/Open-usp-Tukubai

ダウンロード後、COMMANDSディレクトリ以下のファイル群を/usr/local/binに配置する。

第2章

MeCabコマンド

yumでMeCabをインストールを参考にインストール。

Groongaリポジトリに存在するので、リポジトリ情報のrpmをインストールすることでMeCabをインストールできるようになる。

# yum localinstall http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm 
# yum install mecab mecab-ipadic 

aspellコマンド

EPELに存在するので、epel-releaseを事前にインストールする必要がある。

# yum install epel-release
# yum install aspell-en aspell

nkfコマンド

EPELに存在するので、epel-releaseを事前にインストールする必要がある。

# yum install epel-release 
# yum install nkf 

第3章

inotify-toolsのインストール

【CENTOS 7】【INOTIFY-TOOLS】をインストールUse inotify-tools on CentOS 7 or RHEL 7 to watch files and directories for eventsを参考にインストールした。

CentOS6までであれば、inotify-toolsはDag RPM Repositoryにあるので、そこからインストールすればよい。
しかし、CentOS 7にはDag RPM Repositoryにinotify-toolsがない。

http://ftp.riken.jp/Linux/dag/redhat/el7/en/x86_64/dag/RPMS/

よって、直接ダウンロードして、makeする必要がある。
なお、バージョンがどれが最新化を把握する方法がないため、両方のサイトで使われている「inotify-tools-3.14.tar.gz」をインストールすることにした。

# yum install gcc make
# cd /usr/local/src
# curl -O http://jensd.be/download/inotify-tools-3.14.tar.gz
# tar xvzf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure
# make
# make install

以下を実行し、ファイルがあればOK。

# ls -l /usr/local/bin/inotify*
-rwxr-xr-x 1 root root 60900  9月 29 00:00 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 55191  9月 29 00:00 /usr/local/bin/inotifywatch

第4章

barcodeコマンド

EPELに存在するので、epel-releaseを事前にインストールする必要がある。

# yum install epel-release 
# yum install barcode 

qrencodeコマンド

特に準備なしにインストール可能。

# yum install qrencode

wkhtmltopdfコマンド

まずは、wkhtmltopdf自体のインストールを行う。
wkhtmltopdfは、EPELに存在するので、epel-releaseを事前にインストールする必要がある。

# yum install epel-release 
# yum install wkhtmltopdf

次に日本語フォントをインストール。
yumでかんたんにインストールできるIPAフォントを入れる。

# yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts

なお、個人的に好みなvlgothic-fontsも入れちゃうw

# yum install vlgothic-fonts

libpng libjpeg-turboのインストールする。

# yum install libpng libjpeg-turbo

Xサーバーを入れていない場合、Xvfdの助けが必要になる。
そのため、Xvfbをインストールする。

# yum install Xvfb

PDF化してみる。

# curl -O http://yahoo.co.jp/index.html
# xvfb-run wkhtmltopdf index.html index.pdf

Git最新版 on CentOS7

詳しくはこのサイトを参考にさせていただいた。

CentOS7に最新のGitを導入する方法 - vdeep

ぶっちゃけこのサイト見ればALL OKなのであるが、自分が読みやすい形にしたいということで、インストール手順を以下の通り記載することとした。

まず、事前にインストールしておく必要があるパッケージのインストールを行う。

# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

次に、ソースコードを取得し、解凍する。

https://git-scm.com/の「Latest source Release」より、最新版のバージョンを確認する。
そして、https://www.kernel.org/pub/software/scm/git/ から、最新版のURLを確認し、ダウンロードを行う。

なお、現時点確認した最新版は「2.10.0」であったので、「2.10.0」のダウンロードを行っている。

# cd /usr/local/src/
# curl -O https://www.kernel.org/pub/software/scm/git/git-2.10.0.tar.gz
# tar xzvf git-2.10.0.tar.gz

makeする。

# cd git-2.10.0
# make prefix=/usr/local all
# make prefix=/usr/local install

導入確認を行う。

# git --version
git version 2.10.0

PostgreSQLのメタコマンド

PostgreSQLのよく使うメタコマンドについて備忘録。
なお、メタコマンドはSQLコマンドと異なり、改行で終わりが判断される。

タコマンド 説明
\q         psqlを切断する
\l データベースの一覧を表示する
\d        テーブル、ビュー、シーケンスの一覧を表示する
\d テーブル名 テーブルの項目(フィールド)確認する
\dt テーブルの一覧を表示する
\di インデックスの一覧を表示する
\dv ビューの一覧を表示する
\ds シーケンスの一覧を表示する
\copy PostgreSQLpsqlの間でテーブルデータをコピーする
\i sqlファイル名 SQL(スクリプト)ファイルの実行する