- 投稿日:2019-05-21T22:49:45+09:00
Linux版のUnityでビルド対象にMacOSを選べないことへの対処
Linux版のUnityは次のリンク先等からインストールできるUnityHubでインストールすると思うのですが、MacOS向けにビルドするようにする場合は2019年5月時点ではちょっと手順を踏む必要があったのでメモ。一回作業したら後はやらなくてよくなるので対処は楽です。
" Unity Hub v2.0.0 Release
https://forum.unity.com/threads/unity-hub-v2-0-0-release.677485/対処法
対処法は次のリンク先に書かれています。
" Can't build Mac OS X target on Linux (Ubuntu 18.04)
https://forum.unity.com/threads/cant-build-mac-os-x-target-on-linux-ubuntu-18-04.586255/具体的には次の手順を踏むと対処できます。
- Installs→Addから目的のバージョンのUnityを選択し、追加モジュールに
Mac Build Support (Mono)
も選択するようにしてインストール1- インストールしたUnityのインストールディレクトリ(
~/Unity/Hub/Editor/<バージョン>
)に移動Editor/Data/PlaybackEngines
の中にMacStandaloneSupport
というディレクトリを作成- 次のファイルを
Editor/Data/PlaybackEngines/MacStandaloneSupport
に移動
- ivy.xml
- modules.asset
- optool
- UnityEditor.OSXStandalone.Extensions.dll
- UnityEditor.OSXStandalone.Extensions.dll.mdb
- Variations
- Whitelists
これで完了です。2〜4の手順はコマンドで示すと次のようになります。
cd ~/Unity/Hub/Editor/<バージョン> mkdir Editor/Data/PlaybackEngines/MacStandaloneSupport mv ivy.xml modules.asset optool UnityEditor.OSXStandalone.Extensions.dll UnityEditor.OSXStandalone.Extensions.dll.mdb Variations Whitelists Editor/Data/PlaybackEngines/MacStandaloneSupport原因…?
~/Unity/Hub/Editor/<バージョン>
にあるmodules.json
を見てみると分かるのですが、Mac Build Support (Mono)
のインストール先が{UNITY_PATH}/Editor/Data/PlaybackEngines/MacStandaloneSupport
ではなく{UNITY_PATH}
になっており、それが原因で正しい場所にMacOS用のモジュールがインストールされていないのが原因です。ただ、インストールする前にmodules.json
を書き換えればいいという訳でも無いため具体的な修正方法は分かりません。多分その内治ると思います。それまではこういう手順でインストールしたものを移動させると大丈夫です。
Unityを既にインストールしているなら大丈夫だとは思いますが念のため、Unityをインストールするには右上の自分のアイコン→Manage License→ACTIVATE NEW LICENSEからライセンスを有効化する必要があります。 ↩
- 投稿日:2019-05-21T19:58:34+09:00
簡単ArchLinuxインストールガイド
Arch Linuxのインストールを簡単にまとめているサイトが無かったので、とりあえずインストールメディアから再起動したら、GUIが立ち上がって使える状態になる、手順をまとめてみました。
ベースはArchWikiのインストールガイドですが、省ける手順は省き、まとめられる手順はまとめました。
必要なモノ
- Arch Linuxをインストールするもの (物理マシン・仮想マシン どちらでも可)
- 空のストレージ
- DHCPでIPが降ってくる有線LAN (物理マシンの場合)
- 自分でどうこうできるならどんな環境でも良い
- ただし、無線LANよりインストールが早く終わるのでオススメ
- 何が起きてもめげない精神
まず最初に
とりあえずArch LinuxのインストールisoをUSBやCDに焼いて、EFI で起動しましょう。もしくは、VMを好きなスペックで作り、ブートモードをEFIにして立ち上げましょう。
今からインストールするなら、EFIブートでインストールしたほうが、イケてます。
インストール手順
インストールメディアが起動して、
zsh
が立ち上がり、root
でプロンプトに入れたら、作業開始です。キー配列が起動時点ではUSになっているので、日本語にするには
loadkeys jp106と入力しましょう
起動した段階でDHCPで勝手にネットに繋がっていると思いますが、とりあえずの確認でどこかに
ping
を打ってみましょう。わたしはいつもwww.google.co.jp
に飛ばしています。インターネッツに疎通ができることを確認したら、インストールを始めて行きます。
1. パーティショニング
まず最初にインストールをするためのスペース作りをします。
既存のパーティション情報は邪魔なので、
dd if=/dev/zero of=/dev/sda count=1 bs=1MiBとやってパーティション情報を消してしまうことをオススメします。
パーティショニングツールは
cgdisk
がオススメです。cgdisk /dev/sda起動時に
Select label type
を訊かれるので、gpt
を選択します。ここで一つポイントなのは、Arch Wikiでは
/boot
とESP(EFIシステムパーティション)は一緒にしてしまって構わないと書かれていますが、他のLinuxや、万が一にもないと思いますが、もしWindowsをマルチブートしたいとなどと思ってしまった時に、非常に厄介なことになるので、ESPは別パーティションにした方が幸せになれます。それ以外は、パーティショニングは個人の好きなようにして良いと思います。私はすべて一つにまとめてしまうので、ESPと
/(ルート)
の二つしか切りません。
cgdisk
の使い方は調べて下さい。parted
などのCLIツールよりは難しくないです。私は以下のように切ります。
デバイス サイズ タイプ /dev/sda1 100MiB EFI System /dev/sda2 15.9GiB(残りすべて) Linux filesystem 2. フォーマットとマウント
先ほど作ったパーティションをフォーマットして、マウントします。
ESPパーティションは無条件でFAT32でフォーマットします。
mkfs.vfat -F32 /dev/sda1
rootパーティションはお好みのファイルシステムでフォーマットしましょう。
筆者のオススメは
ext4
ですmkfs.ext4 /dev/sda2フォーマットが終わったらマウントします。
ルートになるパーティションからマウントしていきます
mount /dev/sda2 /mnt # ルートパーティションのマウント mkdir -p /mnt/boot/efi # ESPのマウントポイントを作成 mount /dev/sda1 /mnt/boot/efi # ESPをマウント3. システムのインストール
システムを
pacstrap
で展開していきます。これが一番時間がかかる作業です。(と言っても10分もあれば終わる)
/etc/pacman.d/mirrorlist
をvimなどのテキストエディタで開き、jaistのミラーを一番上に持ってきます。ここでポイントなのは、ArchWikiではここの段階では
base
とbase-devel
しか指定していませんが、ここで他のソフトも一緒に指定してインストールすることができます。(よく読めば書いてある)私はここでGUIデスクトップ環境で必要になるモノをすべてインストールしてしまいます。
因みに私は、ディスプレイマネージャーは
lightdm
、デスクトップ環境はcinnamon
を好んで使っていますが、ここは個人の好きなモノにして下さい。(この記事ではlightdmとcinnamonで進めていきます)まとめて入れるモノ一覧
- 基本システム系
- base
- base-devel
- grub
- dosfstools
- efibootmgr
- エディタ
- vim
- シェル補完
- bash-completion
- ネットワーク管理
- networkmanager
- Xorg
- xorg-server
- ディスプレイマネージャー
- lightdm
- lightdm-gtk-greeter
- lightdm-gtk-greeter-settings
- デスクトップ環境 GUI関係
- cinnamon
- terminator
- adobe-source-han-sans-jp-fonts
- adobe-source-han-serif-jp-fonts
- その他
- git
これらをまとめて、インストールしていきます。
pacstrap /mnt base base-devel grub dosfstools efibootmgr vim bash-completion networkmanager xorg-server lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings cinnamon terminator adobe-source-han-sans-jp-fonts adobe-source-han-serif-jp-fonts git4. システムの設定
fstabの生成
genfstab
コマンドを実行して、fstabを生成します。UUIDを使うのが確実なので、-U
オプションを付けて実行しましょう。genfstab -U /mnt >> /mnt/etc/fstab新しいシステムにchroot
arch-chroot /mnt新しくインストールしたシステムに
chroot
をした状態になりました。地域の設定
タイムゾーンとロケールの設定をしていきます。
タイムゾーン
/usr/share/zoneinfo
にタイムゾーンの設定ファイルのサンプルが転がってるのでそのまま使います。ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
/etc/adjtime
を生成する必要があるので、次のコマンドを実行します。hwclock --systohc --utcロケールの設定
システム全体のロケールを設定していきます。
/etc/locale.gen
を編集します。vim等で開いて、ja_JP.UTF-8 UTF-8
をアンコメントした後に、locale-gen
を実行します。vim /etc/locale.gen # ja_JP.UTF-8 UTF-8をアンコメント locale-gen
言語などの設定をするために、
/etc/locale.conf
を、キーマップを設定するために/etc/vconsole.conf
を作成します。echo LANG=ja_JP.UTF-8 > /etc/locale.conf echo KEYMAP=jp106 > /etc/vconsole.confホスト名の設定
システムにホスト名を設定します。
/etc/hosts
と/etc/hostname
を編集していきます。ホスト名は好きなモノにしましょう。(筆者は担当アイドル名にしたりします)
echo hostname > /etc/hostname
/etc/hosts
の中身(多分 空なので全部書きましょう)127.0.0.1 localhost ::1 localhost 127.0.1.1 hostnameサービスの有効化
NetworkManagerとlightdmを有効化して、起動時に自動的に立ち上がるようにします。
systemctl enable NetworkManager systemctl enable lightdmユーザの追加・パスワード設定
新システムに一般ユーザの追加と、パスワードを設定していきます。
ついでに
sudoers
の設定もしていきます。まず最初に
root
ユーザーのパスワードを設定していきます。passwd対話型でパスワードを設定していきます。
次に一般ユーザの追加をしていきます。
sudo
を使えるようにするために、wheel
グループへの追加も同時にします。useradd -m -G wheel username次にパスワードを設定していきます。
passwd username最後に
sudoers
にwheel
を追加します。visudoとして
# %wheel ALL=(ALL) ALLの頭の
#
を削除して保存してください。イニシャル RAM ディスクの生成
イニシャルRAMディスクの生成をします。
以下のコマンドを実行します。
mkinitcpio -p linux
ブートローダーの設定
最後に、ブートローダーをセットアップしていきます。
ブートローダとして
GRUB
を使います。(systemd-bootより楽)以下のコマンドを実行していきます。
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id="Arch Linux GRUB" --recheck --debug grub-mkconfig -o /boot/grub/grub.cfgこれで終了
最後に
exit
でchroot環境を終了した後、reboot
コマンドを叩きましょう。恐らくArchLinuxが起動してきます。
それでは良いArchライフを
謝辞
WAKAME_temp氏に「GPTを使うときのパーティショニングは
cfdisk
よりもcgdisk
を使っておいたほうが幸せになれる確率が高いと思いますよ」とコメントをいただきまして、該当箇所を修正いたしました。
コメントありがとうございます。
- 投稿日:2019-05-21T17:25:37+09:00
自分用勉強メモ10日目
tips
ブラウザでUser Agentを変更したいとき
CTFの問題を解いていて,User AgentをGooglebotに偽装したかった.
Firefoxだとアドオンを入れる必要があるらしい.
Chromeで変更する手順を見つけたので参考にした.参考:Google ChromeでUserAgentを変更する
- Developer Toolsを開く (右クリックで「検証」)
- More ToolsからNetwork conditionsを開く
- select automaticallyのチェックを外す
- 好きなUserAgentに変える
Ubuntu19.04でvimのシンタックスハイライトが機能しなかった
Ubuntuが最小構成でインストールされていた場合,Vimも最小構成になっていた.
自分の場合はaptでVimをインストールし直したらシンタックスハイライトが使えるようになった.# apt install vim
調べた知識
バイナリ解析で役に立つツール
pwntools
CTF用のPythonライブラリ.
pip install pwn
でインストールできる.
p32という関数を使えば,数値を32bitのリトルエンディアンに変換してくれる.
例:p32(0x11223344)checksec
実行ファイルのセキュリティ機構を表示してくれるシェルスクリプト.
以下からダウンロードできる.
slimm609/checksec.shgdb-peda
gdbの拡張版.
以下からインストールできる.
longld/pedareadelf
Linuxのコマンド.
ELFの情報を表示する.rp++
実行ファイル中のROP Gadgetを表示する.
以下からダウンロードできる.
0vercl0k/rpELFのセキュリティ機構
RELRO(RELocation Read-Only)
ELFのセクションを読み込み専用にする.
以下の2つがある.
- Partial RELRO
- Full RELRO
GCCのデフォルトではpartialになっている.
partialであればGOT上書き攻撃が可能.カナリア
SSP(Stack Smashing Protector)というものがある.
ローカル変数とリターンアドレスの間にカナリア(canary)と呼ばれる値を設定し,関数終了時にそれが変更されているかどうかをチェックする.
これにより,スタックオーバーフローが発生していないか確認できる.NXビット(No eXecute)
メモリをコード領域とデータ領域に分け,後者に特別なビットを付与し,実行されることを防ぐ.
WindowsではDEP(Data Execution Prevention)という.PIE(Position-Independent Executable)
実行コード内のアドレス参照をすべて相対アドレスで行う.
これにより,実行ファイルがメモリ上のどこに展開されても正常に実行できる.ASLRとの違い
ランダム化する部分が異なる.
- ASLR: 共有ライブラリやスタック
- PIE: 実行ファイル
- 投稿日:2019-05-21T15:52:51+09:00
プログラムとの対話を自動化する expect の簡単なプログラム例
やりたいこと
会社で自動化したい処理がいくつかあり、その中に対話形式のプログラムがあるため expect を利用することに。
初めて expect を使うため、下記の記事を参考にして簡単なプログラムを作ってみましたのでメモ。「とりあえず動かしてみたい!」という方には参考になるかもしれません。
参考記事
Linuxの対話がめんどくさい?そんな時こそ自動化だ!-expect編-
インストール
以下の方法で expect コマンドをインストールします。
ちなみに OS は CentOS 7.6 で実行しています。$ sudo yum install expect簡単な対話プログラムを自作
expect のテストとして使えそうな簡単な対話プログラムがなかったので自作しました(シェルのお勉強を兼ねて)。
self-introduction.sh#!/bin/bash GetInfo() { item=$1 read -p "${item}: " val echo ${val} # 受け取った値を標準出力することで値を渡す } SelfIntroduction() { name=`GetInfo name` # 関数の結果を変数に代入する場合、関数名をバッククオートで囲む age=`GetInfo age` echo "Hello! I'm ${name}, ${age} years old." } SelfIntroduction実行すると対話形式で
name
とage
を聞かれ、入力が終わるとHello! I'm [名前], [年齢] years old.
と出力されるだけの簡単なプログラムです。実行した結果
$ sh self-introduction.sh name: Katsuo age: 11 Hello! I'm Katsuo, 11 years old.expect を使ってみる
上記のプログラムを対話せずに実行するため expect を使ってみます。
名前と年齢の値は引数として渡します。
expect には書き方が2パターンあるようで、1つはコマンドとして書く方法、もう1つはプログラム言語っぽく書く方法です。
両方のパターンを試してみましたが、可読性などを考えると後者がおすすめです(ネットを調べるとなぜか前者で書かれていることが多い)。
今回は後者のプログラム言語っぽく書く方法でやってみます。
プログラム言語っぽく書いてみる
以下が完成版です。
これでプログラムと対話することなく、名前と年齢を引数として渡すことで実行することができます。self-introduction.exp#!/usr/bin/expect set name [lindex $argv 0] set age [lindex $argv 1] spawn ./self-introduction.sh expect { "name" { send "${name}\n" exp_continue } "age" { send "${age}\n" exp_continue } "\\\$" { exit 0 } } exit 0実行してみる
以下の1行目を実行するだけで、止まることなく最後まで処理が実行されます。
$ expect self-introduction.exp Katsuo 11 name: Katsuo age: 11 Hello! I'm Katsuo, 11 years old.簡単に解説
#!/usr/bin/expectいわゆるシバンです。
「これから expect でプログラム書きますよ!」というお知らせです。set name [lindex $argv 0] set age [lindex $argv 1]引数として受け取った値を変数に入れてます。
spawn ./self-introduction.sh
spawn
で指定した対話プログラムが自動化の対象となります。
今回は同じディレクトリ内にあるself-introduction.sh
を対象としています。expect { ...処理... }
expect { }
の中に自動化するための具体的な処理を書いていきます。"name" { send "${name}\n" exp_continue } "age" { send "${age}\n" exp_continue } "\\\$" { exit 0 }
name
でパターンマッチしたら、変数${name}
を入力してリターンします。
同様に、age
でパターンマッチしたら、変数${age}
を入力してリターンします。
exp_continue
を入力しておくことでexpect { }
ブロックから抜け出さずに処理を続けることができます。
\\\$
の部分は、プロンプトの入力待ち状態になったらexpect { }
ブロックから抜け出すための処理です。
プロンプトは環境によって異なるため、#
や%
などに編集が必要な場合があります。
(コマンドプロンプトを起動して、入力待ちのときに表示される記号のことです。)また、詳しい理由は分かりませんが
\
3つ必要です。
内部でどのような処理が行われているか不明ですが、エスケープが2回必要みたいです。以上!
- 投稿日:2019-05-21T03:29:35+09:00
openSUSEとSUSE Linux Enterprise Server (SLES)の違いについて - 概要編
皆さん、こんにちは。戸倉彩です。
最近、 「SUSE Linux」 には種類があることが意外と知られていない!?ということに気づいたので、簡単にこちらの記事にまとめてみることにしました。あまりLinuxに詳しくない方にも分かるレベル感で情報をまとめていますので、普段から使われている方にとっては物足りない内容になっているかと思いますがご了承ください。
※今後、もう少し情報を追加したり随時更新していきたいと思います。
openSUSE とは (https://www.opensuse.org/)
オープンソースカンファレンスなどに参加されたことのある方であれば、一度は緑色のカメレオンを見かけたことがあるのではないのでしょうか。もしくは、展示エリアで手乗りサイズから特大サイズまでのカメレオンが並べられている「日本openSUSEユーザー会」のブースに立ち寄られた方もいらっしゃるかもしれません。
■ マスコットキャラクター
ギーコ (Geeko): ネーミングの由来は、geek(コンピュータおたく)とgecko(ヤモリ)の組合せだそうです。■ 概要
OpenSUSE Projectによって開発が行われている、コミュニティベースのオープンソースのLinuxディストリビューションです。インストールする場合には、2つの選択肢があります。いずれのディストリビューションも、デスクトップやサーバー環境、もしくはクラウド環境にインストールして使うことができます。
* OpenSUSE Tumbleweed(タンブルウィード): ローリングリリース版。いち早く新機能を利用したい方や貢献したい方に向いています。
* OpenSUSE Leap(リープ): 定期リリース版。安定したものを利用した方はこちらを利用することをお勧めします。
また、Windows上でLinux環境(Windows Subsystem Linux)としてストアアプリから入手して使うこともできます。2019年5月21日現在は「openSUSE Leap 42」が提供されています。
■ 国内の代表的なコミュニティ
- 日本openSUSEユーザ会■ 最新情報について
- Twitter @openSUSE
SUSE Linux Enterprise Server とは (https://www.suse.com/ja-jp/products/server/)
■ マスコットキャラクター
カメレオン ※決してギーコではない、とSUSE方面の方から教えていただきました。■ 概要
SLESという略称で呼ばれるSUSE Linux Enterprise Serverは、ミッションクリティカルシステムや高可用性が求められる商用として主に利用されているLinuxディストリビューションです。サーバーやメインフレーム用(例えばIBMのZシリーズなど)に設計されていますが、デスクトップにもインストールすることが可能です。無料評価版はSUSE公式サイトからダウンロードすることができます。
また、Windows上でLinux環境(Windows Subsystem Linux)としてストアアプリから入手して使うこともできます。2019年5月21日現在は「SUSE Linux Enterprise 12」が提供されています。
■ MEMO
SUSE社が公式にSUSEをテーマにした歌付きの「25年 SUSEミュージックビデオ(パロディ)」をYouTubeにて公開しています。SUSEファンの方はグッとくると思います。
参考文献
Have a nice Geek Life♪
※Twitterで最新情報配信中 @ayatokura
- 投稿日:2019-05-21T01:52:06+09:00
OCIでKspliceを使う Part2
前回「OCIでKspliceを使う Part1」の続き。
本題に入る前に
唐突だが
「カーネルをアップデートすると、既存のアプリケーションの動作が不安だ」
と思っている人もいるのではないだろうか。
「まったくの杞憂である」と声を大にして言いたい。
なぜならばカーネルはハードウェアやOSプロセスを管理するものであって、(ユーザ空間で稼働する)アプリケーションの動作には直接関係しないからだ。
アプリケーションの動作にもっとも影響するのはglibcをはじめとするコアライブラリ群である。
だからこそOracle LinuxはUEKとRHCKという、まったくベースバージョンの異なるLinuxカーネルを使っているにもかかわらず、ユーザ空間アプリケーションのABI(Application Binary Interface)互換性を保っているのだ。
長年実積のあるテクノロジーだし、技術的にもアプリケーションの動作に直接影響しないので、不安がらずに使って欲しい。とはいえソフトウェアなので「Kspliceのバグによる障害は100%無い」とは言い切れないのだが...。
Kspliceのコマンドを使いこなす
前回はUptrackクライアントを使ってアップデートを適用した。そこからの話を続けたい。
適用済みのアップデートを確認する
現在適用済みのKspliceのアップデートを確認する。
Installed updates:
以下に適用されているアップデートが表示される。各行先頭の[xxxxxxxx]
という記号はアップデートごとに割り当てられているIDで、このIDを使ってアップデートを個別に適用できる。# uptrack-show Installed updates: [jqu0nve5] Add support for runtime configuration of target LIO inquiry strings. [q5v4oo0p] Denial-of-service in the Infiniband core driver when allocating protection domains. ★中略 [oehos3cn] Known exploit detection. [s8jh2mwf] Known exploit detection for CVE-2017-7308. [dcgq70uq] Known exploit detection for CVE-2018-14634. Effective kernel version is 4.14.35-1844.4.5.2.el7uek適用したアップデートを削除する
適用したアップデートは動的に削除することもできる。
-y
オプションを付けると最後の質問が表示されず、そのまま実行される。# uptrack-remove --all The following steps will be taken: Remove [dcgq70uq] Known exploit detection for CVE-2018-14634. Remove [s8jh2mwf] Known exploit detection for CVE-2017-7308. Remove [oehos3cn] Known exploit detection. ★中略★ Remove [jqu0nve5] Add support for runtime configuration of target LIO inquiry strings. Go ahead [y/N]?★yかNを入力アップデートを削除したので、カーネルバージョンは元に戻っている。
# uptrack-uname -r 4.14.35-1844.3.2.el7uek.x86_64 # uname -r 4.14.35-1844.3.2.el7uek.x86_64個別のアップデートを適用する
いままでは適用可能なアップデートをすべて適用してきたが、
uptrack-install
を使うと個別にアップデートを適用できる。また前述のuptrack-remove
では個別削除できる。# uptrack-install jqu0nve5 -y The following steps will be taken: Install [jqu0nve5] Add support for runtime configuration of target LIO inquiry strings. Installing [jqu0nve5] Add support for runtime configuration of target LIO inquiry strings. Effective kernel version is 4.14.35-1844.3.2.el7uek念のために確認すると、個別に適用したアップデートが表示された。
# uptrack-show Installed updates: [jqu0nve5] Add support for runtime configuration of target LIO inquiry strings. Effective kernel version is 4.14.35-1844.3.2.el7uek設定ファイルを調べる
Part1ではKspliceの設定ファイルの中身を見たが、今回はパラメータの意味を説明する。
/etc/uptrack/uptrack.confの内容
こちらがデフォルトの設定ファイルの中身である。インストール環境によって少し違いがあるかもしれない。
$ grep -v -e '^\s*#' -e '^\s*$' /etc/uptrack/uptrack.conf --ここから下が出力-- [Auth] accesskey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(意図的に伏せ字) [Network] https_proxy = gconf_proxy_lookup = no update_repo_url=https://oraclecloud-updates-ksplice.oracle.com/update-repository user_update_repo_url=https://oraclecloud-updates-ksplice.oracle.com/ksplice/request [Settings] install_on_reboot = yes autoinstall = no重要なパラメータ
この中でも重要なパラメータは以下の通り。マニュアル以外にも、パラメータファイル内にコメントで説明が書かれている。
パラメータ デフォルト値 説明 https_proxy なし Internetへのアクセス経路にプロキシがあるときには指定する。ポート8080のプロキシを指定するなら次のように指定する。 https_proxy = http://proxy.example.com:8080/
autoinstall no 利用できるようになったアップデートを自動的に適用する。ただしKspliceのクライアントは自動的にアップデートされないので、yum-cron等で自動アップデートすることを推奨 install_on_reboot yes リブート時に前回適用した分までのアップデートを適用する。 upgrade_on_reboot no リブート時に適用可能なすべてのアップデートを適用する。 install_on_reboot
とは排他の関係で、upgrade_on_reboot = yes
にするならば、install_on_reboot
はno
もしくはコメントアウトする。下記のデフォルト値であれば「自動適用はしないが、手動でインストールしたものはリブート時に自動適用する」ということになる。
install_on_reboot = yes autoinstall = no自動適用するときには、
install_on_reboot = yes
とupgrade_on_reboot = yes
のどちらでもよいが、ブートシーケンスの最中でトラブルがあるとイヤなので次のようにしたい。さらにコンサバに行くならばinstall_on_reboot = no
にして、起動してから次のcronが実行されるまでアップデートが適用されない状態にする。cronの話は後ほど。install_on_reboot = yes autoinstall = yesアップデートを自動適用する
アップデートを自動適用するには
autoinstall = yes
に変更する。デーモン系のプログラムでパラメータを変更したときには、設定を反映するために再起動などが必要だ。しかしKspliceではcronやブート時に利用しているだけなので再起動は不要である。これから、その内容を見ていくことにする。cronの設定を確認する
cronの設定を確認する。uptrackパッケージに含まれているcron関連のファイルを確認する。2つのファイルがあることが分かる。
$ rpm -ql uptrack | grep cron /etc/cron.d/uptrack /usr/lib/uptrack/regenerate-crontabcronの起動ファイルを確認すると毎時1分と31分に
uptrack-upgrade
を実行している。他を調べると毎時3分と33分というサーバもあった。$ grep -v -e '^\s*#' /etc/cron.d/uptrack ★当然catでもOK --ここから下が出力-- 1,31 * * * * root export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && [ -x /usr/sbin/uptrack-upgrade ] && /usr/sbin/uptrack-upgrade --croncronの詳細は下記資料を参考のこと。
rpmに含まれているもう一つのファイル
/usr/lib/uptrack/regenerate-crontab
を見ると、ランダムの数字を生成しているようだ。$ head -n 15 /usr/lib/uptrack/regenerate-crontab --ここから下が出力-- #!/bin/sh cronfile=/etc/cron.d/uptrack # Run at a random time within 20 minutes of each half hour. randfirst=$(($(od -An -N2 -d /dev/urandom) % 20)) randsecond=$(($randfirst + 30)) if [ -e "$cronfile" ] && \ ! echo 5f8ac9a8816940c1e309b2e3e5bf725c '' "$cronfile" | md5sum -c --status; thenおよその推測がついたのでrpmの
postinstall
セクションを見てみる。このセクションにはインストール終了後に実行するスクリプトが書かれている。20行目付近に/usr/lib/uptrack/regenerate-crontab
を発見。これまでのことをまとめると、インストール時にランダムの値を生成して30分間隔で実行するように設定している。$ rpm -q --scripts uptrack --ここから下が出力-- postinstall scriptlet (using /bin/sh): if [ $1 -eq 1 ] ; then # Initial installation /bin/systemctl daemon-reload >/dev/null 2>&1 || : /sbin/chkconfig --del uptrack >/dev/null 2>&1 || : /sbin/chkconfig --del uptrack-late >/dev/null 2>&1 || : /bin/systemctl mask uptrack-late.service >/dev/null 2>&1 || : /bin/systemctl enable uptrack.service >/dev/null 2>&1 || : /bin/systemctl enable uptrack-prefetch.service >/dev/null 2>&1 || : fi ★中略★ cronfile=/etc/cron.d/uptrack if ! [ -e "$cronfile" ] || grep -q '^\*/30' "$cronfile"; then /usr/lib/uptrack/regenerate-crontab ★ここで実行している fiアップデートの自動インストールを有効化する
すでに説明したように
autoinstall = yes
に変更する。# cp -p /etc/uptrack/uptrack.conf /etc/uptrack/uptrack.conf-`date +%Y%m%d` # sed -i -e "s/^autoinstall = no/autoinstall = yes/" /etc/uptrack/uptrack.confしばらく放置してから確認する。kspliceのログ
/var/log/uptrack.log
を確認すると、cronの設定通りに毎時1分と31分に実行されていることが分かる。$ grep "Invoked by" /var/log/uptrack.log --ここから下が出力-- 2019-05-20 22:31:02,183 DEBUG Invoked by the cron job. 2019-05-20 23:01:02,144 DEBUG Invoked by the cron job. 2019-05-20 23:31:02,077 DEBUG Invoked by the cron job. 2019-05-21 00:01:02,063 DEBUG Invoked by the cron job.念のためcronのログファイル
/var/log/cron
を確認する。すると02:01:01にuptrack-upgrade
コマンドと、02:12:01にksplice
コマンドが実行されている。後者のksplice
コマンドは拡張クライアントのコマンドである。想定外の事態が発生したので「拡張クライアントも実行されるかもしれない」問題編へ。# tail -n 8 /var/log/cron May 21 02:01:01 testweb01 CROND[17215]: (root) CMD (export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && [ -x /usr/sbin/uptrack-upgrade ] && /usr/sbin/uptrack-upgrade --cron) ★この行 May 21 02:01:01 testweb01 run-parts(/etc/cron.hourly)[17214]: starting 0anacron May 21 02:01:01 testweb01 run-parts(/etc/cron.hourly)[17228]: finished 0anacron May 21 02:01:01 testweb01 anacron[17226]: Anacron started on 2019-05-21 May 21 02:01:01 testweb01 anacron[17226]: Normal exit (0 jobs run) May 21 02:10:01 testweb01 CROND[17297]: (root) CMD (/usr/lib64/sa/sa1 1 1) May 21 02:12:01 testweb01 CROND[17318]: (root) CMD (export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && [ -x /usr/bin/ksplice ] && (/usr/bin/ksplice --cron user upgrade; /usr/bin/ksplice --cron xen upgrade)) ★この行拡張クライアントも実行される?
cronのファイルを調べると
uptrack
に加えてksplice
もある。# ls -l /etc/cron.d total 16 -rw-r--r--. 1 root root 128 Nov 20 02:22 0hourly -rw-r--r--. 1 root root 818 May 16 01:21 ksplice ★これ -rw-r--r--. 1 root root 108 Oct 31 2018 raid-check -rw-------. 1 root root 235 Aug 25 2018 sysstat -rw-r--r--. 1 root root 747 Apr 2 10:42 uptrackcronファイル
/etc/cron.d/ksplice
がどのrpmに属しているか調べると、拡張クライアントのksplice-tools
に含まれている。# rpm -qf /etc/cron.d/ksplice ksplice-tools-1.0.38-1.el7.x86_64実行される時間を確認すると、毎時12分と42分で
/var/log/cron
のログ通り。# grep -v -e '^\s*#' /etc/cron.d/ksplice ★当然catでもOK --ここから下が出力-- 12,42 * * * * root export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && [ -x /usr/bin/ksplice ] && (/usr/bin/ksplice --cron user upgrade; /usr/bin/ksplice --cron xen upgrade)本題では無いので詳細は省略するけれど、
/etc/cron.d/ksplice
の内容を実行しても、カーネルにアップデートは適用されなかった。あらためて/etc/cron.d/ksplice
の内容をよく見ると、ユーザ空間のアップデートを適用するコマンドだった。ユーザ空間のアップデートは無効になっているので、cronジョブが実行されても何も影響は無いということらしい。フー。/usr/bin/ksplice --cron user upgrade
いくつか補足事項
Kspliceクライアントのアップデートも検討する
これまでアップデートが自動適用する方法を説明してきたが、kspliceクライアント自身は更新しない。そのため自動適用するときは、yum-cronなどで
uptrack*
、ksplice*
に該当するパッケージを自動でアップデートすることも検討する。yum updateでカーネルをアップデートする必要はあるか?
Kspliceを有効にすると停止時間ゼロでアップデートを適用できる。しかし再起動するときには、再び累積のアップデートを適用する必要がある。数が増えるほど時間がかかり、また複雑性も増加する。そのためOSを再起動しなくても、
yum update
でカーネルも定期的にアップデートし、何かのメンテナンスタイミングで再起動して、新しいカーネルを利用した方がいいだろう。Kspliceがセットアップされている環境では
yum update kernel*
に時間がかかるPart1の冒頭で少し触れたが、Kspliceが設定されている環境で
yum update kernel*
を実行すると、内部的にinitrdやinitramfsが再作成される。これは非Ksplice環境では起きない動作だ。アップデートの最中にtop
コマンドでプロセスを確認すると、dracut
やgzip
、cpio
などがCPUを使っていることがわかる。Ksplice 30日トライアル
OCIでは追加のサポート契約なしにKspliceを利用できるが、オンプレミスなど他の環境では利用できない。30日トライアルが提供されているので、興味のあるかたは検討してはどうだろう。
https://ksplice.oracle.com/try/trialコマンド・リファレンス
Ksplice Uptrackクライアントのコマンド・リファレンスは以下のマニュアルを参照のこと。
マニュアルを補足すると、Kspliceを無効化するには以下のように空ファイルを作成する。するとuptrack-upgradeを実行してもアップデートはできず、また再起動時にもアップデートは適用されない。当然cronジョブも実行されない。
# touch /etc/uptrack/disableまとめ
Part1
- Kspliceを使うと、再起動しなくても新しいカーネルアップデートを適用できる
- OCI ComputeではデフォルトでKspliceを利用できる
- KspliceはUEKとRHCKの両方で利用できる
- 拡張クライアントを使うとglibcとopensslも対象になる(デフォルトでは利用不可)
Part2
- アップデートは手動で適用することも、自動で適用することもできる
- 適用したアップデートは削除できる
- アップデートの適用と削除は個別IDごとに指定できる
- 自動適用を有効にするとcronジョブで30分間隔で実行される
- 設定ファイルは
/etc/uptrack/uptrack.conf
のみ- 拡張クライアントがインストールされていても、ユーザ空間アップデート用の設定を追加しない限り、適用されることは無い
- Ksplice環境ではinitrdやinitramfs再作成されるので、カーネルアップデート時に時間がかかる
おわりに
一通り読んでみていかがだろうか。正直なところマニュアル以外の情報が少なく、最初は取っつきにくさもあった。だけれど仕組みやコマンド体系を理解すれば、シンプルなのでは無いだろうか。まあライブ・パッチング自体の仕組みは高度な実装だが利用者には関係ないことだ。
また今回は紹介していないが、拡張クライアントやSNMPプラグインなどさまざまな機能がある。興味があればそれらも調べて欲しい。
- 投稿日:2019-05-21T01:12:22+09:00
linuxのネットワークにファイルをコピー
SCP
でコピー
SFTP
でsshファイルの転送プロトコルscp sourcefile destination #sourcefileをdestinationにコピー sftp host #hostにsecureなファイル転送をスタート sftp sebec@hostSFTPでコピー
$ sftp linuxServer #パスワードを入れてlinuxサーバーに接続 sftp> pwd #print working directory /home/sebec sftp> ls Desktop Documents Downloads ... sftp> lpwd #local print working directory /tmp/test sftp> lls #local file text.txt sftp> put text.txt #リモートサーバーに移動 Uploading text.txt to /home/sebec/text.txtscpでコピー
$ scp sample.txt linuxServer:/tmp/ $ scp sample.txt linuxServer:~/ $ ssh linuxServer @linuxServer$ ls sample.txt @linuxServer$ ls /tmp/ sample.txtscpで違うユーザーのところにコピー
$ scp sample.txt admin@linuxServer:~/ (もしくは/home/admin/)scpでパスワードやユーザーを事前に登録して接続を簡単にする方法
事前に公開鍵をサーバーに登録して、ローカルに秘密鍵を.sshにおいてあるので、そこを参照して接続してくれます。
$ cd .ssh $$ vi config Host Sebec_Host HostName hostname User username Port portnumber identityFile ~/.ssh/id_rsa identitiesOnly yes PasswordAuthentication yes ServerAliveInterval 120 $ ssh Sebec_Host #これだけで繋がるように
- 投稿日:2019-05-21T00:42:20+09:00
Linuxでコマンドとコマンドを繋げてみる
Pipesと呼ばれるコマンドとコマンドを繋げるパイプ役
| #pipe役の記号
command-output | command-input
grep jouken filename他、
file
cut
tr
column
more
less
を見る。cat filename | grep jouken cut filename #選択箇所が切り取りされ、出力される -d delimiter #デリミッター -f N #nフィールドが表示されるfile filename #詳細が見られる
strings filename #binaryも人間が読めるstringsにしてくれる。$ grep -i file MVI_1347.MOV Binary file MVI_1347.MOV matches $ file MVI_1347.MOV MVI_1347.MOV: ISO Media, Apple QuickTime movie, Apple QuickTime (.MOV/QT) $ cat MVI_1347.MOV c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c;1;1;112;112;1;0x1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c;1;1;112;112;1;0x1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1 ^C^[OP^[^[ ^[^[^[^[^[^[ ... Display all 1512 possibilities? (y or n) $ n $ strings MVI_1347.MOV | grep -i file rLFILE$色々組み合わせてみる
$ grep sebec passwd sebec: sebec jean-luc sebec2: sebec Bob sebecs: sebec Ben sebecike: sebec stephani sebecai: sebec Tomato sebastian: sebec Ariel sebecss: sebec Yamada sebecsql: sebec Kawamura #cutカットしてsort並び替える $ grep sebec passwd | cut -d: -f1,2 | sort sebastian: sebec Ariel sebec2: sebec Bob sebec: sebec jean-luc sebecai: sebec Tomato sebecike: sebec stephani sebecs: sebec Ben sebecsql: sebec Kawamura sebecss: sebec Yamada # trで:をとることもできる $ grep sebec passwd | cut -d: -f1,2 | sort | tr ":" " " sebastian sebec Ariel sebec2 sebec Bob sebec sebec jean-luc sebecai sebec Tomato sebecike sebec stephani sebecs sebec Ben sebecsql sebec Kawamura sebecss sebec Yamada # column -tでテーブル表示にもできる $ grep sebec passwd | cut -d: -f1,2 | sort | tr ":" " " | column -t sebastian sebec Ariel sebec2 sebec Bob sebec sebec jean-luc sebecai sebec Tomato sebecike sebec stephani sebecs sebec Ben sebecsql sebec Kawamura sebecss sebec Yamada iMac:files sebec$
- 投稿日:2019-05-21T00:26:26+09:00
bashのデバッグツール「bashdb」
bashのデバッグツール「bashdb」
bashdbとは
gdbみたいにデバッグが出来るツールです。
http://bashdb.sourceforge.net/インストール方法
$ sudo apt-get install bashdb実行方法
$ bashdb [options] hogehoge.shオプションについては以下を参照ください。
http://bashdb.sourceforge.net/bashdb-man.html#OPTIONS主なコマンド
コマンド 意味 s1 行進める b 行数ブレークポイント設定 c 次のブレークポイントまで継続実行 p 変数名変数の値を表示 R 再実行 q 終了 h ヘルプ表示 l ソース表示(10行表示) watch 条件文停止条件の設定
- 投稿日:2019-05-21T00:18:42+09:00
【Linux】シェルスクリプトにおける && と || の違い
複数コマンドをAND演算で実行する &&
bashシェルスクリプト上では
&&
はAND制御演算子である。
以下の場合、command1が成功したらcommand2を実行する。$ command1 && command2エラーが起こった時の挙動
;
でコマンドを連結する場合、コマンド1がエラーであっても、次のコマンドが実行されるが、
&& で連結した場合はエラーが起きた時点で動作が停止する。複数コマンドをOR演算で実行する ||
|| はOR制御演算子である。
指定したコマンド1が異常終了した時に、それに対処する形でコマンド2を実行できるので、
主に事後のエラー処理などを行なう時に使える。以下の場合、command1が失敗した場合command2を実行します。
$ command1 || command2
- 投稿日:2019-05-21T00:16:33+09:00
【Linux】複数コマンドを一行でまとめて実行するセミコロン
- 投稿日:2019-05-21T00:14:06+09:00
【Linux】シェル内でのみ使うファイル/ディレクトリを作る
シェル内でのみ使うファイル/ディレクトリを作る
mktemp
コマンドを利用すると、適当な名前のファイル/ディレクトリを作ることができます。
また、作成されるディレクトリもデフォルトでは/tmp
配下。
mktemp
コマンドは、ランダムな名前でファイル/ディレクトリを作成するのですが、
標準出力にその結果を返してくれるので、
基本的にサブシェルで実行したものを変数に格納して使うのが良いです。# /tmp 配下にランダムな名前のファイルが作成される。 temp_file=$(mktemp) # -d を付けることでディレクトリ作成となる。 temp_dir=$(mktemp -d)想定されるユースケース
trapコマンドと組み合わせて、シェルスクリプトが動作している間だけ生きているファイル/ディレクトリを作成。
# 一時ディレクトリ/ファイルを作成する。 temp_file=$(mktemp) temp_dir=$(mktemp -d) # 後始末を定義 trap " rm $temp_file rm $temp_dir " 0
- 投稿日:2019-05-21T00:11:14+09:00
【Linux】シェルスクリプトの終了/中断時に後処理が出来るtrap
終了/中断時に後処理が出来る trap
シェルで良くありがちな処理として、ファイルを作ってシェルの実行結果をテキストファイルなどに書いたり、
そのファイルを最後に削除したりする物が多い。
しかし、そういった場合に作成したファイルの後始末が結構面倒だったりします。
Ctrl+C
とかで処理の途中で終了された時に、
作業途中のごみファイルが残ったりして、一時退避していたファイルがそのまま取り残されたりすると本当に面倒です。そこで便利なのが trap コマンドです。
trapのメリット
事前にtrap処理を書いておく事で、処理が途中で中断されてしまったりした際にも、
必ず中に書いてあるコマンドを後処理として実行させることができるようになります。しかも素晴らしいのが trap コマンドは終了時のシグナルを捕捉して、
処理を実行してくれるので、
- エラーの時はこんな処理を走らせる
- 正常終了の時はこんな処理を走らせる
と処理を書き分けたり出来るので、本当に便利です。
たとえスクリプトがCtrl+C
とかで途中終了してしまった場合でも、きちんと後始末できるようになります。以下の様にして
trap "後処理" シグナル番号
と指定するだけでOKです。trap "rm /tmp/hoge-tmp" 0同じシグナルに対して2つ以上のコマンドを実行したい
以下の様にすればOKです。
(勿論、Terminate処理の関数を作って、それを実行させるのもOKです)trap " mv /tmp/swap-file original-file rm /tmp/target-file " 0trapコマンドを使うにあたって
シグナルの理解は必須です。
以下のサイトを参照の上で利用する事を推奨します。
- 投稿日:2019-05-21T00:06:15+09:00
【Linux】実行しているシェル自身のディレクトリの取得
実行しているシェル自身のディレクトリの取得
シェルスクリプトは、原則として自分自身を実行した際のカレントディレクトリが、
そのままシェルスクリプト内のカレントディレクトリとして扱われる。そうすると、例えばシェルからシェルを呼びたいときとか相対パスが使いにくいので結構辛い。
(だからと言って絶対パスにするなんて、環境依存になる為、論外。)ですので、自身の周辺のディレクトリ/ファイル構造が決められてたりすると本当に辛い。
そこで、こういう場合にはスクリプト自身の絶対パスを動的に取得する方法が有用です。
以下の様に書いてあげるとOKです!script_dir_path=$(dirname $(readlink -f $0))注意
BSDとかOSXでは
readlink
の実装が異なる為、使えない。
その場合は coreutils のgreadlink
を利用する事。script_dir_path=$(dirname $(greadlink -f $0))解説
$0
で実行されたパスから自分のファイルへの相対パスを取得して、
それをdirname
に渡してディレクトリ名を抽出。それをさらに
readlink -f
に渡してあげることで、
シェルスクリプト自身が置かれているディレクトリへの絶対パスが
システムに依存しないで動的に取得できる。
- 投稿日:2019-05-21T00:03:00+09:00
【Linux】シェルスクリプトで変数のデフォルト値を指定
変数のデフォルト値を指定
変数を参照した時、もしその変数が未定義だったり、空文字扱いだった場合に、
別の何かをデフォルト値として設定したいという時のTipsです。
以下の様にしてあげることで実現できます。# $hoge に $huga を代入。但し $huga が未定義だった場合は 0 を代入 hoge=${huga:-0}ちなみに、
-
の部分を=
に変える事で、
$huga
自身も上書きすることができます。# $huga が未定義だった場合、 $hoge にも $huga にも 0 を代入 hoge=${huga:=0}ちなみに未定義の場合のみ対象としたい場合は、中の
:
を消しておけばOKです!