20200706のLinuxに関する記事は6件です。

iptablesを使ってWebサーバをポートフォワーディング

概要

Linuxで、あるwebサーバの「ホスト名:ポート番号」を「別のホスト:ポート番号」へ転送(つまりポートフォワーディング)する方法について記載。実現にはCentOSやUbuntu等に標準搭載されている「iptables」を利用。
今回紹介する内容は、おそらくCentOS7以降にデフォルトで入っているfirewalldなどでも実現できるが、極力環境に依存せずにポートフォワーディングする方法を模索した結果、iptablesを使うことにした。
iptableでのポートフォワーディング方法を紹介する記事はそれなりにあるが、それらの方法を素直に試しても上手くいかず、実現までにかなりハマったので本記事で改めてまとめる。
今回動作を確認したのはhttp(https)のプロトコルのみだが、TCP通信であれば他のプロトコル(ssh,ftpなど)でも動くはず。

実現したい構成

  • webサーバ(転送先)のIPアドレスは23.45.67.89、ポートは80
  • ポートフォワーディングの設定を行う転送元サーバのIPアドレスは192.168.1.4
  • クライアントから転送元サーバにhttp://192.168.1.4:10080をリクエストすると、転送元サーバがwebサーバにポートフォワーディングして、http://23.45.67.89:80のサイトへリクエスト。
  • リクエスト送信後、webサーバが返すレスポンスをクライアントで閲覧可能

fig1.png

iptablesによる実装

転送元サーバで、以下のコマンドを実行

(1) PREROUTINGチェイン

  • クライアント入ってくるリクエストで、宛先のIPアドレスとポートを変換
    • --dport : 変換前の宛先ポート番号
    • --to-destination : 変換後の「宛先IP : ポート番号」
$ sudo iptables -t nat -A PREROUTING -p tcp \
                --dport 10080 -j DNAT \
                --to-destination 23.45.67.89:80

(2) POSTROUTINGチェイン

  • 転送元サーバから外に出ていくパケットに関する記述
    • --d : 変換後のIPアドレス
    • --dport : 変換後の宛先ポート番号
    • -j MASQUERADE : IPマスカレードを行う
$ sudo iptables -t nat -A POSTROUTING -p tcp \
                -d 23.45.67.89 --dport 80 \
                -j MASQUERADE

(3) FORWARDチェイン

  • クライアントから送信したパケットの通過を許可するために必要な記述。
  • TCP通信の場合、3way-handshakeと呼ばれる方法で双方向通信が行われるため、両方の通信を許可するための設定が必要

  • 「クライアント → webサーバ」へのパケット通過を許可するコマンドが下記

$ sudo iptables -A FORWARD -p tcp \
                -d 23.45.67.89 --dport 80 \
                -j ACCEPT
  • 一方で「webサーバ → クライアント」へのパケット通過を許可するコマンドが下記
    • 逆方向の設定なので、webサーバのIPアドレスとポートを記載したオプションが「-s : 送信元アドレス」「--sport : 送信元ポート番号」になっていることに注意
    • 2行目の記述「! --syn -m state --state ESTABLISHED」は特定の条件を満たした通信のみ許可するための記述。セキュリティを気にしなければ省略しても問題ないはず。
$ sudo iptables -A FORWARD -p tcp \
                ! --syn -m state --state ESTABLISHED \
                -s 23.45.67.89 --sport 80 \
                -j ACCEPT

(4) OUTPUTチェイン

  • 転送元サーバからのリクエストもポートフォワーディングしたい場合に記載
  • 書き方はチェイン名をOUPUTとする以外は(1)のPREROUTINGと同じ
$ sudo iptables -t nat -A OUTPUT -p tcp \
                --dport 10080 -j DNAT \
                --to-destination 23.45.67.89:80
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxコマンド<基礎1>

Linuxの基礎コマンドを備忘録として記載する。

カーソル移動コマンド

コマンド 内容
Ctrl + b 後方に1文字分移動
Ctrl + f 前方に1文字文移動
Ctrl + a 行頭に移動
Ctrl + e 行末に移動

lsコマンド

ファイルやディレクトリを一覧表示するコマンド

[wataru@localhost ~]$ ls 
#引数なしの場合は、ファイル、ディレクトリのみが出力される
123.gz   diary.sh   Downloads  head.txt     Pictures   tmp        wc.txt
case.sh  dir1       echo.sh    homesize.sh  Public     tree.sh
Desktop  dir1.tar   for.sh     if.sh        Templates  Videos
diary    Documents  func.sh    Music        test.sh
[wataru@localhost ~]$ ls -l
#-lオプションを使用すると、ファイル属性等の詳細情報も込みで出力される
total 64
-rw-rw-r--. 1 wataru wataru    97 Jul  3 20:39 123.gz
-rwxrwxr-x. 1 wataru wataru    71 Jun 22 04:52 case.sh
drwxr-xr-x. 2 wataru wataru     6 Jun  6 17:30 Desktop
drwxrwxr-x. 2 wataru wataru    28 Jun 24 04:46 diary
-rwxrwxr-x. 1 wataru wataru   174 Jun 24 04:45 diary.sh
drwxrwxr-x. 2 wataru wataru    60 Jul  3 04:28 dir1
-rw-rw-r--. 1 wataru wataru 10240 Jul  3 21:25 dir1.tar
#-lオプションで出力された詳細情報の意味は以下となる
drwxrwxr-x. 2 wataru wataru    60 Jul  3 04:28 dir1
---------------------------------------------------
d :ファイルタイプ
rwxrwxr-x. :ファイルモード
2 :リンク数
wataru :オーナー
wataru :グループ
60 :ファイルサイズ
Jul  3 04:28 :タイムスタンプ
[wataru@localhost ~]$ ls -a
#-aオプションを使用すると、隠しファイルも合わせて出力される
#ファイル名が「.(ドット)」で始まるファイルを隠しファイルとしている
.              .cache    dir1.tar   head.txt       Pictures   Videos
..             case.sh   Documents  homesize.sh    .pki       .viminfo
123.gz         .config   Downloads  .ICEauthority  Public     wc.tar.gz

[wataru@localhost ~]$ ls -F
#-Fオプションを使用すると、ファイル種別が出力される
123.gz    diary.sh*   Downloads/  head.txt      Pictures/   tmp/       wc.txt
case.sh*  dir1/       echo.sh*    homesize.sh*  Public/     tree.sh*
Desktop/  dir1.tar    for.sh*     if.sh*        Templates/
-Fオプションの種別
種別 記号
通常ファイル なし
ディレクトリ /
実行可能ファイル *
シンボリックリンク @

pwdコマンド

カレントディレクトリを表示する

[wataru@localhost ~]$ pwd
/home/wataru

cdコマンド

カレントディレクトリを変更する

[wataru@localhost ~]$ cd ..
[wataru@localhost home]$ pwd
/home
[wataru@localhost home]$ 

mkdirコマンド

ディレクトリを作成する

[wataru@localhost tmp]$ ls -l
total 0
[wataru@localhost tmp]$ mkdir testdir
#mkdirコマンドの後に作成するディレクトリ名を入力する
[wataru@localhost tmp]$ ls -l
total 0
drwxrwxr-x. 2 wataru wataru 6 Jul  3 22:12 testdir
[wataru@localhost tmp]$ mkdir -p work/2020/07
#-pオプションを使用すると、深いディレクトリを一気に作成できる
#今回の場合、work ⇒ 2020 ⇒ 07と作成されている
[wataru@localhost tmp]$ ls -l
total 0
drwxrwxr-x. 2 wataru wataru  6 Jul  3 22:12 testdir
drwxrwxr-x. 3 wataru wataru 18 Jul  3 22:16 work
[wataru@localhost tmp]$ cd work
[wataru@localhost work]$ ls -l
total 0
drwxrwxr-x. 3 wataru wataru 16 Jul  3 22:16 2020
[wataru@localhost work]$ cd 2020
[wataru@localhost 2020]$ ls -l
total 0
drwxrwxr-x. 2 wataru wataru 6 Jul  3 22:16 07

touchコマンド

ファイルを作成する

[wataru@localhost tmp]$ touch ./testdir/work2020.txt
#touchでwork2020.txtを作成した
[wataru@localhost tmp]$ ls -lF ./testdir/work2020.txt
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:21 ./testdir/work2020.txt
[wataru@localhost testdir]$ touch test.{01..10}
#一気に複数ファイルを作成することができる
#{01..10}はブレース展開という機能
#連番リストを作成できる
[wataru@localhost testdir]$ ls -l
total 0
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.01
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.02
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.03
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.04
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.05
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.06
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.07
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.08
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.09
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.10
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:21 work2020.txt

rmコマンド

ファイル・ディレクトリを削除する

[wataru@localhost testdir]$ ls -l
total 0
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.01
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.02
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.03
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.04
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.05
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.06
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.07
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.08
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.09
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.10
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:21 work2020.txt
[wataru@localhost testdir]$ rm test.01 test.10
#複数ファイル削除することが出来る
#今回の例だと、test.01 test.10を削除した
[wataru@localhost testdir]$ ls -l
total 0
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.02
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.03
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.04
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.05
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.06
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.07
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.08
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:24 test.09
-rw-rw-r--. 1 wataru wataru 0 Jul  3 22:21 work2020.txt
[wataru@localhost tmp]$ ls -l
total 0
drwxrwxr-x. 2 wataru wataru 146 Jul  5 03:59 testdir
drwxrwxr-x. 3 wataru wataru  18 Jul  3 22:16 work
[wataru@localhost tmp]$ rm testdir
#rmコマンドでディレクトリを削除すると、エラーが出る
#ただ、-rオプションを使用すると、ディレクトリを削除できる
#削除対象のディレクトリの中のファイルやディレクトリもまとめて削除される
rm: cannot remove 'testdir': Is a directory
[wataru@localhost tmp]$ rm -r testdir/
[wataru@localhost tmp]$ ls -l
total 0
drwxrwxr-x. 3 wataru wataru 18 Jul  3 22:16 work
[wataru@localhost work]$ rm -i work.01.txt 
#-iオプションを使用すると、削除前の確認をすることができる
rm: remove regular empty file 'work.01.txt'? y
[wataru@localhost work]$ ls
2020         work.03.txt  work.05.txt  work.07.txt  work.09.txt
work.02.txt  work.04.txt  work.06.txt  work.08.txt
wataru@localhost tmp]$ ls
testGo  work
[wataru@localhost tmp]$ rmdir testGo/
#rmdirコマンドは空のディレクトリを削除する
[wataru@localhost tmp]$ ls
work

catコマンド

ファイルを表示する

[wataru@localhost work]$ cat work.02.txt 
#ファイルの中身が表示される
2020/07/05
test?cat
123445
[wataru@localhost work]$ cat -n work.02.txt 
#-nオプションを使用すると、行番号を付けて内容が表示される
     1  2020/07/05
     2  test?cat
     3  123445
     4  

cpコマンド

ファイルやディレクトリをコピーする

[wataru@localhost work]$ ls
testgo       work.03.txt  work.05.txt  work.07.txt  work.09.txt
work.02.txt  work.04.txt  work.06.txt  work.08.txt
[wataru@localhost work]$ cp work.0* testgo
#cp <コピー元> <コピー先>でファイルをコピーすることができる
#「work.0*」のように「*」指定すると複数のファイルが一気にコピーできる
[wataru@localhost work]$ cd testgo/
[wataru@localhost testgo]$ ls
work.02.txt  work.04.txt  work.06.txt  work.08.txt
work.03.txt  work.05.txt  work.07.txt  work.09.txt
[wataru@localhost work]$ cp -i work.0* testgo
#-iオプションを使用すると、rmコマンド同様に実行前に確認することができる
wataru@localhost work]$ cp gogodur testgo
#ディレクトリをコピーすると、エラーとなる
cp: -r not specified; omitting directory 'gogodur'
[wataru@localhost work]$ cp -r gogodur testgo
#-rオプションを使用すると、コピーすることができる
[wataru@localhost testgo]$ ls
gogodur      work.03.txt  work.05.txt  work.07.txt  work.09.txt
work.02.txt  work.04.txt  work.06.txt  work.08.txt

mvコマンド

ファイルを移動する

[wataru@localhost testgo]$ mv work.03.txt gogodur
[wataru@localhost testgo]$ ls  gogodur/
work.03.txt

[wataru@localhost testgo]$ ls
#mvコマンドで移動したファイルは移動元からはなくなる
gogodur      work.04.txt  work.06.txt  work.08.txt
work.02.txt  work.05.txt  work.07.txt  work.09.txt
wataru@localhost testgo]$ ls
gogodur      work.04.txt  work.06.txt  work.08.txt
work.02.txt  work.05.txt  work.07.txt  work.09.txt
[wataru@localhost testgo]$ mv work.04.txt mvfile.txt
#mvコマンドで移動元、移動先にファイルを指定すると、
#ファイル名が書き換わる
[wataru@localhost testgo]$ ls
gogodur     work.02.txt  work.06.txt  work.08.txt
mvfile.txt  work.05.txt  work.07.txt  work.09.txt#

lnコマンド

リンクを張る(ファイルに別名を付ける)
長いパス名を省略することもできる

wataru@localhost testgo]$ ln -s gogodur go
#-sオプションを使用すると、シンボリックリンクになる
[wataru@localhost testgo]$ ls -l
total 4
lrwxrwxrwx. 1 wataru wataru  7 Jul  6 05:01 go -> gogodur
#矢印でどのファイルを指定しているか分かる
drwxrwxr-x. 2 wataru wataru 25 Jul  6 04:46 gogodur
-rw-rw-r--. 1 wataru wataru  0 Jul  5 04:26 testtest.txt
-rw-rw-r--. 1 wataru wataru 28 Jul  5 04:26 work.02.txt
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu Desktop 20.04 の開発環境の構築メモ

はじめに

開発環境としての Ubuntu Desktop 20.04 LTS 日本語 Remix のインストールメモです。
基本的には「Ubuntu Desktop 18.04 開発環境の構築メモ」とほぼ同じです。

インストール先のマシンは以下です。

  • ThinkPad T480s

手順

Ubuntu Desktop 18.04 をインストール後に、以下の手順でアップグレード。

sudo apt update
sudo apt install update-manager
sudo apt dist-upgrade
sudo do-release-upgrade -d -f DistUpgradeViewGtk3

ホームディレクトリ内の日本語のディレクトリ名を英語に変更

「端末」から以下のコマンドを実行。

$ LANG=en_US.utf8 xdg-user-dirs-gtk-update

そして、上記実行後に「Update standard foloders to current language?」というウィンドウが出たので、「Update Names」ボタンを押下。

左 Ctrl キーと Caps Lock キーの入れ替え

以下を読みながら、いい感じにインストールしました。Emacs Input は OFF のままに。

システム時刻を UTC 管理から LocalTime 管理に変更

Windows 10 と Ubuntu のデュアルブート環境の場合、現状のこのままだと、Windows を起動すると、システム時刻が-9hになる。

以下のコマンドを実施して、Ubuntu のシステム時刻管理を LocalTime にする。

$ timedatectl status | grep local
      RTC in local TZ: no
$ sudo timedatectl set-local-rtc true
$ timedatectl status | grep local
      RTC in local TZ: yes
Warning: The system is configured to read the RTC time in the local time zone.
     'timedatectl set-local-rtc 0'.

Google Chrome のインストール

$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo dpkg -i google-chrome-stable_current_amd64.deb

Slack のインストール

以下サイトから deb ファイルをダウンロードする

その後、以下でインストール。

$ sudo apt install gconf2 gconf-service
$ sudo dpkg -i slack-desktop-4.0.2-amd64.deb

Hyper のインストール

以下サイトから deb ファイルをダウンロードする

その後、以下でインストール。

$ sudo apt install libappindicator1
$ sudo dpkg -i Downloads/hyper_3.0.2_amd64.deb

fish のインストール

参考記事: fish shellが結構良かった話

$ sudo apt install fish
$ fish
$ fish_config

ブラウザで fish shell configuration が表示されるので、「prompt」で「Informative Vcs」を設定。
そして、~/.bashrc に以下を追記。

exec fish

対話式で bash を使いたい場面があったときに、上記設定をすると bash を実行しても fish が起動してしまうため、対話式で bash  を fish 内で使うときは ~/.bashrc を読み取らないように ~/.config/fish/config.fish に以下を追記。

alias bash="bash --norc"

fisher をインストール。

$ sudo apt install curl
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish

Emacs のインストール

以下のように Emacs 27 をインストール。(※)

$ sudo snap install --classic --beta emacs 
$ sudo apt install emacs-mozc-bin
$ sudo apt install silversearcher-ag

.emacs を以下のように設定。

; package.el
(require 'package)
;; MELPAを追加
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
;; MELPA-stableを追加
(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/"))
;; Marmaladeを追加
(add-to-list 'package-archives  '("marmalade" . "https://marmalade-repo.org/packages/"))
;; Orgを追加
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))
;; 初期化
(package-initialize)


; 細かい設定
;; site-lisp path
(add-to-list 'load-path "~/.emacs.d/site-lisp")
;;not make backup files
(setq make-backup-files nil)
;; tab width 2
(setq-default tab-width 2 indent-tabs-mode nil)


; twittering-mode
(load "twittering-mode")
(setq twittering-allow-insecure-server-cert t)
(setq twittering-use-master-password t)


; web-mode
;; https://qiita.com/kwappa/items/6bde1fe2bbeedc85023e
;; どの拡張子を web-mode で開くかを指定
(add-to-list 'auto-mode-alist '("\\.php\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.html$" . web-mode))
(add-to-list 'auto-mode-alist '("\\.css$" . web-mode))
(add-to-list 'auto-mode-alist '("\\.js[x]?$" . web-mode))
;; 拡張子 .js でもJSX編集モードに
(setq web-mode-content-types-alist
      '(("jsx" . "\\.js[x]?\\'")))
;; インデント
(add-hook 'web-mode-hook
          '(lambda ()
             (setq web-mode-attr-indent-offset nil)
             (setq web-mode-markup-indent-offset 2)
             (setq web-mode-css-indent-offset 2)
             (setq web-mode-code-indent-offset 2)
             (setq web-mode-sql-indent-offset 2)
             (setq indent-tabs-mode nil)
             (setq tab-width 2)
          ))


;日本語入力
;; https://qiita.com/Maizu/items/fee34328f559c7dc59d8#emacs-mozc
;;半角全角キーで日本語入力をすると、日本語入力モードで `Ctrl + [なにか]` をやるときにうまく動作しない。
;;また、`Ctrl + \` での日本語入力モードだと、「ん」を入力するときにうまくいかない。
;;上記を解決するために emacs-mozc をインストールする。
(require 'mozc)                                 ; mozcの読み込み
(set-language-environment "Japanese")           ; 言語環境を"japanese"に
(setq default-input-method "japanese-mozc")     ; IMEをjapanes-mozcに
(prefer-coding-system 'utf-8)                   ; デフォルトの文字コードをUTF-8に(require 'mozc)
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(package-selected-packages (quote (mozc))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )


; Helm
;; https://qiita.com/jabberwocky0139/items/86df1d3108e147c69e2c
(require 'helm-config)
(helm-mode 1)
(global-set-key (kbd "M-x") 'helm-M-x)
(global-set-key (kbd "C-x b") 'helm-mini)
(global-set-key (kbd "C-x C-f") 'helm-find-files)
;; rebind tab to run persistent action
(define-key helm-map (kbd "&lt;tab&gt;") 'helm-execute-persistent-action)
;; make TAB work in terminal
(define-key helm-map (kbd "C-i") 'helm-execute-persistent-action)
;; list actions using C-z
(define-key helm-map (kbd "C-z")  'helm-select-action)

; Helm-ag
;; 事前準備: sudo apt install silversearcher-ag
;; M-x helm-ag

M-x package-list-packages で以下をインストールする

  • mozc
  • twittering-mode
  • web-mode
  • helm
  • helm-ag

$ sudo snap install emacs --classic で実行すると Emacs 26 がインストールされるが、M-x package-list-packages の実行で Segmentation fault で落ちる問題にぶつかった。(解決のために参考にしたIssue)

nvm のインストール

以下のコマンドを実行して nvm をインストール。

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
$ fisher add jorgebucaran/fish-nvm 

Node.js と npm をインストール。

$ nvm use 12.11.0
$ node -v
v12.11.0
$ npm -v
v6.11.3

Yarn のインストール

インストール|Yarn」を参考にしてインストール。

$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt-get update && sudo apt-get install yarn

tldr コマンドのインストール

$ npm install -g tldr

Java のインストール

OpenJDK 11 のインストール

$ sudo apt install openjdk-11-jdk

git の設定

$ sudo apt install git
$ git config --global user.name "ユーザ名"
$ git config --global user.email "メールアドレス"
$ git config --global core.editor "emacs"

ssh の設定

ファイルサーバーからGitHub の秘密鍵を ~/.ssh にコピーする。
その後、以下のコマンドを実行して、オーナーユーザーの読み取り権限のみを秘密鍵に設定。

$ chmod 400 ~/.ssh/id_rsa

パスフレーズを毎回入力しなくて済むようにする

$ ssh-add ~/.ssh/id_rsa
$ ssh-add -l

Docker のインストール

以下を読みながら、いい感じにインストールしました

PHP のインストール

$ sudo apt install php
$ php -v
PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

Peek のインストール

デスクトップ画面を GIF キャプチャできるように Peek をインストールします。

$ sudo add-apt-repository ppa:peek-developers/stable

$ sudo apt update
$ sudo apt install peek

参考資料
GIF形式でのキャプチャが簡単にできるPeekをUbuntuにインストールする手順と使い方

Ruby のインストール

$ apt install ruby
$ gem install bundler

Python のインストール

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

LinuxにSSDを繋いでファイルサーバーを作るときには、NTFSは使わいほうが良いよ。

遅いから。

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

Windows機でメタゲノム解析環境をつくる

シーケンシングコストの低下に伴って巷ではヒトゲノムプロジェクト以来のバイオインフォブームの再来があるようですが、そうやって時代が進む間も野山に混じりて虫を採りつつよろづのことを調べにけりみたいな現場主義いきものメインな人が長年の憧れだったメタゲノム解析に手を出すまでの道のりです。
とりあえず環境中のメタゲノム情報に対して系統解析を行うことを目標として進めます。
手に入る書籍がモデル生物に対する発現解析関係ばかりなので、非モデル生物の分子系統解析がメインの文献があればほしい(切実)。

メタゲノム解析ツールは基本的にLinux OSかMac OS環境じゃないと使えない

あの本とかこの本ではとりあえずMac使えって書かれてますね。そんなお金ないよ。なのでLinux環境を利用することになりますが、Linux専用機を用意できるはずもないので手元のWindows機内にLinux環境を構築することにした。
仮想環境の構築となるとVirtualBoXやDockerを使うことになるかと思いますが、今回はWindows Subsystem for Linux (WSL)を使用します。Windows homeでも動くし軽そうだし。

環境構築

今回は手元のWindows機にWSLを導入してUbuntuをインストール、Linux向けのメタゲノム解析ツールを導入していく。

WSLおよびUbuntuの導入

こことかここを参考にしてWSL(無印のWSL1の方)を入れた。
Linux環境のホームディレクトリにWin環境のデスクトップへのシンボリックリンクを作成しておくとファイルのやり取りなどが楽になるのでおすすめ
ln -s /mnt/c/Users/"username"/Desktop ~/Desktop
※"username"部分にはwindowsアカウントの名前を入れる
日本語化とかもできるけど解析ツールはどうせ英語だし日本語と英語が入り乱れると脳がバグるよわよわパーソンなのでそのままにした。文字化け防止に日本語の言語パックをインストールだけした。

導入するUbuntuのバージョンについて

ここによるとWSL1にUbuntu20.04を入れると不具合が発生し、すぐには修正が難しい問題であるらしく安定した動作を求める人は18.04LTSを入れた方が良いとのこと。私は既に20.04に色々インストールしてしまってから知ったのでそのまま使った(めんどくさいし)。Ubuntuを開きながらChromeでウェブブラウンジグしてるとしばしばWindowsがクラッシュするが解析かけて放置した場合は今のところ大丈夫なので、WindowsとUbuntuで同時に作業しなければ大丈夫じゃないかなと思う(願望)。パッチはよ。

Miniconda

公式のドキュメントを参考にしてMinicondaをインストールした。インストール後にconda --helpがcommand not foundだったのでcondaのPATHを環境変数$PATHに追記した記憶があるのでけどうろ覚え。
うちの環境の$PATHを確認したら
/home/"username"/miniconda3/condabin
だった。

biocondaチャンネルの登録

この本を参考にして
conda config --add channels defaults
conda config --add channels conda-forge
conda config --add channels bioconda
以上のチャンネルを登録した。

解析に必要なツールの導入

色々試したけど最終的に使ったものだけ

SRA-toolkit

公式ドキュメントを参考にしてインストールした。確かインストール後にこのアドレスにPATHを通せ的なことが表示されたはずなのでそれに従って環境変数$PATHに追記した。
今確認するとうちの環境では
/usr/local/ncbi/sra-tools/bin
だった。

configの設定

fastq-dumpなどのコマンドを使うにはconfigの設定が必要なので公式ドキュメントを参考にして設定した。
vdb-config -i
でコンフィグ画面が開くので適当に設定。キャッシュなどを置いとく場所を聞かれるので適当に作った空のディレクトリを指定する。

SqueezeMeta

ここここを参考にした。
今回はcondaからインストール
conda create -n SqueezeMeta -c bioconda -c fpusan squeezemeta
conda activate SqueezeMeta

データベースの構築

SqueezeMetaのインストールが終わったらtest_install.plを実行するとデータベースがあるか確認して、なければデータをダウンロードして構築してくれる。このときデータベースをインストールする場所を聞かれるので指定する。とりあえず/download/pathにしといた。ダウンロードと構築にだいたい2日くらいかかった。

とりあえず動かしてみる

SqueezeMetaは自動で色々やってくれるのでとりあえず適当なデータをパイプラインに流してみた

配列の取得

今回はJi et al. (2018)登録配列を使用した。
prefetch SRR5223441でsraファイルを取得
fastq-dump --split-files SRR5223441.sraでペアエンドファイルに変換。SRR5223441_1.fastqSRR5223441_2.fastqというファイルが生成された。
これをSqueezeMetaによる解析に使う。

SqueezeMetaによる解析

適当な作業ディレクトリを作ってペアエンドファイルを移動した。
解析にはサンプルごとにfastqファイルを指定した.samplesファイルが必要なので作った
touch list.sampls touchコマンドでファイルを作成して
vim list.samples vimで編集した

Sample1 SRR5223441_1.fastq pair1
Sample1 SRR5223441_2.fastq pair2

中身はこんな感じ。blank spaceはダメなのでtab区切りを使う。
今回Sample1としている部分の名前を変えていけば複数サンプルを連続で処理してくれるらしい。

今回はカレントディレクトリに必要なファイルを全部置いて解析を実行した
SqueezeMeta.pl -m coassembly -p "projectname" -s ./list.samples -f ./
coassemblyモードではプロジェクトネーム(-pで指定)のディレクトリが生成されそこに結果が保存される。すでに同じ名前のディレクトリが存在すると別のプロジェクトネームにしろと怒られる(た)。

解析が終わったらディレクトリごとデスクトップにコピーするとやりやすい
cp -r SRR5223441 ~/Desktop
resultsの中に02."projectname".16S.txt19."projectname".bintableがある。
メモ帳でも開けるけど読み辛いので適当なスプレッドシートに流し込んだ。これらのファイルにアノテーションとビニングで見つかった生き物が記録されている。

とりあえず以上の手順でSqueezeMetaが動いた。

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

Linuxコマンド(順次更新)

ssh

サーバーへ接続する。
sshは、通信を暗号化してリモートサーバーへ接続するプロトコル

scp

サーバーとファイルのやり取りを行う。
フルパスで指定する。
※ftpは通信経路が暗号化されていないため、現在はサーバー接続ではほとんど使われていない。
(個人のブログならやってもいいけど、基本的にはビジネスであれば使わないほうがいい)

grep

$ grep 検索正規表現 ファイル名

特定の文字が含まれている行を出力する。

パイプ(「|」)と使うことが多く、その方が大変便利。

$ ps aux | grep apache

と打つと、

apacheが動いているのか確認することができる。
ひとつひとつのプロセスを確認できる。
(詳しくは参考記事参照)

参考

「grep」の参考記事
https://webkaru.net/linux/commands-pipeline/

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