20190521のLinuxに関する記事は16件です。

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/

具体的には次の手順を踏むと対処できます。

  1. Installs→Addから目的のバージョンのUnityを選択し、追加モジュールにMac Build Support (Mono)も選択するようにしてインストール1
  2. インストールしたUnityのインストールディレクトリ(~/Unity/Hub/Editor/<バージョン>)に移動
  3. Editor/Data/PlaybackEnginesの中にMacStandaloneSupportというディレクトリを作成
  4. 次のファイルを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を書き換えればいいという訳でも無いため具体的な修正方法は分かりません。多分その内治ると思います。それまではこういう手順でインストールしたものを移動させると大丈夫です。


  1. Unityを既にインストールしているなら大丈夫だとは思いますが念のため、Unityをインストールするには右上の自分のアイコン→Manage License→ACTIVATE NEW LICENSEからライセンスを有効化する必要があります。 

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

簡単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ではここの段階ではbasebase-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 git

4. システムの設定

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

最後にsudoerswheelを追加します。

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を使っておいたほうが幸せになれる確率が高いと思いますよ」とコメントをいただきまして、該当箇所を修正いたしました。
コメントありがとうございます。

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

自分用勉強メモ10日目

tips

ブラウザでUser Agentを変更したいとき

CTFの問題を解いていて,User AgentをGooglebotに偽装したかった.
Firefoxだとアドオンを入れる必要があるらしい.
Chromeで変更する手順を見つけたので参考にした.

参考:Google ChromeでUserAgentを変更する

  1. Developer Toolsを開く (右クリックで「検証」)
  2. More ToolsからNetwork conditionsを開く
  3. select automaticallyのチェックを外す
  4. 好きなUserAgentに変える

Ubuntu19.04でvimのシンタックスハイライトが機能しなかった

Ubuntuが最小構成でインストールされていた場合,Vimも最小構成になっていた.
自分の場合はaptでVimをインストールし直したらシンタックスハイライトが使えるようになった.

# apt install vim

調べた知識

バイナリ解析で役に立つツール

pwntools

CTF用のPythonライブラリ.
pip install pwnでインストールできる.
p32という関数を使えば,数値を32bitのリトルエンディアンに変換してくれる.
例:p32(0x11223344)

checksec

実行ファイルのセキュリティ機構を表示してくれるシェルスクリプト.
以下からダウンロードできる.
slimm609/checksec.sh

gdb-peda

gdbの拡張版.
以下からインストールできる.
longld/peda

readelf

Linuxのコマンド.
ELFの情報を表示する.

rp++

実行ファイル中のROP Gadgetを表示する.
以下からダウンロードできる.
0vercl0k/rp

ELFのセキュリティ機構

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: 実行ファイル
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プログラムとの対話を自動化する 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

実行すると対話形式で nameage を聞かれ、入力が終わると 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回必要みたいです。

以上!

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

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

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

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_rebootnoもしくはコメントアウトする。

下記のデフォルト値であれば「自動適用はしないが、手動でインストールしたものはリブート時に自動適用する」ということになる。

install_on_reboot = yes
autoinstall = no

自動適用するときには、install_on_reboot = yesupgrade_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-crontab

cronの起動ファイルを確認すると毎時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 --cron

cronの詳細は下記資料を参考のこと。

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 uptrack

cronファイル/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コマンドでプロセスを確認すると、dracutgzipcpioなどが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プラグインなどさまざまな機能がある。興味があればそれらも調べて欲しい。

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

linuxのネットワークにファイルをコピー

SCPでコピー
SFTPでsshファイルの転送プロトコル

scp sourcefile destination #sourcefileをdestinationにコピー

sftp host #hostにsecureなファイル転送をスタート

sftp sebec@host

SFTPでコピー

$ 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.txt

scpでコピー

$ scp sample.txt linuxServer:/tmp/
$ scp sample.txt linuxServer:~/

$ ssh linuxServer
@linuxServer$ ls
sample.txt

@linuxServer$ ls /tmp/
sample.txt

scpで違うユーザーのところにコピー

$ 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 #これだけで繋がるように

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

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$ 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 条件文停止条件の設定
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】シェルスクリプトにおける && と || の違い

複数コマンドをAND演算で実行する &&

bashシェルスクリプト上では && はAND制御演算子である。
以下の場合、command1が成功したらcommand2を実行する。

$ command1 && command2

エラーが起こった時の挙動

; でコマンドを連結する場合、コマンド1がエラーであっても、次のコマンドが実行されるが、
&& で連結した場合はエラーが起きた時点で動作が停止する。

複数コマンドをOR演算で実行する ||

|| はOR制御演算子である。
指定したコマンド1が異常終了した時に、それに対処する形でコマンド2を実行できるので、
主に事後のエラー処理などを行なう時に使える。

以下の場合、command1が失敗した場合command2を実行します。

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

【Linux】複数コマンドを一行でまとめて実行するセミコロン

複数コマンドを一行でまとめて実行するセミコロン

Linuxでコマンドの間に ; が入っていたら、そこで改行が入っていると思えばよいです。
; は区切り文字として扱われます。

複数のコマンドを一行で実行したいときなどに使えます。
command1が終了したらcommand2を実行します。

$ command1; command2

エラーが起こった時の挙動

; でコマンドを羅列した場合、command1が成功しても失敗してもcommand2が実行されてしまいます。
つまり、 エラーがあっても停止はしてくれませんので注意が必要です。

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

【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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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
" 0

trapコマンドを使うにあたって

シグナルの理解は必須です。
以下のサイトを参照の上で利用する事を推奨します。

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

【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 に渡してあげることで、
シェルスクリプト自身が置かれているディレクトリへの絶対パスが
システムに依存しないで動的に取得できる。

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

【Linux】シェルスクリプトで変数のデフォルト値を指定

変数のデフォルト値を指定

変数を参照した時、もしその変数が未定義だったり、空文字扱いだった場合に、
別の何かをデフォルト値として設定したいという時のTipsです。
以下の様にしてあげることで実現できます。

# $hoge に $huga を代入。但し $huga が未定義だった場合は 0 を代入
hoge=${huga:-0}

ちなみに、 - の部分を = に変える事で、
$huga 自身も上書きすることができます。

 # $huga が未定義だった場合、 $hoge にも $huga にも 0 を代入
 hoge=${huga:=0}

ちなみに未定義の場合のみ対象としたい場合は、中の : を消しておけばOKです!

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

【Linux】何もしない;(コロン)が便利

何もしない : (コロン)が便利

: を利用すると、何もせずに終了ステータス0(正常終了)を返します。

  • 面倒なエラー処理を完結にする。
  • 入出力のリダイレクト元/先として使う。

等々、覚えておくと凄く便利です。
また、コマンドなので引数も受け取ることが可能。

例えば標準出力にも何も返さないので、
それを利用してファイルの初期化も簡単に出来る。

# ファイルを 0 バイトで上書き
: > test.log
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む