スパースバンドルディスクイメージの容量を増やす

スパースバンドルディスクイメージでは、ファイルを削減しても容量が増えません。

そのため、削減した分の領域を再利用できるように以下のコマンドを実行する必要があります。

$ hdiutil compact filename.sparseimage

SELinuxが有効な状態でのtar コピー

SELinuxが有効な状態ではディレクトリやファイルのリソースにはタイプが付与されており、通常のtar コマンドでは現在のタイプを保持したままコピーすることはできない。そのため、starコマンドを使用する必要がある。

$ sudo yum install star

starを入れた後、コピー元のディレクトリに移動し、

# star cvf – . -H=exustar -xattr | (cd コピー先; tar xvf -)

とするとコピーできる。

gitコマンドを使わず削除してしまったファイルの扱い

gitで管理されているファイルを普通にrmコマンドで削除してからcommitしようとすると次のようなメッセージが出てコミットの対象外になってしまいます。

$ git status
# On branch master
# Changes to be committed:
# (use “git reset HEAD <file>…” to unstage)
#
# modified: HogehogeApp/static/css/bootstrap.css
# new file: HogehogeApp/static/css/bootstrap.css.map
# modified: HogehogeApp/static/css/bootstrap.min.css
略
#
# Changed but not updated:
# (use “git add/rm <file>…” to update what will be mmitted)
# (use “git checkout — <file>…” to discard changes in working ectory)
#
# deleted: HogehogeApp/static/css/base.css
# deleted: HogehogeApp/static/css/changelists.css
# deleted: HogehogeApp/static/css/dashboard.css
# deleted: HogehogeApp/static/css/forms.css
略

解決策は簡単で数が少ないときは、deletedで示されたファイルを

$ git rm HogehogeApp/static/css/base.css

としてからcommitすればOKなのですが、数が多いと都度rmするのは大変なので、

$ git status | grep deleted | awk ‘{print $3}’ | xargs git rm
$ git commit

と一括で削除してからcommitしましょう。

拡張子の一括変更の仕方

Macではファイル名にスペースが含まれる場合があるので、そのままでは簡単に変更できない。
また、iTunesでは同じフォーマットでも拡張子によってオーディオブック形式になり倍速再生が可能になったりする。

変更したいファイルが同一のフォルダにある場合は次のコマンドで一括変更が可能。(例:m4a → m4b)

$ for i in *.m4a; do mv “$i” “${i%.m4a}.m4b”; done

inの後ろはlsではなく*にするのがポイント。lsではスペースが上手く処理できない。

Postfixの設定

postfixのインストール

古いCentOSやFedoraには標準状態ではMTAとしてsendmailが導入されています。

sendmailは非常に歴史は古いですが使い勝手が悪いため、Postfixがインストールされていない場合は、以下のインストール手順でインストールします。

# yum install postfix

postfixのインストールに成功したら、sendmailの削除を行います
(順序を間違えると依存関係でcrontabsなど必要なソフトまで削除される)

# yum remove sendmail

管理者用メールアドレスの変更

サーバー内のサービス用のアカウント(wwwとかftpとか)のエラーメールは全てrootに届くようにaliasが設定されている。

これを適切な管理者に設定しておかないとエラーメールがローカルに貯まってしまう。

/etc/aliasesの最下行に

root: hoge@hogehoge.com

といった管理者のメアドを追加し、

# newaliases

コマンドを実行して、設定内容を反映させておく。

全般設定

以下のように設定を変更します。
グローバルインターフェースにてSMTPをlistenする
(以下、diffの形式で変更点を記載しています。)

# diff main.cf.org main.cf

115,116c115,116
< #inet\_interfaces = $myhostname, localhost
< inet\_interfaces = localhost
—
> inet\_interfaces = $myhostname, localhost
> #inet\_interfaces = localhost

IPv4のみ使用するように設定

119c119
< inet\_protocols = all
—
> inet\_protocols = ipv4

メールボックスの形式としてMaildirを使用

419c419
< #home\_mailbox = Maildir/
—
> home\_mailbox = Maildir/

不必要なバナー表示を行わない

570a571
> smtpd\_banner = $myhostname ESMTP

送信元ホスト名やサイズのチェックを行う。

676a678,686
>
> disable\_vrfy\_command=yes
> smtpd\_helo\_required=yes
> mailbox\_size\_limit=1024000
> message\_size\_limit=1024000

サービスの起動設定

postfixの起動設定を以下のコマンドで確認

# /sbin/chkconfig –list postfix

現在のランレベルがonになっていることを確認する。

以下のコマンドでpostfixのプロセスを起動させる

# /etc/init.d/postfix start

なお、プロセスが起動しないと、mailコマンドでメール送信しようとした時に以下のエラーが出るので注意。

$ postdrop: warning: unable to look up public/pickup: No such file or directory

GNU Screenにパスワードを設定する

サーバーを管理する際にGNU Screenを使うと作業を中断せずにサーバから一時的に切断することが出来て便利です。

しかし、rootで作業したままセッションを切断すると、ユーザーのアカウントが何らかの原因で使われた際に即rootになれるので危険です(sudo使えって話かもしれませんが^^;)

そのため、GNU Screenにパスワードを設定します。
まず、一旦screenを起動します。

$ screen

次に暗号化パスワード作成します。

$ ctrl-a :password
New screen password: 入力
Retype new password: 確認のために再入力

デフォルトのコマンド文字はctrl-aですが、.screenrcでコマンド文字を変更している場合はctrl-aの部分を設定したコマンド文字に変更してください。

コマンド文字の後で「:」を打つと画面下に文字入力できますので、「password」と打ち込んで、設定するパスワードを確認も含めて2度打ち込んでください。

$ ctrl-a ]
$ erNqsdebEHp

ctrl-aの後]を入力すると、画面に暗号化されたパスワードが表示されますので、これをメモしておきます。そして、.screenrcに

password erNqsdebEHp

を記入すると、再度screenにアタッチする際にパスワードを聞いてくるようになります。

[Mac] Homebrewの使い方

Homebrewとは

HomebrewはMac用のパッケージマネージャーです。ソースファイルをダウンロードしてきて、都度コンパイル&インストールを実施します。

似たようなもので有名なものにMacPortsなどがありますが、HomebrewはMacPortsとは異なり、あらかじめOSにインストールされているソフトを
極力利用するように設計されているため、MacPortsに比べて短時間で準備が完了します。

また、rubyで作成されているので、rubyが分かる人には設定ファイルなどが読みやすいという利点もあります。

Homebrewのインストール方法

インストールにはXcodeが必要ですので、あらかじめMac AppStoreからインストール(無料です)しておいて下さい。
Xcodeのインストールが出来ていれば、Homebrewのインストールは以下のコマンドを打つだけで完了します。

# ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

Homebrewの基本的な使い方

(例としてパッケージ名にemacsを指定しています。)

  • バージョンを確認する
$ brew -v
  • インストール可能なパッケージ一覧を表示する
$ brew search
  • パッケージをインストールする
$ brew install emacs
  • インストールされているパッケージ一覧を見る
$ brew list
  • インストール済みのパッケージを削除する
$ brew uninstall emacs
  • Homebrewに関する各種設定を確認する
$ brew –config
  • Homebrew自身のアップデート
$ brew update
  • インストール済みのFormulaで最新でないものを確認
$ brew outdated
  • インストール済みのFormula(パッケージ)を全て最新にアップグレードする
$ brew upgrade
  • 各Formulaに関する情報を表示
$ brew info emacs
  • 各Formulaの内容(インストール手順)を表示/変更するには
$ brew edit emacs

Homebrew Caskについて

Homebrew CaskとはGoogle Chromeなど主にバイナリで配布されていてインストールが面倒なソフトを素早くインストールするためのHomebrewの拡張コマンドです。

以下のコマンドを実行することで、cask拡張をHomebrewに追加することができます。

$ brew tap caskroom/cask

Homebrew Caskの使い方はCaskを使わない場合と似ています。

  • インストール可能なパッケージ一覧を表示する
$ brew cask search
  • パッケージをインストールする
$ brew cask install google-chrome
  • インストールされているパッケージ一覧を見る
$ brew cask list
  • インストール済みのパッケージを削除する
$ brew cask uninstall google-chrome
  • 各Formulaに関する情報を表示
$ brew cask info google-chrome
  • 各Formulaの内容(インストール手順)を表示/変更するには
$ brew cask edit google-chrome

Mac用のGoogle Chromeでオートコンプリートを一部削除する

Google Chromeを使っていると、フォームに入力した内容が勝手に記録されて、次回以降の同じフォームへの入力時には前回入力した内容が表示されて入力が楽になる「オートコンプリート」機能があります。

非常に便利な機能なのですが、間違って入力した場合に項目を消すにはどうすればいいのか分かりませんでした。

ググったところ、ChromeのサポートページにはShift+Deleteで削除できると書いてあったのですが、Macで同じように試しても削除できません。

調べたところ、Mac用のChromeの場合は、削除したいオートコンプリートの項目をカーソルキーで選択しておいてから、「shift – fn – delete」の組み合わせを押すと削除できました。

mysqlのログをlogrotateする

mysqlのログローテートで少しはまったのでメモしておきます。
mysqlではサーバーのエラーログの他にクエリーログやスロークエリーログなどがあり、これらを一日一回logrotateを用いてローテーションさせたいと思いました。

CentOSには /etc/logrotate.d/mysqld が用意されており、内容を確認すると、

# cat /etc/logrotate.d/mysqld
# This logname can be set in /etc/my.cnf
# by setting the variable "err-log"
# in the [safe_mysqld] section as follows:
#
# [safe_mysqld]
# err-log=/var/log/mysqld.log
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret>
# user= root
#
# where "<secret>" is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !
# Then, un-comment the following lines to enable rotation of mysql's log file:
以下略

のように記載がありましたので、その通り実行しました。

まず、mysqladminを用いてflush-logsコマンドを実行するための専用ユーザー(reload)を作成します。

$ mysql -u root -p mysql
> GRANT RELOAD ON *.* TO 'reload'@'localhost' IDENTIFIED BY 'password';

次に、そのユーザーの情報を/root/.my.cnfに記載します。

# cat - > /root/.my.cnf
[mysqladmin]
user=reload
password=<secret>
^C
# chmod 600 /root/.my.cnf

最後に、/etc/logrotate.d/mysqld に次のように記載します。
(保存ファイル数などは目的に合わせて変更してください)

/var/log/mysql/mysqld.log /var/log/mysql/slow.log /var/log/mysql/query.log {
    daily
    missingok
    rotate 4
    compress
    delaycompress
    notifempty
    create 640 mysql mysql
    sharedscripts
    postrotate
        # just if mysqld is really running
        if test -x /usr/bin/mysqladmin && \
            /usr/bin/mysqladmin ping &>/dev/null
        then
            env HOME=/root/ /usr/bin/mysqladmin flush-logs
        fi
    endscript
}

重要なのは

env HOME=/root/ /usr/bin/mysqladmin flush-logs

この部分で、パッケージインストール時点で用意されていたファイルには
env HOME=/root/
の記述がありませんでした。
logrotateはanacronから起動されるのですが、anacronは /etc/cron.d/0hourlyに記載された内容に従って、cronが/etc/cron.hourly/0anacronを読み込んで実行されます。
しかし、ここで /etc/cron.d/0hourly に

# cat /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly

HOME=/の記述があるために、rootユーザーのHOMEが/と認識されてしまいます。
/直下に.my.cnfを置くことでも対応可能でしょうが、上記のようにenvコマンドを用いることで対応できますので、今回はこのように記載しました。