20190829のLinuxに関する記事は8件です。

Transparent Huge Pageの無効化

THP(Transparent Huge Page)とは

THPはOSが動的にHugePageを割り当てる機能。

ページとは

メモリは、ページという単位で管理を行う。
1ページの容量は4KBとなる。

HugePageとは

HugePageは、通常のページに比べて大きな容量を持つページ。
HugePageの1ページの容量は2MB。

HugePageを利用するメリットとして、

1ページの容量が大きいので、ページ数を削減される
→ ページ表エントリへのアクセスする回数が減る
→ 性能向上を図ることが可能となる。


THP(Transparent Huge Page)とは

THPはOSが動的にHugePageを割り当てる機能。

THPではOSにより自動的に大規模ページが、
プロセスに割り当てられるため、大規模ページは手動で予約する必要がない

Huge page サイズは下記で確認可能

$ cat /proc/meminfo | grep "Hugepagesize"
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled

redis.log

# WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. 

This will create latency and memory usage issues with Redis. 

To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. 

Redis must be restarted after THP is disabled.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10でLinux仮想環境構築(VirtualBox + Vagrant)

Windows環境にて、自然言語処理および機械学習のため、
Linux開発環境が必要となり、それが一通り形となったので忘備録としてまとめます。

この記事の対象者

  • Windowsユーザー
  • Linuxの開発環境が必要
  • GCPやAWSでLinuxを使用する前に、同一環境をLocalで仮想化したい。

環境

  • ホストOS:Windows10 Pro 32bit , 64bit
  • ゲストOS:Ubuntu-18.04
  • VirtualBox:5.2.32
  • Vagrant:2.2.5

VirtualBoxをインストール

https://www.virtualbox.org/wiki/Download_Old_Builds_5_2

「Windows hosts」からダウンロード

VirtualBox 6.0.10がリリースされていますが、本記事では安定稼働している5.2ビルドを使用します。

Vagrantをインストール

https://www.vagrantup.com/downloads.html

「Windows」>「32-bit | 64bit」からインストーラーをダウンロード

現行の最新版「2.2.5」を使用しています。(2019年8月29日時点)

Vagrantについて

こちらの記事が非常に参考になります。
https://qiita.com/ozawan/items/160728f7c6b10c73b97e

Vagrantの事前設定

好きな場所にフォルダを作成し、Vagrantfile(起動用ファイル)を作成します。
今回はCドライブ直下に、Vagrant専用のフォルダを作成します。

# Cドライブ直下にフォルダ作成
cd C://
mkdir Vagrant
cd Vagrant
# インスタンス起動用フォルダを作成
mkdir instance1
cd instance1
# 共有フォルダ作成
mkdir workspace
# Vagrantfile作成
vagrant init

VagrantのboxのGuest Additionsの自動アップデートをしてくれるライブラリをインストールします。

cd instance1
vagrant plugin install vagrant-vbguest

こちらの記事を参照
https://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85

Proxy環境で作業する際、必要となるライブラリをインストールします。(Proxy環境のみ)

cd instance1
vagrant plugin install vagrant-proxyconf

こちらの記事を参照
https://qiita.com/kota344/items/304979feaf965afffb1a

仮想環境の作成

initコマンドにより、Vagrantfileが作成されたので
以下の内容で上書きします。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  # プロキシ設定(プロキシ環境のみ)
  if Vagrant.has_plugin?("vagrant-proxyconf")
      puts '- Proxy Setting ----------------------------------'
      config.proxy.http     = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/"
      config.proxy.https    = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/"
      config.proxy.no_proxy = "localhost,127.0.0.1"
      puts '--------------------------------------------------'
  end

  config.vm.box = "bento/ubuntu-18.04"
  config.vm.network "forwarded_port", guest: 8888, host: 8888

  config.vm.provider :virtualbox do |vb|
    vb.customize [
      "modifyvm", :id,
      "--memory", "4096",
      "--vram", "256",
      "--clipboard", "bidirectional",
      "--accelerate3d", "on",
      "--hwvirtex", "on",
      "--nestedpaging", "on",
      "--largepages", "on",
      "--ioapic", "on",
      "--pae", "on",
      "--paravirtprovider", "kvm",
    ]
  end

  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "C:\\Vagrant\\instance1", "C:\\Vagrant\\instance1\\workspace"
  # 初期構築スクリプト
  config.vm.provision :shell, :inline => <<-EOS
    # Ubuntuの最新パッケージ情報を取得
    sudo apt update -y
    # apt-getをアップデート
    sudo apt-get upgrade -y
    # Ubuntuの日本語環境をインストール
    sudo apt-get install ubuntu-defaults-ja -y

    # タイムゾーンを日本時間に変更
    sudo timedatectl set-timezone Asia/Tokyo
    # デフォルトのエディタを nano から vim に変更
    sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic')

  EOS

end

プロキシの設定

{user}{password}{proxy_ip_or_domain}{proxy_port}などは適宜環境に応じて書き換えてください。
もしプロキシ環境でない場合は、以下の部分は不要ですので削除します。

  # プロキシ設定(プロキシ環境のみ)
  if Vagrant.has_plugin?("vagrant-proxyconf")
      puts '- Proxy Setting ----------------------------------'
      config.proxy.http     = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/"
      config.proxy.https    = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/"
      config.proxy.no_proxy = "localhost,127.0.0.1"
      puts '--------------------------------------------------'
  end

インストールするOSの設定

仮想環境にインストールしたいOSのVagrant Boxを設定します。
インストールできるOSは、こちらのサイトから探せます。
https://app.vagrantup.com/

  config.vm.box = "bento/ubuntu-18.04"

今回は、ubuntu18.04を使用していきます。

仮にawslinuxをインストールしたい場合は、「config.vm.box = 」以降を以下のURL先の通りに書き換えればOKです。
https://app.vagrantup.com/mvbcoding/boxes/awslinux

フォワードポートの設定

以下の設定をしておくと、仮想環境(ゲストOS)の8888ポートにてJupyter notebookなどでサーバーを立てて接続待ちしている際、ホスト側からブラウザなどで「http://localhost:8888 」と入力することで、仮想環境にアクセスできます。

  config.vm.network "forwarded_port", guest: 8888, host: 8888

ゲストOSからnode.jsなどでサーバーを立てて、ホスト側からアクセスしたいときなどもこの設定が使えるようです。

Vagrantのネットワークの詳しいイメージとしては、こちらの記事がわかりやすかったです。
https://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11

仮想環境に割り当てるリソースについて

割り当てるメモリーなどは、以下のように設定できます。

  config.vm.provider :virtualbox do |vb|
    vb.customize [
      "modifyvm", :id,
      "--memory", "4096",
      "--vram", "256",
      "--clipboard", "bidirectional",
      "--accelerate3d", "on",
      "--hwvirtex", "on",
      "--nestedpaging", "on",
      "--largepages", "on",
      "--ioapic", "on",
      "--pae", "on",
      "--paravirtprovider", "kvm",
    ]
  end

メモリーは環境に応じて使える容量も変わってくるので、環境に応じて割り当てを調整してください。
本記事では4GB割り当てています。

      "--memory", "4096",

仮想環境のIP設定

仮想環境のIPアドレスです。ホスト側から仮想環境に、ssh接続をする際に使用します。

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

共有フォルダの設定

共有フォルダに設定します。以下の設定をすることで仮想環境からworkspaceフォルダを参照することができます

  config.vm.synced_folder "C:\\Vagrant\\instance1", "C:\\Vagrant\\instance1\\workspace"

参考:https://qiita.com/tbpgr/items/67125ea883409ae5fd51

初期構築スクリプト

初回のインストールのみ起動するスクリプトです。Ubuntu日本語化やタイムゾーンの設定、apt-getなどのアップデートをバッチ処理で実行できます。
Ubuntu以外のOSで実行する場合は、必要に応じて書き換えてください。

  # 初期構築スクリプト
  config.vm.provision :shell, :inline => <<-EOS
    # Ubuntuの最新パッケージ情報を取得
    sudo apt update -y
    # apt-getをアップデート
    sudo apt-get upgrade -y
    # Ubuntuの日本語環境をインストール
    sudo apt-get install ubuntu-defaults-ja -y

    # タイムゾーンを日本時間に変更
    sudo timedatectl set-timezone Asia/Tokyo
    # デフォルトのエディタを nano から vim に変更
    sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic')

  EOS

インスタンスの起動、再起動、終了

vagrantflieがあるフォルダで、以下のコマンドを入力すると仮想環境が起動します。

インスタンスの起動

vagrant up

再起動

vagrantfileの書き換えた内容を設定を反映する際によく使います

vagrant reload

インスタンスの終了

vagrant halt

インスタンスの終了はVirtualBoxのGUIからもできます。

注意事項

①VirtualBoxのGUIからインスタンスを起動せず、 かならず「vagrant up」「vagrant reload」で起動すること。

Vagrantの仕様上、「vagrant up」(起動)もしくは「vagrant reload」(再起動)で仮想環境を起動したときのみ、
Vagrantfileの設定が反映されます。

②仮想環境の設定は、かならずVagrantfileで行うこと。

Vagrantで仮想環境を起動した際、すべてVagrantfileの設定で上書きされます。
なので、Vagrantを使用する際、VirtualBoxのGUIから設定しないほうが無難です。

インスタンスへの接続

vagrantflieがあるフォルダで、以下のコマンドを入力すると仮想環境にssh接続できます。
※初回起動は時間がかかるので、すべての処理が終わってから接続すること

vagrant ssh

ちなみに、筆者は「TeraTerm」を利用してssh接続しています。
ホストは「192.168.33.10」(「config.vm.network "private_network"」で設定したIPアドレス)
VagrantでインストールしたOSのユーザーとパスワードは、デフォルトでは「vagrant」です。
秘密鍵は「C:\Vagrant\instance1\.vagrant\machines\default\virtualbox\private_key」にあります。
他は初期設定のままで使えます。

動作確認

ssh接続後、vagrant@vagrantフォルダに接続されますので、以下のコマンドを入力して共有フォルダが認識されているかを確認します。

cd C\:\\Vagrant\\instance1\\workspace/workspace/
touch test.txt

「cd C」と入力した時点でTabキーを押せば、予測変換でフォルダ名が出てきます。
touchで新規作成したtest.txtを、Windows(ゲストOS)から確認できれば環境構築は終了です。

以上

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

windows10でLinux仮想環境構築

Windows環境にて、自然言語処理および機械学習のため、
Linux開発環境が必要となり、それが一通り形となったので忘備録としてまとめます。

この記事の対象者

  • Windowsユーザー
  • Linuxの開発環境が必要
  • GCPやAWSでLinuxを使用する前に、同一環境をLocalで仮想化したい。

環境

  • ホストOS:Windows10 Pro 32bit , 64bit
  • ゲストOS:Ubuntu-18.04
  • VirtualBox:5.2.32
  • Vagrant:2.2.5

VirtualBoxをインストール

https://www.virtualbox.org/wiki/Download_Old_Builds_5_2

「Windows hosts」からダウンロード

VirtualBox 6.0.10がリリースされていますが、本記事では安定稼働している5.2ビルドを使用します。

Vagrantをインストール

https://www.vagrantup.com/downloads.html

「Windows」>「32-bit | 64bit」からインストーラーをダウンロード

現行の最新版「2.2.5」を使用しています。(2019年8月29日時点)

Vagrantについて

こちらの記事が非常に参考になります。
https://qiita.com/ozawan/items/160728f7c6b10c73b97e

Vagrantの事前設定

好きな場所にフォルダを作成し、Vagrantfile(起動用ファイル)を作成します。
今回はCドライブ直下に、Vagrant専用のフォルダを作成します。

# Cドライブ直下にフォルダ作成
cd C://
mkdir Vagrant
cd Vagrant
# インスタンス起動用フォルダを作成
mkdir instance1
cd instance1
# 共有フォルダ作成
mkdir workspace
# Vagrantfile作成
vagrant init

VagrantのboxのGuest Additionsの自動アップデートをしてくれるライブラリをインストールします。

cd instance1
vagrant plugin install vagrant-vbguest

こちらの記事を参照
https://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85

Proxy環境で作業する際、必要となるライブラリをインストールします。(Proxy環境のみ)

cd instance1
vagrant plugin install vagrant-proxyconf

こちらの記事を参照
https://qiita.com/kota344/items/304979feaf965afffb1a

仮想環境の作成

initコマンドにより、Vagrantfileが作成されたので
以下の内容で上書きします。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  # プロキシ設定(プロキシ環境のみ)
  if Vagrant.has_plugin?("vagrant-proxyconf")
      puts '- Proxy Setting ----------------------------------'
      config.proxy.http     = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/"
      config.proxy.https    = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/"
      config.proxy.no_proxy = "localhost,127.0.0.1"
      puts '--------------------------------------------------'
  end

  config.vm.box = "bento/ubuntu-18.04"
  config.vm.network "forwarded_port", guest: 8888, host: 8888

  config.vm.provider :virtualbox do |vb|
    vb.customize [
      "modifyvm", :id,
      "--memory", "4096",
      "--vram", "256",
      "--clipboard", "bidirectional",
      "--accelerate3d", "on",
      "--hwvirtex", "on",
      "--nestedpaging", "on",
      "--largepages", "on",
      "--ioapic", "on",
      "--pae", "on",
      "--paravirtprovider", "kvm",
    ]
  end

  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "C:\\Vagrant\\instance1", "C:\\Vagrant\\instance1\\workspace"
  # 初期構築スクリプト
  config.vm.provision :shell, :inline => <<-EOS
    # Ubuntuの最新パッケージ情報を取得
    sudo apt update -y
    # apt-getをアップデート
    sudo apt-get upgrade -y
    # Ubuntuの日本語環境をインストール
    sudo apt-get install ubuntu-defaults-ja -y

    # タイムゾーンを日本時間に変更
    sudo timedatectl set-timezone Asia/Tokyo
    # デフォルトのエディタを nano から vim に変更
    sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic')

  EOS

end

プロキシの設定

{user}{password}{proxy_ip_or_domain}{proxy_port}などは適宜環境に応じて書き換えてください。
もしプロキシ環境でない場合は、以下の部分は不要ですので削除します。

  # プロキシ設定(プロキシ環境のみ)
  if Vagrant.has_plugin?("vagrant-proxyconf")
      puts '- Proxy Setting ----------------------------------'
      config.proxy.http     = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/"
      config.proxy.https    = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/"
      config.proxy.no_proxy = "localhost,127.0.0.1"
      puts '--------------------------------------------------'
  end

インストールするOSの設定

仮想環境にインストールしたいOSのVagrant Boxを設定します。
インストールできるOSは、こちらのサイトから探せます。
https://app.vagrantup.com/

  config.vm.box = "bento/ubuntu-18.04"

今回は、ubuntu18.04を使用していきます。

仮にawslinuxをインストールしたい場合は、「config.vm.box = 」以降を以下のURL先の通りに書き換えればOKです。
https://app.vagrantup.com/mvbcoding/boxes/awslinux

フォワードポートの設定

以下の設定をしておくと、仮想環境(ゲストOS)の8888ポートにてJupyter notebookなどでサーバーを立てて接続待ちしている際、ホスト側からブラウザなどで「http://localhost:8888 」と入力することで、仮想環境にアクセスできます。

  config.vm.network "forwarded_port", guest: 8888, host: 8888

ゲストOSからnode.jsなどでサーバーを立てて、ホスト側からアクセスしたいときなどもこの設定が使えるようです。

Vagrantのネットワークの詳しいイメージとしては、こちらの記事がわかりやすかったです。
https://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11

仮想環境に割り当てるリソースについて

割り当てるメモリーなどは、以下のように設定できます。

  config.vm.provider :virtualbox do |vb|
    vb.customize [
      "modifyvm", :id,
      "--memory", "4096",
      "--vram", "256",
      "--clipboard", "bidirectional",
      "--accelerate3d", "on",
      "--hwvirtex", "on",
      "--nestedpaging", "on",
      "--largepages", "on",
      "--ioapic", "on",
      "--pae", "on",
      "--paravirtprovider", "kvm",
    ]
  end

メモリーは環境に応じて使える容量も変わってくるので、環境に応じて割り当てを調整してください。
本記事では4GB割り当てています。

      "--memory", "4096",

仮想環境のIP設定

仮想環境のIPアドレスです。ホスト側から仮想環境に、ssh接続をする際に使用します。

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

共有フォルダの設定

共有フォルダに設定します。以下の設定をすることで仮想環境からworkspaceフォルダを参照することができます

  config.vm.synced_folder "C:\\Vagrant\\instance1", "C:\\Vagrant\\instance1\\workspace"

参考:https://qiita.com/tbpgr/items/67125ea883409ae5fd51

初期構築スクリプト

初回のインストールのみ起動するスクリプトです。Ubuntu日本語化やタイムゾーンの設定、apt-getなどのアップデートをバッチ処理で実行できます。
Ubuntu以外のOSで実行する場合は、必要に応じて書き換えてください。

  # 初期構築スクリプト
  config.vm.provision :shell, :inline => <<-EOS
    # Ubuntuの最新パッケージ情報を取得
    sudo apt update -y
    # apt-getをアップデート
    sudo apt-get upgrade -y
    # Ubuntuの日本語環境をインストール
    sudo apt-get install ubuntu-defaults-ja -y

    # タイムゾーンを日本時間に変更
    sudo timedatectl set-timezone Asia/Tokyo
    # デフォルトのエディタを nano から vim に変更
    sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic')

  EOS

インスタンスの起動、再起動、終了

vagrantflieがあるフォルダで、以下のコマンドを入力すると仮想環境が起動します。

インスタンスの起動

vagrant up

再起動

vagrantfileの書き換えた内容を設定を反映する際によく使います

vagrant reload

インスタンスの終了

vagrant halt

インスタンスの終了はVirtualBoxのGUIからもできます。

注意事項

①VirtualBoxのGUIからインスタンスを起動せず、 かならず「vagrant up」「vagrant reload」で起動すること。

Vagrantの仕様上、「vagrant up」(起動)もしくは「vagrant reload」(再起動)で仮想環境を起動したときのみ、
Vagrantfileの設定が反映されます。

②仮想環境の設定は、かならずVagrantfileで行うこと。

Vagrantで仮想環境を起動した際、すべてVagrantfileの設定で上書きされます。
なので、Vagrantを使用する際、VirtualBoxのGUIから設定しないほうが無難です。

インスタンスへの接続

vagrantflieがあるフォルダで、以下のコマンドを入力すると仮想環境にssh接続できます。
※初回起動は時間がかかるので、すべての処理が終わってから接続すること

vagrant ssh

ちなみに、筆者は「TeraTerm」を利用してssh接続しています。
ホストは「192.168.33.10」。(「config.vm.network "private_network"」で設定したIPアドレス)
VagrantでインストールしたOSのユーザーとパスワードは、デフォルトでは「vagrant」です。
秘密鍵は「C:\Vagrant\instance1.vagrant\machines\default\virtualbox\private_key」にあります。
他は初期設定のままで使えます。

動作確認

ssh接続後、vagrant@vagrantフォルダに接続されますので、以下のコマンドを入力して共有フォルダが認識されているかを確認します。

cd C\:\\Vagrant\\instance1\\workspace/workspace/
touch test.txt

「cd C」と入力した時点でTabキーを押せば、予測変換でフォルダ名が出てきます。
touchで新規作成したtest.txtを、Windows(ゲストOS)から確認できれば環境構築は終了です。

おまけ

pipをインストール

# pipをインストール
sudo apt-get install python3-pip

pipenvをインストール

sudo pip3 install pipenv

pipenv プロジェクトを作成

#プロジェクト作成
mkdir py_project
cd py_project
# パッケージのインストール
# lockファイルは頻繁にタイムアウトの原因になるので断腸の思いでskip
pipenv install pandas numpy matplotlib --skip-lock 
# 仮想環境を開く
pipenv shell

pipenv仮想環境を削除

cd py_project
pipenv --rm

pipenvのコマンド 参考
https://qiita.com/RW_876/items/ce42026884f1383e21da

以上

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

PATHを通すの意味を理解する

-

環境構築などでよく出てくる「PATHを通す」。
なんとなくコピペでやっていたがいつのまにかごちゃごちゃに。
しばらく環境構築でハマってるので、「まあ動いたからいいや」ではなくある程度理解できるまで学んでみる。

こちらの記事が大変参考になります。pathのことを理解してない人は本記事を読むよりこちらを読んだ方がためになります:raised_hands_tone2:

押さえどころ

「PATHを通す」の意味に関しては3つ重要なところを押さえておけば理解できる。

  • 環境変数
  • 設定ファイル
  • PATH

その1 -環境変数-

環境変数とはコンピューターが持っている変数。
名前から拒絶感があるがこれは避けては通れない。
じゃあ具体的に環境変数とは何か

例えばこれは変数

A = "AppleのA"
B = "BananaのB"
C = "ChocolateのC"

変数Aをコンピューターで使いたい!っていう時にコンピューターに環境変数として登録すれば変数Aを参照できる。
このコンピューターに登録した変数が環境変数。

その2 -設定ファイル-

次は環境変数をコンピューターに登録する方法。
まずコンソールで登録する場合はこんな感じ

$ export A="AppleのA"

export A="AppleのAでEnterを押しても何も出てこない。
環境変数に登録されているか見てみる。
確認方法は

$ printenv
A=りんごのA
...
...
...

または

$ echo $A
AppleのA

ちゃんと登録されている。
printenvは一覧で表示してくれる。

exportで登録し
printenvで一覧表示し
echoで変数を確認する。

別に難しいことではない。
ただ、コンソールを閉じると登録した変数が消えてしまう。
そこで永続的に保存するために設定ファイルに書く。
設定ファイルは

.bash_profile
.bashrc
のどちらかに書く。

*この二つがわからなくて両方に書いていた、、

.bash_profile

ログイン時に1回、実行される
具体的な用途は
- 環境変数を設定する(export する変数)

.bashrc

シェル起動時に1回、実行される。
具体的な用途は
- 環境変数でない変数を設定する (export しない変数)
- エイリアスを定義する
- シェル関数を定義する
- コマンドライン補完の設定をする

ここら辺はまた別記事に詳しく書いていく。
今回は環境変数を設定してPathを通すので.bash_profile

コンソールで.bash_profileを開く
$vi .bash_profile
*vimの使い方は別記事で書くかわからないのでこちらの記事を参考に

.bash_profileを開いたらコードを書く。

export A="AppleのA"

コンソールで確認

echo $A

しかし何も表示されない。

.bash_profileを書き込んだあとはsourceコマンドで実行していく。

source コマンドは実は、環境をリロードするためのものではない。
ファイルに書かれた内容を 忠実にコマンドとして実行していくものなのだ。

$source .bash_profile

もう一度確認

$echo $A
りんごのA

これで環境変数を永続的に設定できるようになった。

その3 -PATH-

ここまできたら「PATHを通す」の意味をすぐ理解できる。

重要なのがPATHも環境変数の一部ということ
printenvで確認するとその中にPATHも入っていることがわかる。

PATHには

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

こんな感じで値が入っていて:で区切られている。
見やすくするとこんな感じ。

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

移動してみる。

$ cd usr/bin

するとよく使っているcdコマンドだったりgitコマンドだったりが置かれている。
gitコマンドを使うたびにわざわざgitを操作するプログラムが置かれているusr/binまで行ってコマンドを実行するのはとんでもなく面倒臭い。

そこでPATHを通して経路を作り自分がどのディレクトリにいようともプログラム名だけで実行できるようにすることがPathを通すということ。

PATHが通っているからホーム画面にいてもcdコマンドが使えるしわざわざプログラムが置いてある場所に行かなくてもよくなる。

実際に環境変数を設定してPATHを通してみる。
Pythonのバージョン管理、複数のバージョンを使い分けるコマンドラインツール、pyenvにPATHを通す。
-> デフォルトシェルでPython3系を使いたい! → pyenvを使ってみる

まずコンソールでpyenvにPATHが通っている確認

$ pyenv version
pyenv: command not found

当然PATHが通っていないからそんなコマンドはないよと言われる。

.bash_profileを開き登録する

export PYENV_ROOT="\$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:\$PATH"

\$マークは環境変数を参照している。
\$HOMEはホームディレクトリを指す。
この場合は環境変数PYENV_ROOTを設定し環境変数PATHの前に追加して上書きしている。

sourceを実行

$ source .bash_profile

確認

$ pyenv version
3.7.0 (set by /Users/kazuppp/.pyenv/version)

PATHが通った!

まとめ

  • 環境変数はコンピューターが使える変数。
  • 環境変数を登録しても設定ファイルに記述しないとコンソールを閉じた時に使えないので設定ファイルに書き永続化させる。
  • 設定した環境変数をPATHに追加し上書きすることでPATHが通る。
  • PATHは経路を作りプログラム名だけでプログラムを実行できる。

*環境変数を登録すると書いているが環境変数を設定するの方が正しいかもしれない。

参考記事

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

Linuxユーザーが最もシンプルにラズパイ起動SDカードを作る方法

はじめに

ラズパイ起動方法は公式サイトにも詳しく載っていますし、いろいろな本やWebサイトでたくさん紹介されています。
ところが、最も簡単と言われているNOOBSは実はSDカードとの相性問題があってうまく起動しない場合があったりします。
それならばとSDカードにraspbianの起動イメージを書き込もうと思っても、多くのツールはWindows向けだったり、Linuxでは導入が面倒だったりします。
結局、Linuxユーザーはコマンドラインでやるのが一番確実で早いと感じたので手順をメモしておきます。

環境

  • ホストPC:Ubuntu 18.04.2
  • Raspberry Pi 2 Model B
  • Raspbian Buster (Release date:2019-07-10)

Raspbianを入手

公式サイトからdesktop and recommended softwareをダウンロード。
その気になればwgetとかのコマンドでできますが、最新バージョンを確認しつつダウンロードするにはブラウザでやったほうが早いので、意地を張らずにブラウザでダウンロードします。

SHAが一致することを確認

以前、ダウンロード時にデータが狂っていたのが原因でOSが起動しなかったことがありました。
そのときは原因特定に1日かかりました。。。SHA確認大事です。エラーは起きるものです。

$ sha256sum 2019-07-10-raspbian-buster-full.zip 
2bd0613ec8739b6fa4274ea186ec859046f79e6aee4b8c6af0acb6d88f3f533a  2019-07-10-raspbian-buster-full.zip

SDカードのデバイス名を確認

ダウンロードしたイメージを書き込むために、ホストPCでSDカードがどのように認識されているかを確認します。
SDカード挿入前と挿入後にlsbskを実行します。挿入後に増えた項目がSDカードのデバイスを指しています。
下記の例でパーティションが別れているのは、このSDカードを以前にもラズパイに使っていたからです。

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
---略---
mmcblk0     179:0    0  14.5G  0 disk 
├─mmcblk0p1 179:1    0  43.2M  0 part /media/***/boot
└─mmcblk0p2 179:2    0  14.4G  0 part /media/***/rootfs

パーティションがマウントされている場合は、アンマウントします。

$ umount /media/***/boot
$ umount /media/***/rootfs

こんな感じになります。

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
---略---
mmcblk0     179:0    0  14.5G  0 disk 
├─mmcblk0p1 179:1    0  43.2M  0 part 
└─mmcblk0p2 179:2    0  14.4G  0 part 

SDカードに書き込む

zipファイル展開とSDカードへの書き込みをまとめて行います。ofオプションに、上で調べたSDカードのデバイス名を指定します。
結構時間かかるので気長に待ちます。

$ unzip -p 2019-07-10-raspbian-buster-full.zip | sudo dd of=/dev/mmcblk0 conv=fsync
12566528+0 レコード入力
12566528+0 レコード出力
6434062336 bytes (6.4 GB, 6.0 GiB) copied, 1369.22 s, 4.7 MB/s

まとめ

これでラズパイOSイメージをSDカードに書き込むことができました。あとはSDカードをラズパイに挿して電源を入れ、画面に従ってラズビアンの初期設定をすればOKです。

ラズパイに限らず、初心者でも簡単に扱えるようにいろいろな便利ツールが用意されています。もちろんそれのおかげでとても楽ができることも多いですが、どこかで躓いてしまうと何が原因なのかさっぱりわからなくなってしまいますね。そんな時はエンジニアたるもの初心に戻ってコマンドラインで地道にやるのが、結局は一番の近道になることもありますね。

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

Linuxユーザーがラズパイ起動SDカードを作る最もシンプルな方法

はじめに

ラズパイ起動方法は公式サイトにも詳しく載っていますし、いろいろな本やWebサイトでたくさん紹介されています。
ところが、最も簡単と言われているNOOBSは実はSDカードとの相性問題があってうまく起動しない場合があったりします。
それならばとSDカードにraspbianの起動イメージを書き込もうと思っても、多くのツールはWindows向けだったり、Linuxでは導入が面倒だったりします。
結局、Linuxユーザーはコマンドラインでやるのが一番確実で早いと感じたので手順をメモしておきます。

環境

  • ホストPC:Ubuntu 18.04.2
  • Raspberry Pi 2 Model B
  • Raspbian Buster (Release date:2019-07-10)

Raspbianを入手

公式サイトからdesktop and recommended softwareをダウンロード。
その気になればwgetとかのコマンドでできますが、最新バージョンを確認しつつダウンロードするにはブラウザでやったほうが早いので、意地を張らずにブラウザでダウンロードします。

SHAが一致することを確認

以前、ダウンロード時にデータが狂っていたのが原因でOSが起動しなかったことがありました。
そのときは原因特定に1日かかりました。。。SHA確認大事です。エラーは起きるものです。

$ sha256sum 2019-07-10-raspbian-buster-full.zip 
2bd0613ec8739b6fa4274ea186ec859046f79e6aee4b8c6af0acb6d88f3f533a  2019-07-10-raspbian-buster-full.zip

SDカードのデバイス名を確認

ダウンロードしたイメージを書き込むために、ホストPCでSDカードがどのように認識されているかを確認します。
SDカード挿入前と挿入後にlsbskを実行します。挿入後に増えた項目がSDカードのデバイスを指しています。
下記の例でパーティションが別れているのは、このSDカードを以前にもラズパイに使っていたからです。

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
---略---
mmcblk0     179:0    0  14.5G  0 disk 
├─mmcblk0p1 179:1    0  43.2M  0 part /media/***/boot
└─mmcblk0p2 179:2    0  14.4G  0 part /media/***/rootfs

パーティションがマウントされている場合は、アンマウントします。

$ umount /media/***/boot
$ umount /media/***/rootfs

こんな感じになります。

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
---略---
mmcblk0     179:0    0  14.5G  0 disk 
├─mmcblk0p1 179:1    0  43.2M  0 part 
└─mmcblk0p2 179:2    0  14.4G  0 part 

SDカードに書き込む

zipファイル展開とSDカードへの書き込みをまとめて行います。ofオプションに、上で調べたSDカードのデバイス名を指定します。
結構時間かかるので気長に待ちます。

$ unzip -p 2019-07-10-raspbian-buster-full.zip | sudo dd of=/dev/mmcblk0 conv=fsync
12566528+0 レコード入力
12566528+0 レコード出力
6434062336 bytes (6.4 GB, 6.0 GiB) copied, 1369.22 s, 4.7 MB/s

まとめ

これでラズパイOSイメージをSDカードに書き込むことができました。あとはSDカードをラズパイに挿して電源を入れ、画面に従ってラズビアンの初期設定をすればOKです。

ラズパイに限らず、初心者でも簡単に扱えるようにいろいろな便利ツールが用意されています。もちろんそれのおかげでとても楽ができることも多いですが、どこかで躓いてしまうと何が原因なのかさっぱりわからなくなってしまいますね。そんな時はエンジニアたるもの初心に戻ってコマンドラインで地道にやるのが、結局は一番の近道になることもありますね。

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

Ubunru Server 2台間でファイル同期(lsyncd + rsync + sshd)

背景

2台のLinuxサーバーでファイル同期させて冗長化やバックアップに利用するメモです。

動作環境

  • OS:Ubunru Server 16.04LTS
  • OS:Ubunru Server 18.04LTS
  • sshd
  • rsync
  • lsyncd

同期設定のポリシー

2台のサーバー間を双方向で同期する方法と、バックアップの様に片側同期する方法があります。
今回は後者の片側同期に設定します。
双方向同期の場合はファイル削除時の動作を設計時に考慮しないと思わぬデータ消失に繋がり注意が必要です。

rsyncサービスデーモン(rsyncd)

ネットで検索するとrsyncdを使用するページが出てきますが、その場合はサービスポートTCP 873番を経由します。
しかし昔ながらのIPアドレス範囲をallow/denyで制限したり、暗号化無しの平文パスワード利用と今時のセキュリティ的にはよくありません。
閉域網のセキュリティが確保された内部のサブネットで、転送速度のパフォーマンス重視の場合などで検討しましょう。今回は使用しません。

rsyncコマンドをsshd経由で暗号化して公開鍵認証した安全な経路が利用できますので、外部のインターネット経由したサーバー間でも安全な同期が可能です。
sshサービスデーモン(sshd)経由を利用するので一般的なsshd設定が利用可能です。

sshユーザー設定

各サーバーに適当なアカウント「rsync」を作成します。

各サーバー共通
$ sudo adduser rsync

sudoグループに追加します。

各サーバー共通
$ sudo gpasswd -a rsync sudo

「rsync」ユーザーに切り替えてパスフレーズ無しのssh鍵ペアを作成します。
コメントの-Cオプションにサーバーホスト名も付けておくと区別し易いね。

サーバー1(node1)側
$ su rsync
$ ssh-keygen -t ed25519 -C "rsync@node1" -N ""
サーバー2(node2)側
$ su rsync
$ ssh-keygen -t ed25519 -C "rsync@node2" -N ""

ssh鍵を互いのサーバーへ登録します。
方法は色々ありますがssh-copy-idコマンドが簡単。

サーバー1(node1)側
$ ssh-copy-id -i .ssh/id_ed25519 rsync@node2
サーバー2(node2)側
$ ssh-copy-id -i .ssh/id_ed25519 rsync@node1

実際にパスフレーズ無しの公開鍵認証で接続出来るか、互いのサーバーで確認します。

サーバー1(node1)側
$ ssh -i .ssh/id_ed25519 rsync@node2
サーバー2(node2)側
$ ssh -i .ssh/id_ed25519 rsync@node1

rsyncコマンドをsudo経由でパスワード入力無しで実行する設定(サーバー2 node2側)

サーバー2(node2)側
$ sudo visudo
/etc/sudoers
rsync ALL=(ALL) NOPASSWD: /usr/bin/rsync

パスフレーズ無しのssh鍵であってもsudoコマンド実行時にはアカウントのパスワード入力を要求されますので、特定コマンド(この場合はrsync)だけパスワード要求を無効化します。
これでrsyncコマンドをsudo経由で実行出来るので、ファイルの書き換え時にパーミッション制限でのエラーを回避出来ます。

lsyncサービスデーモン(lsyncd)設定

同期元サーバー1(node1)側へインストールして設定する。ちなみに双方向で同期する場合は両方へインストールします。

サーバー1(node1)側
$ sudo apt-get install lsyncd

設定ファイルを作成します。
サンプルファイルが、「/usr/share/doc/lsyncd/examples/lsyncd.conf.lua」とかにありますので参考に。

/etc/lsyncd/lsyncd.conf.lua
settings = {
        logfile = "/var/log/lsyncd.log",
        statusFile = "/tmp/lsyncd.stat",
        insist = 1,
        statusInterval = 10
}

sync_base = {
        default.rsync,
        delete = running,
        init = false,
        rsync = {
          archive = true,
          rsync_path = "sudo /usr/bin/rsync",
          rsh = "/usr/bin/ssh -i /home/rsync/.ssh/id_ed25519 -o StrictHostKeyChecking=no"
        }
}

sync{ sync_base, source="/home/rsync/test1/", target="rsync@node2:/home/rsync/test1/"}
sync{ sync_base, source="/etc/test2/", target="rsync@node2:/etc/test2/"}

設定オプションは以下の様になります。

  • statusInterval:インターバル・デフォルト10秒
  • delete = running:同期時のみ削除可
  • init = false:起動時は同期を反映しない
  • archive = true:rsyncの-aオプションと同等
  • rsync_path = "sudo /usr/bin/rsync":rsyncコマンドをsudo経由で実行

最後のsyncの2行で監視するディレクトリと同期先を2箇所指定しています。複数ある場合は同じ様に追加設定します。

lsyncサービスデーモン(lsyncd)の再起動

サーバー1(node1)側
$ sudo systemctl restart lsyncd

動作確認

適当な空ファイルを作成して、サーバー2(node2)側に反映するか確認してみます。

サーバー1(node1)側
$ touch /home/rsync/test1/test1.txt
サーバー2(node2)側
$ ls -l /home/rsync/test1/

sudo経由なのでシステムファイルも同期出来ます。

サーバー1(node1)側
$ sudo touch /etc/test2/test2.txt
サーバー2(node2)側
$ ls -l /etc/test2/

動作検証にログファイルが確認出来ます。

サーバー1(node1)側
$ sudo tail /var/log/lsyncd.log
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu Server 2台間でファイル同期(lsyncd + rsync + sshd)

背景

2台のLinuxサーバーでファイル同期させて冗長化やバックアップに利用するメモです。

動作環境

  • OS:Ubuntu Server 16.04LTS
  • OS:Ubuntu Server 18.04LTS
  • sshd
  • rsync
  • lsyncd

同期設定のポリシー

2台のサーバー間を双方向で同期する方法と、バックアップの様に片側同期する方法があります。
今回は後者の片側同期に設定します。
双方向同期の場合はファイル削除時の動作を設計時に考慮しないと思わぬデータ消失に繋がり注意が必要です。

rsyncサービスデーモン(rsyncd)

ネットで検索するとrsyncdを使用するページが出てきますが、その場合はサービスポートTCP 873番を経由します。
しかし昔ながらのIPアドレス範囲をallow/denyで制限したり、暗号化無しの平文パスワード利用と今時のセキュリティ的にはよくありません。
閉域網のセキュリティが確保された内部のサブネットで、転送速度のパフォーマンス重視の場合などで検討しましょう。今回は使用しません。

rsyncコマンドをsshd経由で暗号化して公開鍵認証した安全な経路が利用できますので、外部のインターネット経由したサーバー間でも安全な同期が可能です。
sshサービスデーモン(sshd)経由を利用するので一般的なsshd設定が利用可能です。

sshユーザー設定

各サーバーに適当なアカウント「rsync」を作成します。
ユーザーアカウントでシステムファイル操作のパーミッション権限はsudoで対応します。

各サーバー共通
$ sudo adduser rsync

sudoグループに追加します。

各サーバー共通
$ sudo gpasswd -a rsync sudo

「rsync」ユーザーに切り替えてパスフレーズ無しのssh鍵ペアを作成します。
コメントの-Cオプションにサーバーホスト名も付けておくと区別し易いね。

サーバー1(node1)側
$ su rsync
$ ssh-keygen -t ed25519 -C "rsync@node1" -N ""
サーバー2(node2)側
$ su rsync
$ ssh-keygen -t ed25519 -C "rsync@node2" -N ""

ssh鍵を互いのサーバーへ登録します。
方法は色々ありますがssh-copy-idコマンドが簡単。

サーバー1(node1)側
$ ssh-copy-id -i .ssh/id_ed25519 rsync@node2
サーバー2(node2)側
$ ssh-copy-id -i .ssh/id_ed25519 rsync@node1

実際にパスフレーズ無しの公開鍵認証で接続出来るか、互いのサーバーで確認します。

サーバー1(node1)側
$ ssh -i .ssh/id_ed25519 rsync@node2
サーバー2(node2)側
$ ssh -i .ssh/id_ed25519 rsync@node1

rsyncコマンドをsudo経由でパスワード入力無しで実行する設定(サーバー2 node2側)

サーバー2(node2)側
$ sudo visudo
/etc/sudoers
rsync ALL=(ALL) NOPASSWD: /usr/bin/rsync

パスフレーズ無しのssh鍵であってもsudoコマンド実行時にはアカウントのパスワード入力を要求されますので、特定コマンド(この場合はrsync)だけパスワード要求を無効化します。
これでrsyncコマンドをsudo経由で実行出来るので、ファイルの書き換え時にパーミッション制限でのエラーを回避出来ます。

lsyncサービスデーモン(lsyncd)設定

同期元サーバー1(node1)側へインストールして設定する。ちなみに双方向で同期する場合は両方へインストールします。

サーバー1(node1)側
$ sudo apt-get install lsyncd

設定ファイルを作成します。
サンプルファイルが、「/usr/share/doc/lsyncd/examples/lsyncd.conf.lua」とかにありますので参考に。

/etc/lsyncd/lsyncd.conf.lua
settings = {
        logfile = "/var/log/lsyncd.log",
        statusFile = "/tmp/lsyncd.stat",
        insist = 1,
        statusInterval = 10
}

sync_base = {
        default.rsync,
        delete = running,
        init = false,
        rsync = {
          archive = true,
          rsync_path = "sudo /usr/bin/rsync",
          rsh = "/usr/bin/ssh -i /home/rsync/.ssh/id_ed25519 -o StrictHostKeyChecking=no"
        }
}

sync{ sync_base, source="/home/rsync/test1/", target="rsync@node2:/home/rsync/test1/"}
sync{ sync_base, source="/etc/test2/", target="rsync@node2:/etc/test2/"}

設定オプションは以下の様になります。

  • statusInterval:インターバル・デフォルト10秒
  • delete = running:同期時のみ削除可
  • init = false:起動時は同期を反映しない
  • archive = true:rsyncの-aオプションと同等
  • rsync_path = "sudo /usr/bin/rsync":rsyncコマンドをsudo経由で実行

最後のsyncの2行で監視するディレクトリと同期先を2箇所指定しています。複数ある場合は同じ様に追加設定します。

lsyncサービスデーモン(lsyncd)の再起動

サーバー1(node1)側
$ sudo systemctl restart lsyncd

動作確認

適当な空ファイルを作成して、サーバー2(node2)側に反映するか確認してみます。

サーバー1(node1)側
$ touch /home/rsync/test1/test1.txt
サーバー2(node2)側
$ ls -l /home/rsync/test1/

sudo経由なのでシステムファイルも同期出来ます。

サーバー1(node1)側
$ sudo touch /etc/test2/test2.txt
サーバー2(node2)側
$ ls -l /etc/test2/

動作検証にログファイルが確認出来ます。

サーバー1(node1)側
$ sudo tail /var/log/lsyncd.log
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む