Skip to content

MacPortsの作業ディレクトリをRAMDISKに置く

2014年4月26日

バイナリ配布だけど、一部ソースからビルドらしい……
SSDの寿命を気にする繊細な方向け。

※あらかじめ、 /opt/local/var/macports/{build,distills,software,sources}を、
/Volumes/build/{build,distills,software,sources}に向けてシンボリックリンクを張っておく。
※1GBのRAMDISKを生成するため、メインメモリの空き容量に注意する。

+++ mkBuildDirInRAMDISK.sh

#!/bin/sh

export MACPORTROOT="/opt/local/var/macports"
export USERNAME=`whoami`

export OK='[ 33[01;32mOK33[00m ]'
export FAILED='[33[01;31mFAILED33[00m]'
export ERRMSG='33[01;31mMount Failed.33[00m'
export SUCCESSMSG="${OK} Mount Succeeded."
export AUTOSYNC=0

show_help() {
 echo "Usage: $0 [-s]"
 echo "-s : port selfupdate will run after /Volume/build mounted."
 exit 0
}

############################################

#Options
while getopts hs opt
do
 case ${opt} in
 h) show_help;;
 s) AUTOSYNC=1;;
 esac
done

if [ $USERNAME != 'root' ]; then
 echo $"${FAILED} Please run this script as root."
 echo "e.g.) $ sudo $0"
 exit 2
fi

if [ -h ${MACPORTROOT}/build ] &&
 [ -h ${MACPORTROOT}/distfiles ] &&
 [ -h ${MACPORTROOT}/software ] &&
 [ -h ${MACPORTROOT}/logs ] &&
 [ -h ${MACPORTROOT}/sources ] &&
 [ -h ${MACPORTROOT}/portdirs ]; then
 echo $"${OK} Checking symlinks"
else
 echo $"${FAILED} Please make symlink ${MACPORTROOT}/{build,distfiles,software,sources,logs}"
 echo $"${ERRMSG}"
 exit 1
fi

# When this machine mounts /Volumes/build, mkdir
if !(test -d /Volumes/build) then
 #make Ramdisk at 1GB
 sudo diskutil eraseDisk HFS+ build `hdiutil attach -nomount ram://2458830` 2>&1 >/dev/null
 sudo mkdir /Volumes/build/{build,distfiles,software,sources,portdirs,logs}
 echo $"${OK} RAMDISK /Volumes/build has been created."
 echo $"${SUCCESSMSG}"

if [ ${AUTOSYNC} -eq 1 ]; then
 echo "Port selfupdate will start..."
 port selfupdate
 else
 echo ""
 echo "Please run 'port sync && port selfupdate' as root."
 exit 0
 fi
 
else
 echo $"${FAILED} It seems /Volumes/build has already mounted."
 mount | grep '/Volumes/build'
 echo 'Please umount this volume(s).'
 echo $"${ERRMSG}"
 exit 3
fi

このスクリプト実行時は、$sudo ./mkBuildDirInRAMDISK.sh で行う。
(権限の関係でコケる。 ただnoownerのオプションでマウントできればいいのかも)
→rootで実行していないときはエラー終了するようにした

RAMDISKを作成した後は、必ず直後に
# port selfupdate
を実行する。
→ -sオプションをつければ自動的に実行するようにした

—————–
追記: 2015/07/20

いろいろ書き換えた。
rootでないと権限でコケるので、sudo(1)つかうなりしてrootにしていない場合は、エラー2で死ぬ。
-sオプションをつければ、マウント後に port selfupdateをやってくれる

—————–
追記: 2014/05/17

一般ユーザ権限で実行すると、#port install実行時に権限関係でコケるので、
RAMDISK生成時、およびmkdir(1)時に sudoを噛ませる。
したがって、上記スクリプト実行時に、「実行したユーザのパスワード」が必要となる。

また、port(8)のVERB,selfupdateでは、port自体のバージョンが上がるため、
port treeを更新する syncに書き換え。

広告

From → MacOSX

コメントする

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。