20200215のLinuxに関する記事は4件です。

【Linux】ネット環境がない(スタンドアロン)サーバーに、パッケージをインストールする方法

はじめに

本番環境など、セキュリティの観点からグローバルネットワークに繋がっていない、
いわゆるスタンドアロンと言われるサーバーがあります。

そのようなサーバーにライブラリやパッケージを追加でインストールしたい時、
どのようにすればインストールできるのか。

以前の仕事ではまったことがあり、その時の解決方法を少しまとめた形にして記したいと思います。
どなたかの参考になれば、幸いです。

記事の最後に、この方法を自動実行するスクリプトを紹介しています。(Gif画像付き)
私個人が作成した物のため動作を保証するものではありませんが、もし機会があれば利用してみてください。

前提条件

記事に使用する単語を以下のように定義します。

単語 定義
スタンドアロン環境 グローバルネットワークに繋がらないサーバー。インストール先。
ローカルPC 自分の作業用PC。ネットワークには繋がっている。

使用環境

名称 OS バージョン 備考
スタンドアロン環境 CentOS 7 AWS EC2(検証用)
ローカルPC macOS Catalina
Dockerコンテナ CentOS 7

全体の流れ

以下のような流れで行います。

  1. ローカルPCでDockerコンテナを立ち上げる
  2. Dockerコンテナでパッケージをダウンロード
  3. ダウンロード先のフォルダをリポジトリとして作成する
  4. 作成したリポジトリをスタンドアロン環境に移す
  5. スタンドアロン環境でリポジトリの設定をする
  6. スタンドアロン環境でインストールする

記事後半にて、上記の詳細な手順を説明していきます。

Docker環境がない場合、ローカルPCで実行しても可能かもしれません。
しかし、依存関係によってはうまく行かないケースが考えられます。
ほとんど何も入っていない、まっさらな環境を利用することをオススメします。

注意点

  • スタンドアロン環境の状態によっては、依存関係でインストールに失敗することがあります。
  • 依存関係が無く、単一のrpmになるパッケージに関しては、rpmコマンドでインストールした方が早いし楽です。
  • この方法では、一度に必要なパッケージを全てインストールすることをオススメします。

詳細な手順

それでは実際にやっていきましょう!

0. スタンドアロン環境準備

検証環境に使用するため、AWS EC2をスタンドアロン環境のサーバーとして用意しました。
グローバルネットワークから隔離するため、ssh(22番ポート)以外の通信はできないようにしています。

↓ スタンドアロン環境でyum updateを実行した結果
スクリーンショット 2020-02-13 18.11.11.png

1. ローカルPCでDockerコンテナを立ち上げる

スタンドアロン環境とできるだけ同じ環境のDockerコンテナを立ち上げます。
今回は、CentOS7のコンテナを立ち上げます。
立ち上がったら、そのコンテナの中にアクセスしましょう。

$ docker run -itd --name centos7 centos:centos7
$ docker exec -it centos7 bash

2. Dockerコンテナでパッケージをダウンロード

まずはパッケージのダウンロード先となるディレクトリを作成します。

# mkdir standalone_install

作成したディレクトリに、スタンドアロン環境に必要なパッケージをまとめてダウンロードします。
今回は、gitiproute2(ネットワーク系のコマンド詰め合わせ)をまとめてダウンロードします。

--downloadonlyオプションを付けることで、インストールは行わないでダウンロードだけ実行することが可能です。

# yum install -y --downloadonly --downloaddir=standalone_install git iproute2

yum install --downloadonly --downloaddir=<directory> <package> 1

ダウンロードしたディレクトリの中を見ると、大量のrpmファイルが入っていることがわかります。

スクリーンショット 2020-02-13 19.01.37.png

3. ダウンロード先のフォルダをリポジトリとして作成する

リポジトリ作成のコマンドcreaterepoをインストールします。

# yum install -y createrepo

早速インストールしたcreaterepoコマンドを使用して、リポジトリを作成します。
ディレクトリを指定して実行するだけで、メタデータが作成されリポジトリとして機能するようになります。

# createrepo standalone_install

repodatacreaterepoコマンドによって作成されたメタデータです。
image.png

次の手順でスタンドアロン環境にファイルを移すので、必要であればファイル圧縮をしておきましょう。

4. 作成したリポジトリをスタンドアロン環境に移す

createrepoコマンドで作成したリポジトリのフォルダを、スタンドアロン環境に移動させます。
今回は、ちょっと面倒ですが以下の手順で移動させます。

  1. Dockerコンテナから抜ける
  2. DockerコンテナからローカルPCにフォルダをコピー
  3. ローカルPCからスタンドアロン環境にフォルダをコピー
# exit  ←コンテナから抜けます。Ctrl+DでもOKです。
$ docker cp centos7:/standalone_install/ ./
$ scp -r standalone_install standalone_ec2:/home/centos/

5. スタンドアロン環境でリポジトリの設定をする

残るはスタンドアロン環境での作業のみとなります。

.repoファイルを作成して、移したリポジトリを設定してあげます。
設定項目は以下になります。

項目名 設定項目
name リポジトリの名前
baseurl リポジトリの実体があるディレクトリのパス
gpgcheck グッピグチェック GPG署名を確認するか否か。 0=false,1=true
$ sudo vi /etc/yum.repo.d/standalone_install.repo
[standalone_repo]
name=standalone_repo
baseurl=file:///home/centos/standalone_install/
gpgcheck=0

file:////は3本です。

6. スタンドアロン環境でインストールする

--enablerepoオプションでリポジトリを指定して、パッケージをインストールします。
その際、外のリポジトリを探しに行かないように--disablerepo=*を設定しています。
--disablerepoオプションは、--enablerepoより前に設定する必要があります)

$ sudo yum install -y --disablerepo=* --enablerepo=standalone_repo git iproute2

検証環境(EC2)でもこの方法でインストールすることができました!
(この画像では全く証明になりませんが...笑)
スクリーンショット 2020-02-15 23.08.01.png

まとめ・おまけ

このインストール方法のキーポイントは、以下になります。

  • スタンドアロン環境と同じOS・バージョンのDockerコンテナを使用すること
  • --downloadonlyオプションを使ってrpmファイルをダウンロードすること
  • createrepoコマンドでリポジトリを作成すること
  • .repoファイルを作ってリポジトリを設定すること
  • --enablerepoでリポジトリを指定してインストールすること

記事の冒頭でも紹介しましたが、このインストール方法を自動実行するスクリプトを個人的に作成しました。
Readmeに利用方法を記載していますので、機会があれば利用してみてください。
https://github.com/hesma2/standalone_install

↓動作イメージ(手順1~3を1つのスクリプトで実行しています)
demo

参考

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

ApacheとTomcatを連携させる

はじめに

Tomcatのインストールと自動起動の設定の続きとして、Apache側で受け取ったHTTPリクエストをTomcatに投げる設定をまとめてみました。

使用した環境

  • OS
    • CentOS 7.7(1908)
  • Java(Amazon Corretto)
    • Java 1.8.0_242
  • Apache
    • Apache-2.4.6
  • Tomcat
    • Tomcat-9.0.30

Apacheのインストール

  • yumコマンドでインストールした後、バージョン情報を表示して正しくインストールされたことを確認しておきます。
[root@akagi ~]# yum install -y httpd
[root@akagi ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18

Apacheの自動起動の設定

  • systemctl enable...で自動起動の設定をして、その後に自動起動設定を確認しておきます。
[root@akagi ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@akagi ~]# systemctl list-unit-files -t service | grep httpd
httpd.service                                 enabled 

設定ファイルの編集

  • ここではhttpd.confを編集して、ApacheからTomcatへリバースプロキシでリクエストを投げる設定をします。

/etc/httpd/conf.modules.d/00-proxy.confの確認

  • /etc/httpd/conf.modules.d/00-proxy.confにはリバースプロキシに使われるモジュールの設定が記載されています。
  • mod_proxy.somod_proxy_ajp.soが記載されており、コメント行になっていないことを確認します。
    • 行頭が#だとコメント行になります。
  • mod_proxy_ajpを使うと、HTTPよりも効率の良いAJPというプロトコルを使ってTomcatと通信することができます。
    • かなり前はmod_jkmod_jk2というモジュールを使っていたと思うのですが、いつの間にか使用するモジュールが変わっていました...
00-proxy.conf
# This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so
...
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
...

httpd.confのバックアップ

  • httpd.confを編集する前に、オリジナルの状態でhttpd.confをバックアップしておきます。
[root@akagi ~]# cd /etc/httpd/conf/
[root@akagi conf]# cp -a httpd.conf httpd.conf.org

リバースプロキシの設定

  • ProxyPassおよびProxyPassReverseを以下の要領で設定します。
    • ProxyPass {リクエストパス} ajp://localhost:8009/{Javaアプリのコンテキスト名}
    • ProxyPassReverse {リクエストパス} ajp://localhost:8009/{Javaアプリのコンテキスト名}
  • ProxyPassとProxyPassReverseはいずれも「リクエストパスに来たリクエストを、アプリケーションサーバー(※ここではTomcat)に転送する」という役割を持ちますが、リダイレクトを使う場合はProxyPassReverseを設定しておく必要があります。
    • 以下の例では、リクエストがhttp://{サーバーのIP}/tomcat9/にマッチする場合、自ホスト(localhost)の8009番ポートのコンテキスト名/(※Tomcatの管理画面)に転送する設定となっています。
    • 参考URL:mod_proxy再入門 – ProxyPassとProxyPassReverse
/etc/httpd/conf/httpd.conf
# 以下をファイルの末尾に追記
ProxyPass /tomcat9/ ajp://localhost:8009/
ProxyPassReverse /tomcat9/ ajp://localhost:8009/
  • 例えば、Tomcat上で動作しているコンテキスト名がtestのアプリに対してリバースプロキシの設定をする場合は、以下のような設定になります。
    • tomcat9としている箇所は、任意の文字列に置き換え可能です。
/etc/httpd/conf/httpd.conf
# 以下をファイルの末尾に追記
ProxyPass /tomcat9/ ajp://localhost:8009/test/
ProxyPassReverse /tomcat9/ ajp://localhost:8009/test/

設定の反映

  • CentOS5系およびCentOS6系ではservice httpd gracefulを実行して、Apacheを強制的に再起動させるのではなく、設定値の反映だけをさせてきましたが、CentOS7系のApacheだとgracefulが使えません。
  • こちらの記事によると、reloadを使ってsystemctl reload httpdを実行すれば、従来のgracefulと同じ効果が得られるそうです。
[root@akagi ~]# systemctl reload httpd

動作の確認

  • 最後にhttp://{サーバーのIP}/tomcat9/にアクセスして、Tomcatの管理画面が見られることを確認します。

image.png

関連する作業

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

【Linuxコマンド】grep/awk/sortコマンドでプチデータ分析

はじめに

こちらは、
KPI 項目A:「ターミナル・コマンドに慣れる」項目A:「ターミナル・コマンドに慣れる」
のアウトプット記事です。

本編

今回はgrep awk sortを活用して、Linuxサーバ上でデータ処理を行いました。

準備

今回は検索及びテキスト処理を行うため、下記からサンプル用のCSVを取得しました。
公的統計を地域別にまとめてくれているのデータセットとのことです。
今回はヘッダー部分を削除してデータ部分のみを抽出し、Linuxサーバ上へ配置しました。

データ形式は下記のとおり。

地域コード 都道府県 市区町村 総人口 123個(中略) 保育所等在所児数
R01100 北海道 札幌市 1952356 ・・・ 25742

中略部分は適宜、下記の解説を参照します。

指定した都道府県データのみを抽出

ある都道府県のデータ(行)のみを抽出したい場合は、grepコマンドを用います。
Grepコマンドは、指定した文字列またはパターンが含まれているを表示するコマンドです。

"和歌山県"のデータのみをデータ抽出してみます。

# grep "検索する文字列" ファイル
grep "和歌山県" data/ssdse-2019a.csv

[test@srv1 testAwk]$ grep "和歌山県" data/ssdse-2019a.csv
R30201 和歌山県 和歌山市 364154 171215 192939 360592 169798 190794 44519 22757 21762 211753 102859 108894 105954 44446 61508 50822 19092 31730 2466 2727 4449 7627 7938 153089 152798 355502 91995 48369 37387 20594 22322 1819 727 20884 14726 16947 13 1228 1399 19 141 367 4438 339 1333 658 1751 1435 618 1554 108 1378 159 21 2628 14298 177281 326 10259 25874 1139 2240 11469 34092 5855 4467 4079 15176 6481 10411 25096 882 11457 7907 392 36138 140751 2173 1478 95.6 11.6 152643733 63453773 151658392 65642801 20551722 13750658 0 28 3665 54 1131 17614 25 688 10313 14 12329 162655 90595 72060 8131 5266 2865 132002 43765 88237 3023 37094 114600 1 2 373593 43481 3094 1519 55 34 443 235 1616 335 1172 58 6830
(以下省略)

一部のデータだけを抽出する

前で実行したコマンドをリダイレクトで使います。
今回は、転出者と転入者の情報から転入割合を求めてみます。

転出者と転入者の情報(2017年度)のみを抽出したいので、awkコマンドを用います。
awkコマンドは、指定の区切り文字で分割したデータを整形するコマンドです。

デフォルトは空白(" ")を区切り文字として分割します。
出力時は、"{print $1}"のように特定の項目を指定して出力可能です。

今回は出力する情報は転入者数,転出者数,転入者数-転出者数の3項目としました。
3つ目の出力では差分の計算結果を出力しています。

出力番号 データ列番号 項目名または数式 備考
1 3 市町村名
2 25 転入者数
3 26 転出者数
4 - 転入者数-転出者数 正数:転出者数以上の転入者数
負数:転入者数以上の転出者数
# awk -F'[区切り文字(複数可)]' '{awkコマンド}' file
[test@srv1 testAwk]$ grep "和歌山県" data/ssdse-2019a.csv | awk '{print $3,$25,$26,$25-$26}'
和歌山市 7627 7938 -311
海南市 1042 1324 -282
橋本市 1260 1560 -300
有田市 469 713 -244
御坊市 632 787 -155
田辺市 1691 2216 -525
新宮市 815 1068 -253
紀の川市 1278 1689 -411
岩出市 1720 1753 -33
紀美野町 154 225 -71
かつらぎ町 360 430 -70
九度山町 91 112 -21
高野町 88 168 -80
湯浅町 223 313 -90
広川町 142 202 -60
有田川町 611 593 18
美浜町 275 289 -14
日高町 260 239 21
由良町 99 169 -70
印南町 157 204 -47
みなべ町 196 345 -149
日高川町 270 289 -19
白浜町 691 749 -58
上富田町 636 510 126
すさみ町 101 123 -22
那智勝浦町 319 527 -208
太地町 107 127 -20
古座川町 74 66 8
北山村 24 18 6
串本町 430 584 -154

出力をソートする

また、前で実行したコマンドをリダイレクトで使います。

ソートする場合は、sortコマンドを用います。
sortコマンドは、指定の区切り文字で分割したデータをソートするコマンドです。
今回は以下のオプションを設定します。

オプション 引数 説明
-k 4 ソート基準となる項目番号
-n ソート基準を数値として比較する
-r 降順で表示する
[test@srv1 testAwk]$ grep "和歌山県" data/ssdse-2019a.csv | awk '{print $3,$25,$26,$25-$26}' | sort  -k 4 -n -r
上富田町 636 510 126
日高町 260 239 21
有田川町 611 593 18
古座川町 74 66 8
北山村 24 18 6
美浜町 275 289 -14
日高川町 270 289 -19
太地町 107 127 -20
九度山町 91 112 -21
すさみ町 101 123 -22
岩出市 1720 1753 -33
印南町 157 204 -47
白浜町 691 749 -58
広川町 142 202 -60
由良町 99 169 -70
かつらぎ町 360 430 -70
紀美野町 154 225 -71
高野町 88 168 -80
湯浅町 223 313 -90
みなべ町 196 345 -149
串本町 430 584 -154
御坊市 632 787 -155
那智勝浦町 319 527 -208
有田市 469 713 -244
新宮市 815 1068 -253
海南市 1042 1324 -282
橋本市 1260 1560 -300
和歌山市 7627 7938 -311
紀の川市 1278 1689 -411
田辺市 1691 2216 -525

結果

Linuxサーバ上で簡単なデータ処理が出来ました。
思ったより転出の方が多い。
上富田町が飛びぬけて増えている理由が知りたい。

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

Vagrant + Arch Linux で public_network または private_network を有効にすると vagrant up 時にエラーが出るときの対処法 → netctl をインストールする

解決手順

$ sudo pacman -S netctl --noconfirm
パッケージ netctl をインストールする。(--noconfirm: 確認なしで実行するオプション)

困っている状況

ゲストOS archlinux/archlinuxVagrantfile の次の行を有効にした状態で vagrant up するとエラーが出る。

例1:public_network 有効化

config.vm.network "public_network"

例2:private_network 有効化

config.vm.network "private_network", ip: "192.168.33.10"

例1のエラー内容

==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

# Configure eth1
mv '/tmp/vagrant-network-eth1-xxxxxxxxxx-x' '/etc/netctl/eth1' &&
ip link set 'eth1' down &&
netctl restart 'eth1' &&
netctl enable 'eth1'

Stdout from the command:



Stderr from the command:

mv: cannot move '/tmp/vagrant-network-eth1-xxxxxxxxxx-x' to '/etc/netctl/eth1': No such file or directory

エラーの意味と解消のメカニズム

mv: cannot move '/tmp/vagrant-network-eth1-xxxxxxxxxx-x' to '/etc/netctl/eth1'
/etc/netctl/eth1 というディレクトリが見つからないと怒られている。

これは netctl をインストールすることで生成されるディレクトリである。

ゲストOS の box archlinux/archlinuxnetctl を含んでいない。
sudo pacman -S netctl でインストールすることで解決する。

環境

  • ホストOS: Windows 10 Pro (version 1809)
  • ゲストOS: archlinux/archlinux (virtualbox, 2020.02.04)
  • VirtualBox バージョン 6.0.16 r135674 (Qt5.6.2)
  • Vagrant 2.2.7
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む