LoginSignup
0
0

More than 5 years have passed since last update.

Linux向けポータブル環境の基本

Last updated at Posted at 2019-03-06

Linux向けポータブル環境の基本

【ぜんぶポータブル】ポータル

最終更新:2019年3月6日

【ぜんぶポータブル】環境の「Linux」では、UbuntuRaspbianDebian GNU/LinuxAPT(dpkg)の利用を前提として説明されています。1
ただし、標準状態ではポータブルデバイス上のバイナリファイルを実行することができませんので、その対応を学習寄りで説明します。

いや説明はいいです、一言でお願いします。

ポータブルデバイスにある実行ファイルを、/tmpなど権限のある場所にrsync -tr --chmod=755してPATHを通してください。

これでわかる方は以下の説明は読まなくて大丈夫。
【ぜんぶポータブル】する方はスクリプトだけ持っていってください

確認に使用した環境

  • Ubuntu
    • VMware Fusion 11.0.2
    • Ubuntu 18.04.2 LTS 日本語 Remix リリース
      • amd64版をインストールし、アップグレードのみを済ませた状態で仮想マシンのスナップショットを取り、色々と確認する
    • ユーザー名はjt、もちろん読み替えてください
  • Raspbian
    • Raspberry Pi 3 Model B V1.2
    • Raspbian Stretch with desktop and recommended software(2018-11-13)
    • ユーザー名はpi
  • ポータブルデバイスはFAT32でフォーマットされ、/media/jt/USBMEMにマウントされている
  • ポータブル環境フォルダは/media/jt/USBMEM/jtHiuPortableにある
  • こんな感じでやりました。

DebianPortable_01.png

ポータブル環境の準備

操作はすべて端末(またはLXTerminal)を使います。Ctrl+Alt+Tキーで起動します。
また、テキストエディタはnanoで説明しますがもちろんviでもなんでもいいです。

ディレクトリを掘って移動する

あとでスクリプト化しますがとりあえず。
1行目のパスは自分の環境に置き換えてください。

Bashコマンド
export HOME="/media/jt/USBMEM/jtHiuPortable"
export P_CMD="$HOME/apps/linux"
mkdir -p "$P_CMD"
cd "$P_CMD"

アーキテクチャを調べる

Linuxカーネルのアーキテクチャはarchコマンドで、Debianパッケージのアーキテクチャはdpkg --print-architectureコマンドで取得できます。今回の動作環境ではこうなっています。

Linuxカーネル Debianパッケージ
VMware x86-64 amd64
RasPi3 armv7l armhf

ポータブル環境構築で大事なのはDebianパッケージ上でのアーキテクチャ名です。
そんなわけで以降、デスクトップPCの名前はamd64、ラズパイの名前はarmhfだと思ってください。

パスを通すスクリプト

パスを通すためのシェルスクリプトを書きます。

Bashコマンド
touch setPath.sh
nano setPath.sh

setPath.sh
#!/bin/bash
if [ -v $HOME_ORG ]; then
    export HOME_ORG="$HOME"
fi
if [ -v $PATH_ORG ]; then
    export PATH_ORG="$PATH"
fi

pwd_org="$PWD"
cd "`dirname $0`/../.."
export HOME="$PWD"
cd "$pwd_org"
export P_CMD="$HOME/apps/linux"

export TMPDIR="/tmp"
export P_ROOT="$P_CMD/`dpkg --print-architecture`"
export T_ROOT="$TMPDIR/zenbuPortable"
export P_BIN="$P_ROOT/usr/bin"
export T_BIN="$T_ROOT/usr/bin"
export P_LIB="$P_ROOT/usr/lib"
export T_LIB="$T_ROOT/usr/lib"
export PATH="$T_BIN:$PATH_ORG"

mkdir -p "$P_BIN"
mkdir -p "$T_BIN"
mkdir -p "$P_LIB"
mkdir -p "$T_LIB"

rsync -rt --chmod=755 $P_BIN/ $T_BIN/

echo Portable home has located in $HOME
echo Portable applications have located in $P_ROOT

nanoを保存して終了するときは、
Ctrl+OEnterCtrl+X
と順番に押します。

環境変数の解説

スクリプト処理での順に、

  • HOME_ORG ... 元々のホームディレクトリです。
  • PATH_ORG ... 元々のPATHです。
  • HOME ... ポータブル環境のホームディレクトリです。
  • P_CMD ... ポータブル環境実行コマンドの格納場所です。
  • TMPDIR ... ポータブル環境の一時ファイル格納場所です。/tmp以下に設定して、再起動で自動的に削除してもらいます。
  • P_ROOT ... ポータブル環境ルートです。Debianパッケージのアーキテクチャ名で掘っています。
  • T_ROOT ... 一時ファイル格納場所のルートです。
  • P_BIN ... ポータブル環境ルートの/usr/binです。
  • T_BIN ... 一時ファイル格納場所の/usr/binです。
  • P_LIB ... ポータブル環境ルートの/usr/libです。
  • T_LIB ... 一時ファイル格納場所の/usr/libです。
  • PATH ... 実行ファイルが見つからない場合はここ(T_BIN)を探しに行きます。多重呼び出しで無限増殖しないように設定しています。

で、関連ディレクトリを準備する、というものです。

ポータブル環境でのスクリプト実行

さて、このスクリプトを動作させたいところですが、ここはLinuxの世界です。
Macの場合はFAT系デバイスを接続すると、パーミッションは777固定として扱われるのですが、
Debianでは644固定、つまり実行権を付与できません。
や、もちろんやろうと思えば普通に出来ますけど、極力標準インストールでsudoさんに頼らないでやるというのが【ぜんぶポータブル】のコンセプトですので。

ただし、MacのFinderダブルクリック同様、

拡張子が.commandのファイルには自動的に実行権が付与されます

これはUbuntuもRaspbianも同様です。
そんなわけで、上記スクリプトを実行して、環境変数が適用された状態でBashを開くための.commandファイルを作成します。

Bashコマンド
touch startConsole.command
nano startConsole.command

startConsole.command
#!/bin/bash
. `dirname $0`/setPath.sh
cd "$HOME"
bash

これを実行してパスを設定し、さらに、ポータブル環境フォルダのトップに、ファイルマネージャからダブルクリックで起動できるようコマンドを作成します。
(Macで既に作った方は不要です)

Bashコマンド
./startConsole.command

# (パスを適用したBashが起動する)

touch Console.command
nano Console.command

Console.command
#!/bin/bash
if [ `uname` == "Darwin" ]; then
    platform="mac"
elif [ `uname` == "Linux" ]; then
    platform="linux"
else
    platform="win"
fi
`dirname $0`/apps/$platform/startConsole.command

unameがDarwinかLinuxかそれ以外(MSYSとかMinGWとか)かでプラットフォームを判別しています。

ファイルマネージャから起動する

デスクトップ環境とファイルマネージャは、Ubuntu(GNOME+Nautilus)とRaspbian(PIXEL+PCManFM)でちょっと違い、ダブルクリックしてスクリプトを起動するには、

  • Ubuntu(Nautilus)
    • 初期設定では、ダブルクリックするとテキストエディタが起動する。
    • 端末で起動させるには、「ファイル」メニューから設定を選び、「動作」タブ中「実行可能なテキストファイル」からどうするか確認するを選択する。
    • 以降ダブルクリックするとダイアログが出るので、端末内で実行するボタンを押す。
  • Raspbian(PCManFM)
    • 「ファイルを実行する」ダイアログが出るので、端末で実行するボタンを押す。

いずれもダブルクリック一発、とは行かないのですが、まぁご愛嬌ということで。

あっ、あとUbuntuではコマンドを実行するたびにいちいち「sudoさんにお願いしなさい」と口酸っぱく言われますが無視して結構です

基本的な考え方

現状どのようなコマンドが使えて、それがどの実行ファイルを呼び出すかは、whichコマンドで調べることができます。

端末
jt@ubuntu:~$ which rsync
/usr/bin/rsync

rsync/usr/bin/rsyncにあることがわかります。
これをUSBメモリにコピーします。

Bashコマンド
cp `which rsync` $P_BIN

もちろん、USBメモリ上でバイナリファイルは実行できませんので、アクセス権を設定できる一時ファイル格納場所に持っていきます。

では実際に試してみます。

端末
jt@ubuntu:~$ which rsync
/usr/bin/rsync
jt@ubuntu:~$ rsync -tr --chmod=755 $P_BIN/ $T_BIN/
jt@ubuntu:~$ which rsync
/tmp/zenbuPortable/usr/bin/rsync

setPath.shで既にPATHを通してありますので、rsyncは一時ファイル格納場所の方を使うようになりました。

ここでポータブル環境を抜けると、

端末
jt@ubuntu:~$ exit
exit
jt@ubuntu:~$ which rsync
/usr/bin/rsync
jt@ubuntu:~$ ls /tmp | grep zenbu
zenbuPortable

環境変数PATHの変更が無効となり、元通りになります。
ただし、一時ファイル格納場所は残ったままです。

では、おもむろに再起動して、もう一度端末を開いてください。

端末
jt@ubuntu:~$ ls /tmp | grep zenbu
jt@ubuntu:~$ which rsync
/usr/bin/rsync

何も表示されない。/tmpは再起動で自動的に消去されます。

で、ファイルマネージャからConsole.commandをダブルクリックして端末内で実行すると、

端末
Portable home has located in /media/jt/USBMEM/jtHiuPortable
Portable applications have located in /media/jt/USBMEM/jtHiuPortable/apps/linux/amd64
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

jt@ubuntu:~$ which rsync
/tmp/zenbuPortable/usr/bin/rsync
jt@ubuntu:~$ 

このように、元々のインストール状態には一切迷惑をかけずにポータブル環境のアプリケーションを実行しよう、というのが趣旨です。

確認できましたら、実際にはrsyncはポータブルにしないので、削除しておきます。

Bashコマンド
rm $P_BIN/rsync

基本的な考え方としてはこんな感じです。


  1. 他系列のディストリビューションの方はすみません、いつものように適宜読み替えてください。 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0