20190127のLinuxに関する記事は11件です。

複数NICマシンでのルーティング設定(static route)

はじめに

例えば新しいパソコンを買ってきて家でネットワークにつなぐとき、SSIDとパスワードを入力してつなぐ。DHCPを指定すれば、接続に必要な情報は勝手に登録されるため、IPやデフォルトゲートウェイなどを意識して設定することはない。しかし、仕事で扱うパソコン等であれば、NICを複数枚持っているようなケースも存在する。

昨今色々なスクリプト言語やIDEによってアプリ開発のハードルは下がったように感じるが、ネットワークはまだまだ苦手な人が多い。今回は、特に新しくサーバや端末に固定IPを振って接続するケースで、どうすればよいかをまとめる。

ネットワーク設定の方法

やりがちな間違い

「パソコンにIPを設定する」=「IPやサブネットマスクやデフォルトゲートウェイを設定する」で概ね間違っていないが、複数のNICに対してデフォルトゲートウェイを設定してはいけない。複数のNICにデフォルトゲートウェイを設定してしまうとネットワークが不安定になり、通信ができなくなってしまう。

備考:開発する際の注意

仮に各NICにデフォルトゲートウェイを登録していても、他のNICが有効になっていなければ通信できてしまうこともある。例えば、個別テストのために、ひとつずつケーブルを突き刺した場合である。こうしてテストした場合、いざ全部のケーブルを接続した時点で、全部のNICに設定されたデフォルトゲートウェイが読み込まれ、結果ネットワークが不安定になる。個別の通信試験の段階から、実際に使用するすべてのNICを有効にして望むことが望ましい。

ルーティングの方法:Static Route

異なるネットワークのIPにアクセスするときの出口として必要なのがデフォルトゲートウェイであり、そもそも同じネットワークのIPとしか通信しない場合、デフォルトゲートウェイさえ必要ない。しかし、通常はデフォルトゲートウェイでいいが、特定のサブネットに対しては別のIPを経由したい場合がある。こういうケースでは、static routeを使う。

想定するケース

以下のケースを想定する。

  • パソコンの設定
    • NIC A
      • IP: 192.168.1.10/24
      • Gateway: 192.168.1.1/24
    • NIC B
      • IP: 10.20.30.40/24
  • ルーティングについて
    • 他のネットワークに通信するとき、通常は192.168.1.1/24を経由する(デフォルトゲートウェイ)
    • ただし、サブネット10.50.60.0/24に対しては、10.20.30.50/24(例えばL3スイッチ)を経由したい

このとき、10.50.60.0/24への接続を10.20.30.50/24を経由するようstatic routeで指定する。

Windowsの場合

コマンドプロンプトでrouteコマンドを使用する。

$ route add 10.50.60.0/24 mask 255.255.255.0 10.20.30.50

削除するときは次のように、adddeleteにすれば良い。

$ route delete 10.50.60.0/24 mask 255.255.255.0 10.20.30.50

この設定をずっと有効にする(再起動してもこの設定が有効になる)ためには、-pオプションを使用する。

$ route -p add 10.50.60.0/24 mask 255.255.255.0 10.20.30.50

設定がうまくできたかどうかは、

$ route print

で確認できる。

Linux(RHEL)の場合

RHEL(CentOS)の場合、routeコマンド(ip route)で追加するか、/etc/sysconfig/network-script/route-eth[x]ファイルに記述する(xは、NICに対応するethに合わせて数字を入れる)。今回は後者を紹介する。

上記の設定の場合、各ファイルには次のように設定してあるとする。
eth0が192.168.1.10/24のNIC A, eth1が10.20.30.40/24のNIC Bである。

/etc/sysconfig/network/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=192.168.1.10
GATEWAY=192.168.1.1
/etc/sysconfig/network/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=10.20.30.40

このとき、eht1用(IP=10.20.30.40)に対するファイル /etc/sysconfig/network-script/route-eth1 を追加する。

/etc/sysconfig/network-script/route-eth1
10.50.60.0/24 via 10.20.30.50

その後、ネットワークの再起動を行う。

# service network restart

おまけ

以上でstatic routeの設定は終わる。最後に、通信するサブネットがごくごく限られているなら、デフォルトゲートウェイを設定せずに、明示的にstatic routeだけにするのもアリだと考える。

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

ファイルサーバーの内容をtreeコマンドで一覧に

はじめに

社内で他方面から仕事の依頼を受けたり、いくつものversionをもつ企画書を扱ったりで、自然とフォルダの中が汚くなっていくことにストレスを感じることありませんか。というか共有フォルダとか、もはや命名ルールとかあっても汚くなりますよね。

あのフォルダどこだっけ。で困りませんか?

ということで

綺麗にするためには、まずは現状を知ることが大事ですね。今回は現状を知ることだけを記事にします。

treeコマンドについて

やり方

共有ファイルに接続する(winとmac両方と載せていきます。)

> net use \\server01
$ set use \\server01

中身を見てみる

> dir \\server01
$ ls \\server01
> tree \\server01
$ tree \\server01

txtファイルに内容を書き込む

> tree \\server01 > test.txt
$ tree \\server01 > test.txt

おわり

txtファイルの内容を元に、階層構造の整理を行うきっかけになりました

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

Oracle Cloud(OCI)のリージョン内yumリポジトリを使ってみた

リージョン内yumリポジトリって?

  • Oracle Cloud Infrastructure(OCI)では、Oracle Linuxのyumリポジトリのミラーがリージョン内に用意されているようです。
  • これを使うと速くていいね、とのこと
    ※Service Gatewayを介してプライベート接続できるとかそういう話では(まだ)ない
  • ココに書いてありました

使えるようにする

既存のリポジトリを退避

[opc@testinstance ~]$ cd /etc/yum.repos.d
[opc@testinstance yum.repos.d]$ ll
total 36
-rw-r--r--. 1 root root 17684 Jan 11 02:55 public-yum-ol7.repo
-rw-r--r--. 1 root root 15423 Dec 17 19:41 public-yum-ol7.repo.orig

# 名前変更
[opc@testinstance yum.repos.d]$ sudo mv public-yum-ol7.repo public-yum-ol7.repo.bak

[opc@testinstance yum.repos.d]$ ll
total 36
-rw-r--r--. 1 root root 17684 Jan 11 02:55 public-yum-ol7.repo.bak # <--★変わってる
-rw-r--r--. 1 root root 15423 Dec 17 19:41 public-yum-ol7.repo.orig

インスタンスのあるリージョンのリポジトリミラーを取ってくる

# 自インスタンスのいるリージョンを調べてREGION変数にいれる
[opc@testinstance yum.repos.d]$ export REGION=`curl http://169.254.169.254/opc/v1/instance/ -s | jq -r '.region'| cut -d '-' -f 2`
[opc@testinstance yum.repos.d]$ echo $REGION
phx

# リージョンのリポジトリを取ってくる
[opc@testinstance yum.repos.d]$ sudo -E wget http://yum-$REGION.oracle.com/yum-$REGION-ol7.repo
--2019-01-27 10:40:57--  http://yum-phx.oracle.com/yum-phx-ol7.repo
Resolving yum-phx.oracle.com (yum-phx.oracle.com)... 129.146.100.180
Connecting to yum-phx.oracle.com (yum-phx.oracle.com)|129.146.100.180|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 17396 (17K) [application/octet-stream]
Saving to: ‘yum-phx-ol7.repo’

100%[======================================>] 17,396      --.-K/s   in 0s

2019-01-27 10:40:57 (113 MB/s) - ‘yum-phx-ol7.repo’ saved [17396/17396]

# 追加されていることを確認
[opc@testinstance yum.repos.d]$ ll
total 56
-rw-r--r--. 1 root root 17684 Jan 11 02:55 public-yum-ol7.repo.bak
-rw-r--r--. 1 root root 15423 Dec 17 19:41 public-yum-ol7.repo.orig
-rw-r--r--. 1 root root 17396 Dec 14 22:26 yum-phx-ol7.repo # <--★取ってこれた

※最初のコマンドでなぜリージョン名が取ってこれるのかは以下の記事で説明しました
「Oracle Cloud(OCI)の自インスタンスの情報を取得する方法」
※sudoの"-E"オプションは、環境変数を引き継がせるためのもの($REGIONを渡すため)

ol7_oci_includedリポジトリの有効化

# 取ってきたばかりの状態でどうなっているか確認
[opc@testinstance yum.repos.d]$ sed -n 491,496p yum-phx-ol7.repo
[ol7_oci_included]
name=Oracle Software for OCI users on Oracle Linux $releasever ($basearch)
baseurl=http://yum-phx.oracle.com/repo/OracleLinux/OL7/oci/included/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0 # <--★デフォルトでは無効化されている

# リポジトリを指定して有効化
[opc@testinstance yum.repos.d]$ sudo yum-config-manager --enable ol7_oci_included
Loaded plugins: langpacks
============================ repo: ol7_oci_included ============================
[ol7_oci_included]
async = True
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7Server
baseurl = http://yum-phx.oracle.com/repo/OracleLinux/OL7/oci/included/x86_64/
cache = 0
cachedir = /var/cache/yum/x86_64/7Server/ol7_oci_included
check_config_file_age = True
compare_providers_priority = 80
cost = 1000
deltarpm_metadata_percentage = 100
deltarpm_percentage =
enabled = 1
enablegroups = True
exclude =
failovermethod = priority
ftp_disable_epsv = False
gpgcadir = /var/lib/yum/repos/x86_64/7Server/ol7_oci_included/gpgcadir
gpgcakey =
gpgcheck = True
gpgdir = /var/lib/yum/repos/x86_64/7Server/ol7_oci_included/gpgdir
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
hdrdir = /var/cache/yum/x86_64/7Server/ol7_oci_included/headers
http_caching = all
includepkgs =
ip_resolve =
keepalive = True
keepcache = False
mddownloadpolicy = sqlite
mdpolicy = group:small
mediaid =
metadata_expire = 21600
metadata_expire_filter = read-only:present
metalink =
minrate = 0
mirrorlist =
mirrorlist_expire = 86400
name = Oracle Software for OCI users on Oracle Linux 7Server (x86_64)
old_base_cache_dir =
password =
persistdir = /var/lib/yum/repos/x86_64/7Server/ol7_oci_included
pkgdir = /var/cache/yum/x86_64/7Server/ol7_oci_included/packages
proxy = False
proxy_dict =
proxy_password =
proxy_username =
repo_gpgcheck = False
retries = 10
skip_if_unavailable = False
ssl_check_cert_permissions = True
sslcacert =
sslclientcert =
sslclientkey =
sslverify = True
throttle = 0
timeout = 30.0
ui_id = ol7_oci_included/x86_64
ui_repoid_vars = releasever,
   basearch
username =

# 確認
[opc@testinstance yum.repos.d]$ sed -n 491,496p yum-phx-ol7.repo
[ol7_oci_included]
name=Oracle Software for OCI users on Oracle Linux $releasever ($basearch)
baseurl=http://yum-phx.oracle.com/repo/OracleLinux/OL7/oci/included/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1 <--★有効化された

「使ってみた」の部分は次のエントリで。
> Oracle Cloud(OCI)のIaaSからDbaaSへSQLPlusで接続してみた

参考

以上

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

サーバー側でyarn自体のバージョンをあげる

前段

かつてはyarn自体のバージョンをアップデートするコマンドとして、yarn self-updateがあったようです。
https://yarnpkg.com/lang/ja/docs/cli/self-update/

しかし、残念ながらこのコマンドは利用できないので、別の方法を取らざるえない様子。

ローカルのyarnはbrewで入れていたので、さっくり上がったものの、問題はサーバー側。
調べた限り、サーバー側でyarnのアップデートをしている記事が少なかったので、症例報告としてこの記事を書きます。
下記手順が安全であることや正規の方法であることを保証できませんので、そのつもりでお願いします。

私の環境では yarn 0.27.5→1.13.0のアップデートを実施しました。(Amazon Linax)

npmでyarnを入れた場合

私の環境では、後述の理由でnpmを使わずyarnがインストールされていました。

npmで導入した場合、こちらの記事が参考になりそうです。
yarn自体のアップグレードをする

yumでyarnを入れた場合

yarn公式ではnpmを使ってyarnを導入することを非推奨としているようです。

注意: npm から Yarn をインストールすることは一般的にはお勧めしません。 Node ベースのパッケージマネージャで Yarn をインストールする場合は、パッケージは署名されておらず、整合性のチェックはベーシックな SHA1 ハッシュのみで行われており、システム全体にまたがるアプリケーションをインストールする場合にはセキュリティリスクとなります。
これらの理由から、使用中の OS に最も適した方法で Yarn をインストールすることを強くお勧めします。
https://yarnpkg.com/ja/docs/install#alternatives-stable

今回私が対応した環境でもこの記述に準じて行われておりyarnyumを使って導入されていました。
なので sudp yum update yarnでいけるかな...と試して見たんですが、アップデートは走るものの、サーバーを再起動してもversionは変わらないままだったので、下記の方法でアップデートを行いました。

ここからは2ステップででアップデートの方法を書きます。

1.古いyarnをアンインストール
2.新しいyarnをインストール

1.古いyarnをアンインストール

基本的には下記で導入されたものを打ち消す方向で動くことになります。
https://yarnpkg.com/ja/docs/install#centos-stable

まずyarnがどこにあるか調べます。調べるだけです。

$which yarn  

yum経由でyarnをアンインストールします。

$sudo yum remove yarn

yarnがアンインストールされていることを確認するためにyarnのバージョンを表示を試してみます。

$yarn --version

①コンソールから「そんなコマンド無いよ」的なことが言われた場合

yarnのアンインストールに成功しています。
次に、かつてyarnをインストールするときにダウンロードしたであろう、yarn.repoを削除します。

$cd /etc/yum.repos.d/

上記フォルダの中にyarn.repoが入っていたのでこれを削除しました。

$sudo rm -f yarn.repo

②平然とyarnのバージョンが帰ってきた場合

yarnのアンインストールが完了していなさそうです。

困ってしまったのでyarnの公式からもリンクされている下記issueを参考にして進めました。
https://github.com/yarnpkg/yarn/issues/1139#issuecomment-441168002

まず先ほど$which yarnで調べた場所を見にいきます。そこに入っている yarnyarnpkg というファイルを削除してみます。

$rm -f yarnpkg
$rm -f yarn

これで$yarn --versionしてもコマンドが通らなくなりました。
yarnが通らなくなったことが確認できたので上記の2ファイルが入っていたディレクトリを削除します。
私の場合 .yarnyarnyarnpkgが入っていたので削除します。

$rm -rf .yarn

次に、かつてyarnをインストールするときにダウンロードしたであろう、yarn.repoを削除します。

$cd /etc/yum.repos.d/

上記フォルダの中にyarn.repoが入っていたのでこれを削除しました。

$sudo rm -f yarn.repo

2.新しいyarnをインストール

基本的に公式のインストールを再びなぞります。
https://yarnpkg.com/ja/docs/install#centos-stable

$curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$sudo yum install yarn
$yarn --version
1.13.0であることを確認

おわりに

上記でうまくいってしまいましたが、ビギナーズラックだったかもしれません。
あくまで一例として紹介させていただきます。

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

Microsoft Edge での Kaliダウンロード と VirtualBox での Kali起動 が失敗した話 と その解決方法

はじめに

ハッキング・ラボで体験学習するにあたり、導入にて少々つまづきました。その際の解決方法記事です。

本記事と同様なトラブルで悩んでいる方は、環境によってWindows設定やBIOS設定の名称が違うことがあると思います。適宜読み替えたり、似た機能を推測してトラブル解決へ向けて試行錯誤して頂ければと思います。

体験学習導入でつまづいてしまい、そのまま諦めてしまう方が少しでも減ってくれれば幸いです。

体験学習環境

項目 スペックなど
PC Lenovo V310
CPU Intel Corei3-6006U 2.00GHz
BIOS(UEFI) Phoenix SecureCore Technology
OS Windows10 Home
メモリ 8GB(オンボード4GB + 増設4GB)
ブラウザ1 Microsoft Edge 17.17134
ブラウザ2 Google Chrome 71.0.3578.98

つまづきポイント

Microsoft EdgeでKali Linuxのダウンロードが行えない

Kali Linux Vbox 64 Bit Ovaファイルのダウンロードで、Microsoft Edgeはブラウザ上にOVAファイルの中身を表示してしまいダウンロードが行えませんでした。
edge ova.png

解決方法

単純ですが、Chromeを利用してダウンロードを行いました。

VirtualBoxでKali Linuxが起動しない

Kali Linuxダウンロード後、VirtualBoxへのインポートを行いKali Linuxを起動すると、VitualBoxからエラーメッセージが表示されたり、Kali Linuxが黒画面のまま先に進まないような状態となりました。
image.png

解決方法

Windows10機能の設定とBios機能の設定が影響していました。著者環境でKali Linuxが起動した設定内容を記載します。

種類 設定名 設定内容
Windows10 Windows ハイパーバイザプラットフォーム 未チェック
BIOS Intel Virtual Technology Enabled
  • Windows10 - ハイパーバイザプラットフォーム -
    [コントロールパネル] --> [プログラム] --> [プログラムと機能] --> [Windowsの機能の有効化または無効化] から [Windows ハイパーバイザプラットフォーム]設定を行います。
    image.png

  • BIOS - Intel Virtual Technology -

[Windows10起動状態からShiftキー押しながら再起動] --> [トラブルシューティング] --> [詳細オプション] --> [UEFI ファームウェア設定] --> [再起動する] からBIOSに移行させ[Intel Virtual Technology]設定を行います。
※BIOS起動方法はいくつかあるようですが難なくBIOS起動行えた方法を記載

  • Windows ハイパーバイザプラットフォーム と Intel Virtual Technology 設定の関係性
kali Linux 起動結果 Windows ハイパーバイザプラットフォーム BIOS Intel Virtual Technology 状態
OK 未チェック Enabled 正常起動
NG 未チェック Disabled 仮想マシン"Kali-Linux-2018.4-vbox-amd64"のセッションを開けませんでした
NG チェック Enabled 黒画面のまま進まない
NG チェック Disabled 仮想マシン"Kali-Linux-2018.4-vbox-amd64"のセッションを開けませんでした

最後に

序盤でつまづきそうな人に少しでもお役に立てる情報であればと思います。

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

linuxの perf top は簡単なので日常的に使いたい

linuxカーネルにはパフォーマンス計測のための機能がいくつか備わっています。その中でもperf topは使うのが簡単です。日常的にこれを使っていれば、あるプロセスの負荷が異常に高まった場合にその差に気がつくことができます。

インストール

perf topは perf の一部なので、perfをインストールします。perfはカーネルのリリースに強く依存しているので、パッケージがカーネルのリリースごとに分かれています。

ubuntuの場合では、以下のようにすれば適切なパッケージをインストールできます。

sudo apt install linux-tools-`uname -r`

使い方

システム全体を計測するとき

sudo perf top

システム全体をおおまかに計測するとき (プログラム、ライブラリごとにまとめて表示)

sudo perf top --sort comm,dso

特定のプロセスに注目して計測するとき (例: pid=5749 )

sudo perf top -p 5749

表示更新間隔を10秒にする。(表示内容をコピべするには、このほうがやりやすい)

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

【C言語】俺の機関車は遅すぎる ~slコマンドを作ってみた~

【概要】

ターミナルで機関車を動かすことができるslコマンドを作ってみました。
ただし、オプションまでの実装はしていません。
また、俺の機関車は本家の機関車よりスピードが遅いです(作成後に本家と比較したら遅くて、でもこの方が面白いかなと・・・)。
タイトルはこちらの記事のオマージュです → 俺のlsが遅すぎる

本家のコードは一切見ないで、本家の実行結果だけを繰り返し見て作成しました。
(本家のコードはネットにあるかどうか知りません)
[追記] fujitanozomuさんからコメント頂き、下記GitHubにありました。
  https://github.com/mtoyoda/sl

【準備】

コードを実行するときはcurses.hが必要になります。
インストール方法は下記サイトを参考にしました。
Linux Error: curses.h: No such file or directory Problem Solution

【環境】

[vagrant@vagrant-centos65 sl_command]$ cat /etc/centos-release 
CentOS release 6.5 (Final)

【コード】

コンパイルするときはgcc -o sl sl.c -lcurses

sl.c
#include <stdio.h>
#include <curses.h>
#include <string.h>

void printSL();

int main(int argc, char *argv[])
{
    // 初期化
    initscr();
    // カーソルを表示しない
    curs_set(0);
    // キー入力された文字を表示しない
    noecho();
    // バッファを使用しない
    cbreak();
    // 機関車出力
    printSL();
    // 端末制御を終了
    endwin();
    return 0;
}

void printSL()
{
    int count = 1;
    int slScrInCol = 0, slScrOutCol = 0;
    int lineNum = 0;
    int colNum = 0;

    // 現在の画面のサイズ取得
    // curses.hで定義されているLINES, COLSだとターミナルのサイズを変更しても
    // 初期の画面サイズとなってしまうため現在の画面サイズを取得する
    // colNumは必要ないため、以後使用しない
    getmaxyx(stdscr, lineNum, colNum);
    // 機関車を画面中央に表示するため
    lineNum /= 4;
    char str[24][1000] = {'0'};


    int maxLen = strlen("  \\_/      \\__/  \\__/  \\__/  \\__/      \\_/               \\_/   \\_/    \\_/   \\_/");
    // マジックナンバー6は微調整用
    while(COLS + maxLen + 6 - slScrInCol != 0) {
        strncpy(str[0], "                        (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O", slScrInCol);
        strncpy(str[1], "                   (@@@)", slScrInCol);
        strncpy(str[2], "               (    )", slScrInCol);
        strncpy(str[3], "            (@@@@)", slScrInCol);
        strncpy(str[4], "          (   )", slScrInCol);

        strncpy(str[5], "                        (@@) (  ) ( )  ()  (@)    @@    @     O     @     O      @", slScrInCol);
        strncpy(str[6], "                   (   )", slScrInCol);
        strncpy(str[7], "               (@@@@)", slScrInCol);
        strncpy(str[8], "            (    )", slScrInCol);
        strncpy(str[9], "          (@@@)", slScrInCol);

        // 煙突の煙の出力
        // 煙と車輪が動く速度は違うため、煙のは車輪に比べて遅く表示する
        if (count <= 4) {
            mvprintw(lineNum,   COLS-slScrInCol, str[0]);
            mvprintw(lineNum+1 ,COLS-slScrInCol, str[1]);
            mvprintw(lineNum+2 ,COLS-slScrInCol, str[2]);
            mvprintw(lineNum+3 ,COLS-slScrInCol, str[3]);
            mvprintw(lineNum+4 ,COLS-slScrInCol, "");
            mvprintw(lineNum+5 ,COLS-slScrInCol, str[4]);
        } else {
            mvprintw(lineNum,   COLS-slScrInCol, str[5]);
            mvprintw(lineNum+1 ,COLS-slScrInCol, str[6]);
            mvprintw(lineNum+2 ,COLS-slScrInCol, str[7]);
            mvprintw(lineNum+3 ,COLS-slScrInCol, str[8]);
            mvprintw(lineNum+4 ,COLS-slScrInCol, "");
            mvprintw(lineNum+5 ,COLS-slScrInCol, str[9]);
        }

        strncpy(str[10], "      ====        ________                ___________", slScrInCol);
        strncpy(str[11], "  _D _|  |_______/        \\__I_I_____===__|_________|", slScrInCol);
        strncpy(str[12], "   |(_)---  |   H\\________/ |   |        =|___ ___|      _________________", slScrInCol);
        strncpy(str[13], "   /     |  |   H  |  |     |   |         ||_| |_||     _|                \\_____A", slScrInCol);
        strncpy(str[14], "  |      |  |   H  |__--------------------| [___] |   =|                        |", slScrInCol);
        strncpy(str[15], "  | ________|___H__/__|_____/[][]~\\_______|       |   -|                        |", slScrInCol);
        strncpy(str[16], "  |/ |   |-----------i_____I [][] []  D   |=======|____|________________________|_", slScrInCol);

        // 車輪より上部の出力      
        mvprintw(lineNum+6 , COLS-slScrInCol, str[10]);
        mvprintw(lineNum+7 , COLS-slScrInCol, str[11]);
        mvprintw(lineNum+8 , COLS-slScrInCol, str[12]);
        mvprintw(lineNum+9 , COLS-slScrInCol, str[13]);
        mvprintw(lineNum+10, COLS-slScrInCol, str[14]);
        mvprintw(lineNum+11, COLS-slScrInCol, str[16]);
        mvprintw(lineNum+12, COLS-slScrInCol, str[10]);


        strncpy(str[17], "__/ =| o |=-O=====O=====O=====O\\  ____Y___________|__|__________________________|_", slScrInCol);
        strncpy(str[18], " |/-=|___|=    ||    ||    ||    |_____/\\___/          |_D__D__D_|  |_D__D__D_|", slScrInCol);
        strncpy(str[19], "  \\_/      \\__/  \\__/  \\__/  \\__/      \\_/               \\_/   \\_/    \\_/   \\_/", slScrInCol);
        strncpy(str[20], "__/ =| o |=-~~\\  /~~\\  /~~\\  /~~\\ ____Y___________|__|__________________________|_", slScrInCol);
        strncpy(str[21], " |/-=|___|=O=====O=====O=====O   |_____/\\___/          |_D__D__D_|  |_D__D__D_|", slScrInCol);
        strncpy(str[22], "  \\_/      \\_O=====O=====O=====O/      \\_/               \\_/   \\_/    \\_/   \\_/", slScrInCol);
        strncpy(str[23], " |/-=|___|=   O=====O=====O=====O|_____/\\___/          |_D__D__D_|  |_D__D__D_|", slScrInCol);


        // 車輪部分の出力
        if (count % 4 == 1) {
            mvprintw(lineNum+13, COLS-slScrInCol, str[17]);
            mvprintw(lineNum+14, COLS-slScrInCol, str[18]);
            mvprintw(lineNum+15, COLS-slScrInCol, str[19]);         
        } else if (count % 4 == 2) {
            mvprintw(lineNum+13, COLS-slScrInCol, str[20]);
            mvprintw(lineNum+14, COLS-slScrInCol, str[21]);
            mvprintw(lineNum+15, COLS-slScrInCol, str[19]);
        } else if (count % 4 == 3) {
            mvprintw(lineNum+13, COLS-slScrInCol, str[20]);
            mvprintw(lineNum+14, COLS-slScrInCol, str[18]);
            mvprintw(lineNum+15, COLS-slScrInCol, str[22]);
        } else {
            mvprintw(lineNum+13, COLS-slScrInCol, str[20]);
            mvprintw(lineNum+14, COLS-slScrInCol, str[23]);
            mvprintw(lineNum+15, COLS-slScrInCol, str[19]);
        }

        // countの数を大きくしないようにするため
        if (count / 8 == 1) {
            count = 1;
        } else {
            count++;
        }

        // 機関車の先頭が画面左から出ていくときの画面出力
        if (COLS - slScrInCol <= 0) {
            if (count <= 4) {
                mvprintw(lineNum,   0, &str[0][slScrOutCol]);
                mvprintw(lineNum+1 ,0, &str[1][slScrOutCol]);
                mvprintw(lineNum+2 ,0, &str[2][slScrOutCol]);
                mvprintw(lineNum+3 ,0, &str[3][slScrOutCol]);
                mvprintw(lineNum+4 ,0, "");
                mvprintw(lineNum+5 ,0, &str[4][slScrOutCol]);
            } else {
                mvprintw(lineNum,   0, &str[5][slScrOutCol]);
                mvprintw(lineNum+1 ,0, &str[6][slScrOutCol]);
                mvprintw(lineNum+2 ,0, &str[7][slScrOutCol]);
                mvprintw(lineNum+3 ,0, &str[8][slScrOutCol]);
                mvprintw(lineNum+4 ,0, "");
                mvprintw(lineNum+5 ,0, &str[9][slScrOutCol]);
            }

            mvprintw(lineNum+6 , 0, &str[10][slScrOutCol]);
            mvprintw(lineNum+7 , 0, &str[11][slScrOutCol]);
            mvprintw(lineNum+8 , 0, &str[12][slScrOutCol]);
            mvprintw(lineNum+9 , 0, &str[13][slScrOutCol]);
            mvprintw(lineNum+10, 0, &str[14][slScrOutCol]);
            mvprintw(lineNum+11, 0, &str[16][slScrOutCol]);
            mvprintw(lineNum+12, 0, &str[10][slScrOutCol]);

            if (count % 4 == 1) {
                mvprintw(lineNum+13, 0, &str[17][slScrOutCol]);
                mvprintw(lineNum+14, 0, &str[18][slScrOutCol]);
                mvprintw(lineNum+15, 0, &str[19][slScrOutCol]);         
            } else if (count % 4 == 2) {
                mvprintw(lineNum+13, 0, &str[20][slScrOutCol]);
                mvprintw(lineNum+14, 0, &str[21][slScrOutCol]);
                mvprintw(lineNum+15, 0, &str[19][slScrOutCol]);
            } else if (count % 4 == 3) {
                mvprintw(lineNum+13, 0, &str[20][slScrOutCol]);
                mvprintw(lineNum+14, 0, &str[18][slScrOutCol]);
                mvprintw(lineNum+15, 0, &str[22][slScrOutCol]);
            } else {
                mvprintw(lineNum+13, 0, &str[20][slScrOutCol]);
                mvprintw(lineNum+14, 0, &str[23][slScrOutCol]);
                mvprintw(lineNum+15, 0, &str[19][slScrOutCol]);
            }
            slScrOutCol++;
        }

        slScrInCol++;
        // 60ミリ秒待つ
        usleep(6 * 10000);
        refresh();
        clear();
    }
}

【実行結果】

【俺の機関車】

my_sl.gif

【本家の機関車】

org_sl.gif

【参考サイト】

C言語でシンプルすぎるブロック崩しを書いた
curses よく利用する関数についての超てきとー解説

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

Arch インスコメモ

arch liveのusbメモリからThinkpad x1 carbon 6genにarchをインスコした時の備忘録(UEFIブート)。なお、winは消す

live USBメディアの作成

公式サイト( https://www.archlinux.org/download/ )からISOのDL
ISOのチェックサム

$ gpg --keyserver pgp.mit.edu --keyserver-options auto-key-retrieve --verify archlinux-2019.01.01-x86_64.iso.sig
gpg: assuming signed data in 'archlinux-2019.01.01-x86_64.iso'
gpg: Signature made Wed 02 Jan 2019 12:23:53 AM JST
gpg:                using RSA key 4AA4767BBC9C4B1D18AE28B77F2D434B9741E8AC
gpg: requesting key 7F2D434B9741E8AC from hkp server pgp.mit.edu
\gpg: key 7F2D434B9741E8AC: 31 signatures not checked due to missing keys
gpg: key 7F2D434B9741E8AC: public key "Pierre Schmitz <pierre@archlinux.de>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1
gpg: Good signature from "Pierre Schmitz <pierre@archlinux.de>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 4AA4 767B BC9C 4B1D 18AE  28B7 7F2D 434B 9741 E8AC

デバイスの確認(sdb1が今回のターゲット)
マウントされていた場合はアンマウントする

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0    13M  1 loop /snap/gnome-characters/124
loop1         7:1    0  14.5M  1 loop /snap/gnome-logs/45
loop2         7:2    0  15.1M  1 loop /snap/aws-cli/135
loop3         7:3    0    13M  1 loop /snap/gnome-characters/139
loop4         7:4    0  42.1M  1 loop /snap/gtk-common-themes/701
loop5         7:5    0  87.9M  1 loop /snap/core/5662
loop6         7:6    0   2.3M  1 loop /snap/gnome-calculator/238
loop7         7:7    0 147.3M  1 loop /snap/skype/66
loop8         7:8    0   2.3M  1 loop /snap/gnome-calculator/260
loop9         7:9    0  34.6M  1 loop /snap/gtk-common-themes/818
loop10        7:10   0  89.5M  1 loop /snap/core/6130
loop11        7:11   0 140.7M  1 loop /snap/gnome-3-26-1604/74
loop12        7:12   0   3.7M  1 loop /snap/gnome-system-monitor/57
loop13        7:13   0 140.9M  1 loop /snap/gnome-3-26-1604/70
sdb           8:16   1   7.5G  0 disk
├─sdb1        8:17   1   1.8G  0 part /media/mike/Ubuntu 18.04.1 LTS amd64
└─sdb2        8:18   1   2.3M  0 part
nvme0n1     259:0    0   477G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0 476.4G  0 part /

dev/sdb1 をアンマウントする

$ umount /dev/sdb
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0    13M  1 loop /snap/gnome-characters/124
loop1         7:1    0  14.5M  1 loop /snap/gnome-logs/45
loop2         7:2    0  15.1M  1 loop /snap/aws-cli/135
loop3         7:3    0    13M  1 loop /snap/gnome-characters/139
loop4         7:4    0  42.1M  1 loop /snap/gtk-common-themes/701
loop5         7:5    0  87.9M  1 loop /snap/core/5662
loop6         7:6    0   2.3M  1 loop /snap/gnome-calculator/238
loop7         7:7    0 147.3M  1 loop /snap/skype/66
loop8         7:8    0   2.3M  1 loop /snap/gnome-calculator/260
loop9         7:9    0  34.6M  1 loop /snap/gtk-common-themes/818
loop10        7:10   0  89.5M  1 loop /snap/core/6130
loop11        7:11   0 140.7M  1 loop /snap/gnome-3-26-1604/74
loop12        7:12   0   3.7M  1 loop /snap/gnome-system-monitor/57
loop13        7:13   0 140.9M  1 loop /snap/gnome-3-26-1604/70
sdb           8:16   1   7.5G  0 disk
├─sdb1        8:17   1   1.8G  0 part
└─sdb2        8:18   1   2.3M  0 part
nvme0n1     259:0    0   477G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0 476.4G  0 part /

ISOを書き込む

$ sudo dd bs=4M if=archlinux-2019.01.01-x86_64.iso of=/dev/sdb status=progress && sync                                                        
[sudo] password for mike:
150+1 records in
150+1 records out
631242752 bytes (631 MB, 602 MiB) copied, 105.399 s, 6.0 MB/s

BIOSの設定

  • セキュアブートをオフにする
    Security > Secure boot > Secure boot > Disabled
  • USBメモリの起動優先順位を変更する

そしてLive USBから起動する。

Archのインスコ

ミラーサーバーの国の優先順位を変更
日本とアメリカだと10倍ぐらい速度の差があった

# vi /etc/pacman.d/mirrorlist # 日本を最上位に移動する
# pacman -Syu # ミラーリストを更新

WiFiの設定

まずインターフェイスの確認
wから始まっているのが往々にして無線のネットワークインターフェイス

# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s31f6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether e8:6a:64:86:78:38 brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 20:79:18:d2:ca:1c brd ff:ff:ff:ff:ff:ff

wlp2s0が対象のI/F
ore_oreという名前(任意)のプロファイルを作る

# cp /etc/netctl/examples/wireless-wpa /etc/netctl/ore_ore
# cat /etc/netctl/ore_ore
Description='A simple WPA encrypted wireless connection'
Interface=wlan0
Connection=wireless

Security=wpa
IP=dhcp

ESSID='MyNetwork'
# Prepend hexadecimal keys with \"
# If your key starts with ", write it as '""<key>"'
# See also: the section on special quoting rules in netctl.profile(5)
Key='WirelessKey'
# Uncomment this if your ssid is hidden
#Hidden=yes
# Set a priority for automatic profile selection
#Priority=10

ore_ore プロファイルを修正する
変更するのは次の3点

  1. Interface: WifiのI/F(この場合はwlp2s0)
  2. ESSID: wifiのSSID
  3. Key: WifiのPW
# vi /etc/netctl/ore_ore # ゴニョゴニョ
# cat /etc/netctl/ore_ore
Description='A simple WPA encrypted wireless connection'
Interface=wlp2s0
Connection=wireless

Security=wpa
IP=dhcp

ESSID='XXX'
# Prepend hexadecimal keys with \"
# If your key starts with ", write it as '""<key>"'
# See also: the section on special quoting rules in netctl.profile(5)
Key='XXX'
# Uncomment this if your ssid is hidden
#Hidden=yes
# Set a priority for automatic profile selection
#Priority=10

Wifiに接続する
pingが通れば成功

# netctl start ore_ore # 数秒かかる
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=121 time=8.90 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=121 time=10.1 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=121 time=10.4 ms
...

パーテーションの設定

(U)EFIかどうか確認
ディレクトリが存在すればOK

# ls /sys/firmware/efi/
config_table  efivars  esrt  fw_platform_size  fw_vendor  runtime  runtime-map  systab

ドライブを探す
ThinkPad X1 carbonはPCIe SSDなのでインターフェイスの名前はnvme0n1で、後ろにp1のようにパーテーション番号がつく。

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0    13M  1 loop /snap/gnome-characters/124
loop1         7:1    0  14.5M  1 loop /snap/gnome-logs/45
loop2         7:2    0  15.1M  1 loop /snap/aws-cli/135
loop3         7:3    0    13M  1 loop /snap/gnome-characters/139
loop4         7:4    0  42.1M  1 loop /snap/gtk-common-themes/701
loop5         7:5    0  87.9M  1 loop /snap/core/5662
loop6         7:6    0   2.3M  1 loop /snap/gnome-calculator/238
loop7         7:7    0 147.3M  1 loop /snap/skype/66
loop8         7:8    0   2.3M  1 loop /snap/gnome-calculator/260
loop9         7:9    0  34.6M  1 loop /snap/gtk-common-themes/818
loop10        7:10   0  89.5M  1 loop /snap/core/6130
loop11        7:11   0 140.7M  1 loop /snap/gnome-3-26-1604/74
loop12        7:12   0   3.7M  1 loop /snap/gnome-system-monitor/57
loop13        7:13   0 140.9M  1 loop /snap/gnome-3-26-1604/70
sdb           8:16   1   7.5G  0 disk
├─sdb1        8:17   1   1.8G  0 part /media/mike/Ubuntu 18.04.1 LTS amd64
└─sdb2        8:18   1   2.3M  0 part
nvme0n1     259:0    0   477G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0 476.4G  0 part /

UEFIブートなので、GPTパーテーションを作る
下のような感じで書き換える

EF00はEFIパーテーションHEX
8E00は linux LVM (logical volume manager) のHEX
なお、空欄ではEnterキーを押している

$ gdisk /dev/nvme0n1
GPT fdisk (gdisk) version 1.0.4

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1):  
First sector (34-1000215182, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-1000215182, default = 1000215182) or {+-}size{KMGTP}: +512MB
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI System'

Command (? for help): n
Partition number (2-128, default 2): 
First sector (34-1000215182, default = 1050624) or {+-}size{KMGTP}: 
Last sector (1050624-1000215182, default = 1000215182) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8E00
Changed type of partition to 'Linux LVM'

Command (? for help): w
# 最後のコマンドはy、全部書き換える

パーテーションの確認

$ fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 477 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: LENSE30512GMSP34MEAT3TA                 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 07E88104-29C7-41AE-91AD-379E474EA1C7

Device           Start        End   Sectors   Size Type
/dev/nvme0n1p1    2048    1050623   1048576   512M EFI System
/dev/nvme0n1p2 1050624 1000215182 999164559 476.4G Linux LVM

LVMパーテーションの暗号化

LVMパーテーションの暗号化する
暗号はデフォのLUKSを使用する
パスフレーズは覚えておく

# cryptsetup luksFormat /dev/nvme0n1p2 # ※p1ではない

LVMの中に論理ボリュームを作成する

まずは、LVMを復号化して開く
main_partは任意のデバイスマッパーネームをつける

# cryptsetup open --type luks /dev/nmve0n1p2 main_part

LVMの中に物理ボリューム(PV)を作成

# pvcreate /dev/mapper/main_part

PVの確認

# pvscan 
  PV /dev/mapper/cryptlvm   VG main_group      lvm2 [476.43 GiB / 0    free]
  Total: 1 [476.43 GiB] / in use: 1 [476.43 GiB] / in no VG: 0 [0   ]
# pvdisplay
  --- Physical volume ---
  PV Name               /dev/mapper/cryptlvm
  VG Name               main_group
  PV Size               <476.44 GiB / not usable <3.32 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              121967
  Free PE               0
  Allocated PE          121967
  PV UUID               D9rfJy-SqUn-I6Ca-PzzO-eb79-E61t-fHkwmu

ボリュームグループ(VG)を作成
main_group はVG名 (任意)

vgcreate main_group /dev/mapper/main_part

VGの確認

# vgscan
  Reading volume groups from cache.
  Found volume group "main_group" using metadata type lvm2
# vgdisplay
  --- Volume group ---
  VG Name               main_group
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               476.43 GiB
  PE Size               4.00 MiB
  Total PE              121967
  Alloc PE / Size       121967 / 476.43 GiB
  Free  PE / Size       0 / 0   
  VG UUID               LiXnT1-xe6V-dmpZ-r7fs-HZF4-14wT-VrFTy5

論理ボリュームを(LV)作成
swapはメモリの半分(8GB)割り当てる
rootは64GB割り当てる
homeは残り全部

lvcreate -L8G main_group -n swap
lvcreate -L64G main_group -n root
lvcreate -l 100%FREE main_group -n home

LVの確認

# lvscan
  ACTIVE            '/dev/main_group/swap' [8.00 GiB] inherit
  ACTIVE            '/dev/main_group/root' [64.00 GiB] inherit
  ACTIVE            '/dev/main_group/home' [404.43 GiB] inherit
# lvdisplay
  --- Logical volume ---
  LV Path                /dev/main_group/swap
  LV Name                swap
  VG Name                main_group
  LV UUID                79nm1Z-BCbW-Rhra-tryB-7lR9-XsCv-1jHiQD
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:14:18 +0000
  LV Status              available
  # open                 2
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1

  --- Logical volume ---
  LV Path                /dev/main_group/root
  LV Name                root
  VG Name                main_group
  LV UUID                FqcEYQ-0cUp-BMul-VxND-42Es-BHsE-Yj4zdB
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:14:50 +0000
  LV Status              available
  # open                 1
  LV Size                64.00 GiB
  Current LE             16384
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:2

  --- Logical volume ---
  LV Path                /dev/main_group/home
  LV Name                home
  VG Name                main_group
  LV UUID                VlSY7x-8Q0O-UFQL-rnQT-05xp-inTH-QLCieR
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:15:09 +0000
  LV Status              available
  # open                 1
  LV Size                404.43 GiB
  Current LE             103535
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:3
  --- Logical volume ---
  LV Path                /dev/main_group/swap
  LV Name                swap
  VG Name                main_group
  LV UUID                79nm1Z-BCbW-Rhra-tryB-7lR9-XsCv-1jHiQD
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:14:18 +0000
  LV Status              available
  # open                 2
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1

  --- Logical volume ---
  LV Path                /dev/main_group/root
  LV Name                root
  VG Name                main_group
  LV UUID                FqcEYQ-0cUp-BMul-VxND-42Es-BHsE-Yj4zdB
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:14:50 +0000
  LV Status              available
  # open                 1
  LV Size                64.00 GiB
  Current LE             16384
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:2

  --- Logical volume ---
  LV Path                /dev/main_group/home
  LV Name                home
  VG Name                main_group
  LV UUID                VlSY7x-8Q0O-UFQL-rnQT-05xp-inTH-QLCieR
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:15:09 +0000
  LV Status              available
  # open                 1
  LV Size                404.43 GiB
  Current LE             103535
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:3

フォーマットとマウント

LVをフォーマットする
マッピングされているので、次のような名前になる
/dev/mapper/VG名-LV名

# mkfs.ext4 /dev/mapper/main_group-root
# mkfs.ext4 /dev/mapper/main_group-home

スワップも

# mkswap /dev/mapper/main_group-swap

LVをマウントする
/mnt/にマウントする

# mount /dev/mapper/main_group-root /mnt/
# mkdir /mnt/home
# mount /dev/mapper/main_group-home /mnt/home
# swapon /dev/mapper/main_group-swap

ブートローダーをマウントする

# mkdir /mnt/boot/
# mount /dev/nvme0n1p1 /mnt/boot

設定し終えるとブロックデバイスはこんな感じ

# lsblk
NAME                  MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
nvme0n1               259:0    0   477G  0 disk  
├─nvme0n1p1           259:1    0   512M  0 part  /boot
└─nvme0n1p2           259:2    0 476.4G  0 part  
  └─cryptlvm          254:0    0 476.4G  0 crypt 
    ├─main_group-swap 254:1    0     8G  0 lvm   [SWAP]
    ├─main_group-root 254:2    0    64G  0 lvm   /
    └─main_group-home 254:3    0 404.4G  0 lvm   /home

Archのインスコ

baseとbase-develをインスコする
https://www.archlinux.jp/groups/x86_64/base/
https://www.archlinux.jp/groups/x86_64/base-devel/
このpacstrapコマンドでboot以外のフォルダも作られる

# pacstrap /mnt/ base base-devel 

マウントの設定ファイルを修正
システム起動時に自動的にマウントするため

# genfstab -p /mnt >> /mnt/etc/fstab

Archのインスコ (中で作業)

チェンジルートする

# arch-chroot /mnt

32bitのインテルのドライバーを入れるため
Miltilibを有効化。下の2行をコメントアウトする

# vi etc/pacman.conf
[multilib]
Include = /etc/pacman.d/mirrorlist

インテルのマイクロコードをインスコ

# pacman -Sy intel-ucode

マイクロコードを確認 (のちのち再起動後確認できる)

# dmesg | grep microcode
[    1.703624] microcode: sig=0x806ea, pf=0x80, revision=0x9a
[    1.703917] microcode: Microcode Update Driver: v2.2.

Linuxカーネルのコピーをインスコ

# pacman -S linux-headers linux-lts linux-lts-headers

initrdの設定

mkinitcpioはinitrd(initramfs)のイメージを作るためのスクリプト
下の様に修正する

# vi /etc/mkinitcpio.conf
HOOKS=(base udev autodetect keyboard keymap modconf block encrypt lvm2 filesystems fsck)

initramfsを生成する

# mkinitcpio -p linux
# mkinitcpio -p linux-lts # linux-lts をインスコした場合は

ブートローダーの設定

ローダーを作る
GRUBを使わずsystemd-bootを使用する

bootctl --path=/boot/ install

ローダーの設定をする
下のように編集する

# vi /boot/loader/loader.conf
default arch
timeout 3
editor 0 

arch.confを作成する
arch.confのXXXの伏せ字をblkidのコマンドのUUIDのIDの結果で埋める
PARTUUIDではないので注意する、またクォーテーションは含めない
vi だったらコマンドで (:r !blkid) で結果を読み込める

# blkid
/dev/nvme0n1p2: UUID="XXX" TYPE="crypto_LUKS" PARTLABEL="Linux LVM" PARTUUID="XXX2"
# vi /boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img # intel マイクロコードを読み込む
initrd /initramfs-linux.img # mkinitcpioで作成したimgを読み込む
options cryptdevice=UUID=XXX:cryptlvm root=/dev/mapper/main_group-root quiet rw

起動

# umount -R /mnt
# shutdown -r now
# # ~起動後~
# # rootでログインできればOK

再起動後のArchの設定

WiFi

live USBと同じ

ミラーリスト

ミラーリストで日本の優先度を一番にする

# vi /etc/pacman.d/mirrorlist

言語

localeの設定

# vi /etc/locale.gen
en_US.UTF-8 UTF8 # ←をアンコメントアウト
# localectl set-locale LANG=”en_US.UTF-8”

時間

時間の同期

# hwclock --systohc --utc

hostname

host名の追加

echo archer > /etc/hostname

Pacman

pacman.confにColorILoveCandyを追加
プログレスバーがpacmanに変わる

# vi/etc/pacman.conf
# Misc options
#UseSyslog
Color
#TotalDownload
CheckSpace
#VerbosePkgLists
ILoveCandy

ユーザーの追加

rootのPW変更

# passwd

Sudoerの設定
wheelグループはどんなコマンドも許可

# pacman -S sudo
# visudo # 下の2行のコメントを外す

## Uncomment to allow members of group wheel to execute any command
# wheel ALL=(ALL) ALL

一般ユーザー追加

# useradd -m -G wheel -s /bin/bash mike
# passwd mike
# reboot # 一応mikeユーザーでログインできることを確認する

一応仮想コンソール用ユーザーも追加する
mikeはGUI用のユーザーでnekoはCUI用
万が一mikeで問題が発生した時用に

# useradd -m -G wheel -s /bin/bash neko
# passwd neko

ルートユーザーでログインすることを無効化する

$ sudo passwd -l root

Yayのインスコ

$ sudo pacman -S git
$ sudo pacman -S make fakeroot # NOTE: これが依存PKG
$ git clone https://aur.archlinux.org/yay.git
$ cd yay
$ makepkg -si

Virtual Console

keymap

capslockをctrl化する
https://wiki.archlinux.jp/index.php/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%AE%E7%89%B9%E5%88%A5%E3%81%AA%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%AD%E3%83%BC
もとのキーマップをコピーして新しい設定を作る

# mkdir -p /usr/local/share/kbd/keymaps
# cp /usr/share/kbd/keymaps/i386/qwerty/us.map.gz /usr/local/share/kbd/keymaps/
# gunzip /usr/local/share/kbd/keymaps/us.map.gz

capslockをctrlに変更

# vi /usr/local/share/kbd/keymaps/us.map
...
keycode 58 = Control

読み込み

# loadkeys /usr/local/share/kbd/keymaps/us.map

起動時に読み込みにする場合
下を追記する

# vi /etc/vconsole.conf
...
KEYMAP=/usr/local/share/kbd/keymaps/us.map

X

タッチパッドのドライバー

libinputをインスコする

$ pacman -S xf86-input-libinput

Install

インテルドライバーのインスコ

# pacman -S xf86-video-intel lib32-intel-dri lib32-mesa lib32-libgl

Xのインスコ

# pacman -S xorg-server xorg-xinit xorg-apps mesa xterm

Xが起動するか確認

# startx 

Font

元ネタ https://www.reddit.com/r/archlinux/comments/5r5ep8/make_your_arch_fonts_beautiful_easily/

フォントインスコ

$ sudo pacman -S ttf-dejavu ttf-liberation noto-fonts

プリセットの作成

$ sudo ln -s /etc/fonts/conf.avail/70-no-bitmaps.conf /etc/fonts/conf.d
$ sudo ln -s /etc/fonts/conf.avail/10-sub-pixel-rgb.conf /etc/fonts/conf.d
$ sudo ln -s /etc/fonts/conf.avail/11-lcdfilter-default.conf /etc/fonts/conf.d

/etc/fonts/local.confに下のように設定フィアルを作成する
再起動するとフォントがきれいになっている

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match>
        <edit mode="prepend" name="family"><string>Noto Sans</string></edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family"><string>serif</string></test>
        <edit name="family" mode="assign" binding="same"><string>Noto Serif</string></edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family"><string>sans-serif</string></test>
        <edit name="family" mode="assign" binding="same"><string>Noto Sans</string></edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family"><string>monospace</string></test>
        <edit name="family" mode="assign" binding="same"><string>Noto Mono</string></edit>
    </match>
</fontconfig>

IME

日本語フォントをインスコする

$ pacman -S otf-ipafont

Fcitxをインスコする

$ pacman -S fcitx fcitx-mozc fcitx-configtool

下のように.xinitrcを作成する

$ cat .xinitrc 
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=”@im=fcitx” 

Fcitx configurationで下のように設定して、
再起動するとIMEが使えるようになる

add mozc and prioritize it more over Keyboard English
change default keyboard layout to to English(US)
Global config > show advance options
    active input method = lart
    inactive input method = ralt

ファンクションキー

Fnキーの挙動をインバートするにはFn+Escを押下すればOK
参考 https://bbs.archlinux.org/viewtopic.php?id=233368

Keymap

capslockを無効化する
ログイン中かえたいなら setxkbmap -option ctrl:nocaps でもOK
恒久的に変えたいので、X configuration fileを修正する
/etc/X11/xorg.confを変更せず、自分で設定ファイルを追加する
xorg.confはHWを変更すると壊れやすいため
なお、ファイルの頭の数字は2桁で読み込み順番に関係する
再起動すればXで反映されている

# vi /etc/X11/xorg.conf.d/20-keyboard-layout.conf
Section "InputClass"
    Identifier       "keyboard_layout"
    MatchIsKeyboard  "on"
    Option           "XkbLayout"  "us"
    Option           "XkbOptions" "ctrl:nocaps"
EndSection

Thinkpad X1 carbon 6gen用の設定

休止状態の設定

もう一度 mkinitcpio.confを編集してresume を追加する

# vi /etc/mkinitcpio.conf
HOOKS=(base udev autodetect keyboard keymap modconf block encrypt lvm2 resume filesystems fsck)

initramfsのイメージを生成する

mkinitcpio -p linux
# mkinitcpio -p linux-lts

arch.confを以下のように修正する。
resume=/dev/mapper/main_group-swap の設定を追加する

title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options cryptdevice=UUID=XXX:cryptlvm root=/dev/mapper/main_group-root resume=/dev/mapper/main_group-swap quiet rw

サスペンドの設定

サポートされているサスペンドの設定の確認

# dmesg | grep -i "acpi: (supports"
[    0.979007] ACPI: (supports S0 S4 S5)

再起動しBIOSからSleep StateをLinuxに変更する
Config > Power > Sleep State > Linux

Sleep StateをLinuxに変更後
S3が追加されている

# dmesg | grep -i "acpi: (supports"
[    1.053591] ACPI: (supports S0 S3 S4 S5)

CPUのクロックスロットリングの問題

パッチを当てる
CPUのクロック数がおかしいときがあるため

# aurman -S lenovo-throttling-fix-git
# sudo systemctl enable --now lenovo_fix.service

BIOS更新

現状のバージョン確認
最近買ったので最新だった

https://pcsupport.lenovo.com/us/zh/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x1-carbon-6th-gen-type-20kh-20kg/downloads/ds502281

# dmidecode -s bios-version
N23ET59W (1.34 )

もし、上げる場合は、ファームウェアを更新する
fwupdをインスコする

# pacman -S fwupd

Laptopが電源につなぐ。
BIOSのバージョンあげるのは自己責任で

# fwpudmgr refresh 
# fwpudmgr get-updates
# fwupdmgr update

Trim SSD

SSDのTRIMとはHDDでいうデフラグ的なもの
できるか確認。SSDの1行目か2行目に0でない値があれば可能

# lsblk --discard
NAME                  DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
nvme0n1                      0      512B       2T         0
├─nvme0n1p1                  0      512B       2T         0
└─nvme0n1p2                  0      512B       2T         0
  └─cryptlvm                 0        0B       0B         0
    ├─main_group-swap        0        0B       0B         0
    ├─main_group-root        0        0B       0B         0
    └─main_group-home        0        0B       0B         0

定期的なトリミングを有効化する
Ubuntuでもしていないらしいので、する必要もないのかもしれない?

# pacman -S utils-linux
# systemctl enable fstrim.timer

その他

pacmanのメモ

# pacman -S <word> # パッケージインスコ
# pacman -R <word> # パッケージ削除
# pacman -Syy # パッケージリストの更新 (`apt update`)
# pacman -Syyu # パッケージリストの更新とパッケージ更新
# pacman -Ss <word> # wordでパッケージを検索する
# pacman -Qs <word> # wordでローカルでローカルのパッケージを検索する
# pacman -Qsi <word> # Qsの詳細
# pacman -Ql # ローカルのパッケージ一覧
# pacman -Syu # パッケージのアップグレード

用語

  • LVM (Logicl Volume Manager) はブロックデバイスを仮想化する機能。
    • PV(物理ボリューム): ようするにハードディスクそのもの
    • VG(ボリュームグループ): ようするにRAIDでいうJBOD(スパニング)
    • LV(論理グループ): ようするにパーテーション
  • ループデバイスは通常のファイルをブロックデバイスとして読み書きできるようにする機能

References

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

Python内のデフォルトパスを通す方法(Windows, Linux)

やりたいこと

自分のpyファイルをsysなどのモジュールのようにimportして使いたい。

次のような書き方を、

import sys
sys.path

例えば自分が作ったmypy.pyでもやりたい。

import mypy
mypy.func()

つまり、Pythonの中でパスを通したい

2019年の今、色んなページにこの方法(全部または一部)が書かれていますが、ちょっとハマってしまったのでQiitaに書きます。

venv仮想環境を作るほどでもないときに使うのだと思います。

方法

PYTHONPATHというPythonが使用する環境変数があります。

PYTHONPATHの値に、自分のpyファイルが置いてあるフォルダのパスを入力すればOKです。

PYTHONPATHの公式の説明が読みたい方は、こちらへ。

https://docs.python.jp/3/using/cmdline.html#envvar-PYTHONPATH

WindowsでPYTHONPATHを新規作成する

例えば、自分のpyファイルmypy.pyC:\scriptにあるとします。

フォルダ構成はこんな感じだとして、

C:
    \script
        \mypy.py
        \mypy2.py

        \sub-script
            subpy.py

エクスプローラーを開いて、

左ナビゲーションバーのPCを右クリック > プロパティ > システムの詳細設定 > 環境変数 > 新規

にて環境変数PYTHONPATHを入力し、値にフォルダのパスを入力します。

image.png

複数のフォルダを指定したい場合は、C:\script;C:\script2のように;つなぎです。

そして、もし、SpyderやAnaconda Promptを起動していたら、再起動してください(Windowsの再起動は不要です)。

パスが通せたか確認する

その後、

import sys
sys.path

を実行すれば、C:\\scriptがパスに追加されていることが確認できます(\は自動で\\になります)。

In[11]: sys.path
Out[11]: 
['C:\\Users\\maech',
 'C:\\script', ...  <-- 追加されている
自分のpyファイルをimportする

これで、C:\script\*.pyのすべてのpyファイルがimportできます。

# C:\script\mypy.pyをインポート
import mypy
# mypy.pyに定義したfunc()を使う
a = mypy.func()
# mypy.pyに定義したクラスmypyのfunc()を使う
a = mypy.mypy.func()
# この場合は from mypy import mypy とすると a = mypy.func() で呼び出せる

# C:\script\mypy2.pyをインポート
import mypy2

# C:\script\sub-script\subpy.pyをインポート
import sub-script.subpy

Linuxでやりたい人

例えば、~/.bashrcPYTHONPATHと値を追加してください。複数パスの指定は:つなぎです。

詳しくは省略。

参考

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

AWSでDjangoのWEBサーバーを作る(Amazon Linux 2、HTTPS化)

Djangoのウェブサーバーを作ります。ハッカソンとかで良く使うのでメモです。

インスタンスの作成

EC2のダッシュボードを開き、インスタンスを作成します。
イメージはAmazon Linux 2 AMI (HVM), SSD Volume Type - ami-0d7ed3ddb85b521a6を選択しました。

インスタンスタイプはt2.microです。
セキュリティグループの設定で、SSH(22)HTTP(80)HTTPS(443)TCP(8000)用のポートを開放します。

キーペアを任意の名前で作成し、できた.pemファイルをPuTTY genで.ppkファイルに変換します。

インスタンスの作成が完了したら、Elastic IPを開き、新しいアドレスを割り当てます。作成したインスタンスにそのIPアドレスを関連付けます。

ドメインを取得

Route53でdomainを作ってください。
django03.PNG

www.{name}.com のValueのところにElastic IPを設定します。

チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする

PuTTYでパブリックIPもしくは、DNS名(www.{name}.com)でSSH接続します。ここで.ppkファイルを使います。ユーザー名はec2-userです。

sudo yum update -y
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
sudo yum install -y httpd mariadb-server
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl is-enabled httpd

Test Pageを表示( http://www.{name}.com )します。

sudo usermod -a -G apache ec2-user
exit

もう一回ログインします。

groups
sudo chown -R ec2-user:apache /var/www
sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;

HTTPSに対応させます。(Google Home MiniでWebAPIを使ったアプリ作るときとかに必要だったので)

sudo systemctl is-enabled httpd
sudo systemctl start httpd && sudo systemctl enable httpd
sudo yum update -y
sudo yum install -y mod_ssl

インスタンスを再起動します。

sudo systemctl restart httpd

HTTPSで接続(https://www.{name}.com )します。
プライバシーエラーになりますが、下の詳細設定からアクセスできます。
保護されていないアクセスとなります。

CA 署名証明書の取得

付録: Amazon Linux 2 での Let's Encrypt と Certbot の使用を参考にします。

sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
sudo yum-config-manager --enable epel*
sudo yum repolist all

/etc/httpd/conf/httpd.confのListen 80の下に追記します。

sudo vi /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
    DocumentRoot "/var/www/html"
    ServerName "{name}.com"
    ServerAlias "www.{name}.com"
</VirtualHost>

Cerbotを実行します。

sudo systemctl restart httpd
sudo yum install -y certbot python2-certbot-apache
sudo certbot

1."Enter email address (used for urgent renewal and security notices)" というプロンプトが表示されたら、メールアドレスを入力し、Enter

2.Let's Encrypt のサービス利用規約に同意するため、Aを入力し、Enter

3.EFF のメーリングリストに登録するための承認のため、Yを入力し、Enter

4.共通名およびサブジェクト代替名 (SAN) が表示され、2を入力し、Enter

1: {name}.com
2: www.{name}.com

5.HTTP クエリを HTTPS にリダイレクトするどうかの確認で、HTTPS 経由の暗号化接続のみ受け入れる場合、2を入力し、Enter

HTTPS( https://www.{name}.com )に安全に接続できることを確かめます。

Certbot を自動化

sudo vi /etc/crontab 
39 1,13 * * * root certbot renew --no-self-upgrade
sudo systemctl restart crond

Djangoやーる

ここからは、LAMP環境作ったのに、Djangoやーるっていう内容です。
Amazon Linux 2にAnacondaをインストールします。

wget https://repo.continuum.io/archive/Anaconda3-2018.12-Linux-x86_64.sh
bash Anaconda3-2018.12-Linux-x86_64.sh

yesを入力してインストール、最後にyesを入力して.bashrcを生成します。

/home/ec2-user/anaconda3にインストールされました。
Django用にPython3.6環境を作ります。

conda create -n django python=3.6

condaのコマンドがないと言われたら、

source /home/ec2-user/anaconda3/etc/profile.d/conda.sh

PATHが通ってないので、cat /home/ec2-user/.bashrcで確認しましょう。

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
# added by Anaconda3 2018.12 installer
# >>> conda init >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$(CONDA_REPORT_ERRORS=false '/home/ec2-user/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "/home/ec2-user/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/home/ec2-user/anaconda3/etc/profile.d/conda.sh"
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="/home/ec2-user/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda init <<<

cat /home/ec2-user/.bashrc-anaconda3.bakも確認しましょう。

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

Anacondaでdjango環境に入り、Djangoをインストールします。

source activate django
(django) pip install django
(django) django-admin startproject project_name
(django) cd helloworld
(django) python manage.py migrate
(django) python manage.py runserver

もし、activateがないと言われたら、

source /home/ec2-user/anaconda3/bin/activate django

次にHTTPSに対応させます。

pip install django-sslserver
cd helloworld
sudo vi settings.py
DEBUG = False
ALLOWED_HOSTS = ['www.{name}.com']

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sslserver',
]

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

python manage.py runsslserver 0.0.0.0:8000の後に、.crtと.keyを指定する必要があります。/etc/letsencrypt/live/www.{name}.com/ 以下にあるのですが、.pemファイルになっているので、拡張子を変えてコピペします。

sudo cp /etc/letsencrypt/live/www.{name}.com/fullchain.pem /etc/letsencrypt/live/www.{name}.com/fullchain.crt
sudo cp /etc/letsencrypt/live/www.{name}.com/privkey.pem /etc/letsencrypt/live/www.{name}.com/privkey.key
sudo chmod 755 /etc/letsencrypt/live/
sudo chmod 755 /etc/letsencrypt/live/www.{name}.com/fullchain.crt
sudo chmod 755 /etc/letsencrypt/live/www.{name}.com/privkey.key

実行してみましょう。

python manage.py runsslserver 0.0.0.0:8000 --certificate /etc/letsencrypt/live/www.{name}.com/fullchain.crt --key /etc/letsencrypt/live/www.{name}.com/privkey.key

https://www.{name}.com:8000/ )に接続します。

Not Found
The requested resource was not found on this server.

https://www.{name}.com:8000/admin/ )に接続します。

django01.PNG

adminユーザーを作るには、下記のようにします。

(django) [ec2-user@ip-xxx-xx-xx-xx helloworld]$ python manage.py createsuperuser
Username (leave blank to use 'ec2-user'): admin
Email address: gachi.kumamcn@gmail.com
Password:
Password (again):
Superuser created successfully.

HelloWorld

HelloWorldコンテンツを作成します。

views.pyを作成します。

from django.http import HttpResponse

def helloworld(req):
  return HttpResponse('Hello, World !!')

settings.pyにhelloworldを追加します。

INSTALLED_APPS = [
    ....
    'helloworld',
]

urls.pyにもhelloworldを追加します。

import helloworld.views
urlpatterns = [
    path('helloworld/', helloworld.views.helloworld),
    path('admin/', admin.site.urls),
]

実行して、( https://www.{name}.com:8000/helloworld/ )に接続します。
django02.PNG

バックグラウンドで実行

バックグラウンドでサーバーを起動します。
末尾に&をつけるだけだと、標準出力されてしまいますので、nohupと&で囲みましょう。

nohup python manage.py runsslserver 0.0.0.0:8000 --certificate /etc/letsencrypt/live/www.{name}.com/fullchain.crt --key /etc/letsencrypt/live/www.{name}.com/privkey.key > /dev/null 2>&1 < /dev/null &

バックグラウンドのサーバーを停止します。

ps -ef|awk 'BEGIN{}{if(match($8, /python/))system("kill -9 " $2)}END{}'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

top コマンドでよく使う or 便利そうな機能

top コマンドと言えば、リソースの状況確認に使えるコマンドですが、実は結構多機能です。今回は、個人的によく使う機能や便利そうだと思う機能を調べたので、まとめました。

対象バージョンは次のとおりです。

$ top -v
procps-ng version 3.3.10

ヘルプ (h or ? キー)

top コマンド実行中に「h or ?」で、ヘルプを表示できます。top コマンドを終了させずに対話型のコマンドを確認できるので、非常に便利です。

文字列検索 (L キー)

top コマンド実行中に「L -> 文字列入力 -> Enter」で、ヒットした文字列を含むプロセスを上部に表示できます。ヒット部分はハイライトされます。

実行例 (入力キー: L,"cpu",Enter,L,"bash",Enter,L,"20",Enter)
5_search.gif

ユーザ毎に監視 (u キー)

top コマンド実行中に「u -> ユーザ名を入力 -> Enter」でユーザ毎のリソース使用状況を監視できます。

実行例 (入力キー: u,"guest",Enter)
top_u.gif

プロセスを終了させる (k キー)

top コマンド実行中に「k -> 終了させたい PID 入力 -> Enter」で、入力した PID の プロセスを終了 (SIGTERM シグナルを発行)できます (送信シグナルは変更可)。

実行例 (入力キー: L,"top",k,"16973",Enter,Enter)
top_k2.gif

コマンドを詳細に表示 (c キー)

top コマンド実行中に「c」で、実行コマンド (COMMAND) をフルパスか、[]付きで表示できます。[]付きは、カーネルモードで動作していることを意味します。

実行例

 top - 22:08:04 up 4 days,  6:11,  1 user,  load average: 0.61, 0.72, 0.45
 ... (略) ...

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                      
  1516 root      20   0 4367388 654408 107028 S   3.3  8.1  22:27.82 /usr/bin/gnome-shell         
 19753 root      20   0  790540  39864  29668 S   0.7  0.5   0:02.43 /usr/libexec/gnome-terminal+ 
  1154 gdm       20   0  845936  25776  18680 S   0.3  0.3   3:09.20 /usr/libexec/gsd-color       
 20036 root      20   0  162460   4580   3868 R   0.3  0.1   0:00.08 top                          
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.17 [kthreadd]                   
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kworker/0:0H]               
     6 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [mm_percpu_wq] 

ソート関連 (<, >, P, M, R キー)

top コマンド実行中に
「<」「>」で、ソート対象のカラムを選択できます。
「P」で、CPU の使用量順にソートできます。
「M」で、メモリの使用量順にソートできます。
「R」で、ソートの昇順/降順を切り替えられます。

さらに「z, x, b」で、どのカラムを選択しているのか分かりやすくできます。
z...カラー/モノクロ切り替え
x...選択カラムをハイライト
b...選択カラムのハイライトをより分かり易くする

実行例 (入力キー: z,x,b,>,<,<,<,<,<,<,<,<)
5_sort.gif

ちなみに「Z」で、詳細なカラーリングの設定ができます。

CPU、メモリ、スワップの使用率を視覚的に表示 (t, m キー)

top コマンド実行中に「t -> t」で、CPUの使用率を視覚的(横棒グラフ)に表示できます。同様に「m -> m」で、メモリ、スワップの使用率も視覚的に表示できます。

さらに「z」で、横棒グラフの内訳を分かりやすく表示できます。

実行例 (入力キー: t,t,m,m,z)
5_mem_cpu_toggle.gif

CPU コア毎の情報を表示 (1 キー)

top コマンド実行中に「1」で、CPU コア毎の情報を表示できます。デフォルトでは、複数の CPU コア情報が1つに纏められており %Cpu(s) と表示されています。

実行例

 top - 22:06:48 up 4 days,  6:10,  1 user,  load average: 0.56, 0.74, 0.43
 Tasks: 270 total,   1 running, 269 sleeping,   0 stopped,   0 zombie
 %Cpu0  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st ★
 %Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st ★
 %Cpu2  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st ★
 %Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st ★
 ... (略) ...

プロセス毎の CPU 使用率を CPU コア数の総使用率で表示 (I キー)

top コマンド実行中に「I (ラージアイ)」で、プロセス毎の CPU 使用率を CPU コア数の総使用率で表示できます。デフォルトでは、プロセス毎に使用している CPU コアの使用率が表示されています。

次の実行例では、CPU コア数が4つのシステムで、CPU に負荷を掛けています($ stress --cpu 1)。%Cpu3、%CPU がそれぞれ 100 になります。%Cpu3 が3番目の CPU コア情報で、%CPU が stress コマンドの CPU 使用率です。

# 1つの CPU コアに負荷を掛ける
$ stress --cpu 1 &

$ top (1 キー 押下の状態)
top - 22:02:01 up 4 days,  6:05,  1 user,  load average: 0.96, 0.44, 0.22
Tasks: 272 total,   2 running, 270 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.7 us,  0.0 sy,  0.0 ni, 98.6 id,  0.0 wa,  0.7 hi,  0.0 si,  0.0 st
%Cpu2  :  0.7 us,  0.0 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
        ^^^^^^^^
KiB Mem :  8093920 total,   690324 free,  2598136 used,  4805460 buff/cache
KiB Swap:  8225788 total,  8043004 free,   182784 used.  4710784 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU   %MEM     TIME+ COMMAND
19817 root      20   0    7904     96      0 R 100.0    0.0   0:39.91 stress
                                                                                              ^^^^^^

この状態で「I」を押下すると、%CPU が 24.9(約25) と表示されます。これは、stress コマンドの CPU 使用率(100)が4つある CPU コア数の総使用量で表示されている(100/4 = 25)ためです。

top - 22:05:08 up 4 days,  6:08,  1 user,  load average: 1.06, 0.77, 0.40
Tasks: 272 total,   2 running, 270 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8093920 total,   687224 free,  2600356 used,  4806340 buff/cache
KiB Swap:  8225788 total,  8043004 free,   182784 used.  4708324 avail Mem 

  PID USER      PR  NI    VIRT    RES   SHR  S  %CPU   %MEM     TIME+ COMMAND
19817 root      20   0    7904     96     0  R  24.9      0.0   3:46.19 stress
                                                                                                ^^^^

なお、システムの CPU コア数は、
 $ nproc
 $ grep -c processor /proc/cpuinfo
 $ getconf _NPROCESSORS_ONLN
などからも確認できます。

設定を保存 (W キー)

top コマンド実行中に「W」で、前述の設定などを保存(~/.toprcに保存)できます。例えば「z -> W」とすると、top コマンド実行時は常に「z」を押下した(カラーリングされた)状態になります。

設定をリセットする場合は、設定ファイルを削除 ($ rm ~/.toprc) すれば、OK です。

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