Tag Archives: Linux (Server) - Page 2

CentOS 5 ディスククォータファイル チェック 失敗する

ディスククォータファイルをチェックするためquotacheckを実行した場合下記のようにクオータを一回切るように促された。
# quotacheck -a
quotacheck: Quota for users is enabled on mountpoint /home so quotacheck might damage the file.
Please turn quotas off or use -f to force checking.

一度、ディスククォータを無効化し、再度実行した場合正常に実行できた
# quotaoff -av
/dev/sda6 [/home]: user quotas turned off
# quotacheck -a

最後は忘れずに有効化しておく
# quotaon -av
/dev/sda6 [/home]: user quotas turned on

参考サイト
Quotaのチェック方法

Twitter フォロワー同期(フォロー専用)Bot Perl 新API対応

今更感がありますが以前書いたTwitter フォロワー同期(フォロー専用)Bot Perl 作成編についてTwitter APIの仕様変更により使えなくなっていたため修正したものを公開しておきます。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;

# モジュール使用宣言
use Array::Diff;
use Net::Twitter::Lite::WithAPIv1_1;
use YAML::Tiny;
use Encode;
use FindBin;

# 現在のパスから見て設定ファイルを読み込み
my $config = (YAML::Tiny->read($FindBin::Bin . '/config.yml'))->[0];
# OAuth認証
my $twitter = Net::Twitter::Lite::WithAPIv1_1->new(
        traits => ['API::REST', 'OAuth'],
        consumer_key => $config->{'consumer_key'},
        consumer_secret => $config->{'consumer_secret'}
);
$twitter->access_token($config->{'access_token'});
$twitter->access_token_secret($config->{'access_token_secret'});

# 認証失敗時の処理
die('Auth failed:'.$config->{'username'}) unless ( $twitter->authorized ) ;

# ユーザー名を含むユーザー情報を取得
my $cr = $twitter->verify_credentials;
my $own_id = $cr->{id};

my $nextc = -1; # paging default.
my @following_id_list; # outgo

# APIの仕様?から一度に100人までしか取得できないから0が返ってくるまでdoブロックをループ
do{
        # パラメータcursorは前回取得したフォローイングまでの番号が入っている
        my $following_list = $twitter->friends_ids({ id=>$own_id, cursor => $nextc });
        $nextc = $following_list->{next_cursor};
        # 配列からフォローイングのidを取得
        foreach my $id (@{ $following_list->{ids} }){
                push(@following_id_list, $id); # 後で比較するためにフォローイングを配列に保管
        }
}while($nextc!=0);
# 文字昇順でソート
@following_id_list = sort @following_id_list;

$nextc = -1;
my @followers_id_list; # income

# APIの仕様?から一度に100人までしか取得できないから0が返ってくるまでdoブロックをループ
do{
        # パラメータcursorは前回取得したフォロワーまでの番号が入っている
        my $followers_list = $twitter->followers_ids({ id=>$own_id, cursor => $nextc });
        $nextc = $followers_list->{next_cursor};
        # 配列からフォロワーのidを取得
        foreach my $id (@{ $followers_list->{ids} }){
                push(@followers_id_list, $id); # 後で比較するためにフォロワーを配列に保管
        }
}while($nextc!=0);
# 文字昇順でソート
@followers_id_list = sort @followers_id_list;

# 差分を取得(フォローイング)
my $diff_following = Array::Diff->diff(\@following_id_list, \@followers_id_list);

# 差分を取得(フォロワー)
my $diff_followers = Array::Diff->diff(\@followers_id_list, \@following_id_list);

# リムった人をリム返し
foreach my $delid_following (@{ $diff_following->{deleted} }){
        $twitter->destroy_friend({user_id => $delid_following});
}

# フォローした人をフォロー返し
foreach my $delid_followers (@{ $diff_followers->{deleted} }){
        $twitter->create_friend({user_id => $delid_followers});
}

VI(VIM)の簡単な使い方

5年以上もLinux系サーバと戯れときながら今更過ぎますが、これからのLinuxユーザの事を考えVIコマンドの簡単な使い方をメモしておきます。はっきり言ってVIの機能を語り尽くせば本が一冊書けるレベルの量です。O’ReillyでもVIの書籍が出ています。VIを熟知したい人は是非書籍を買ってください。

VI(VIM)コマンドとは

マウスやカーソルキーがキーボードに存在しない時代、UNIX全盛期に作られ非常に長い時間UNIXとともに進化してきたシンプルかつ強力なテキストエディタです。そしてVIを参考に機能を拡張したものがVIMです。基本的にVIMはVIコマンドとして使えるのでVIとして解説します。

VIコマンドを使う主な利点

・他のエディタと異なり基本的にUNIX系OSに標準で入っている
・UNIXの書籍や解説サイトでは非常に高い割合でVIを用いて設定など解説している
・リモート操作時に接続が不意に切れてもEmacsの様にプロセスが暴走しない

本当に基本的な使い方一覧

“$や%や#”はシェル上であるという表示です。各自環境に合わせて読んでください。

起動方法
$ vi ファイル名
上記を実行すると”ノーマルモード”で起動します。
※ 全角文字をファイル名に用いるのは文字化けの元です。半角英数を使いましょう。
※ 白文字をファイル名に用いるのは混乱の元です。アンダースコアを使いましょう。

記述方法
ノーマルモードから”i”キーを押す事により”挿入モード”となり文字入力が可能になります。
ノーマルモードに戻りたい場合は”ESC”キーを押します。

保存方法
ノーマルモードより”:w”を入力し”Enter”キーを押します。

終了方法
保存後に終了する場合は”:wq”を入力し”Enter”キーを押します。
保存せず終了する場合は”:q!”を入力し”Enter”キーを押します。

※ ファイルを編集する前には必ず元のファイルをバックアップする癖を付けましょう。
※ ファイルを編集する時は必ず編集したらこまめに保存する癖を付けましょう。

覚えておくと便利な操作一覧(ノーマルモード上での操作)

直前のコマンド操作を取り消す

”u”キーを押すと直前の操作を取り消す事ができます。
※ 現代の一般的なエディタとは異なり挿入モードもコマンド単位として戻ります。

ファイルの表示場所を変える

ファイルの先頭に移動
削除したい文字にカーソルを合わせ”g”キーを2回押すと先頭に移動する事ができます。

ファイルの最後に移動
削除したい文字にカーソルを合わせ”shift”キーと”g”キーを同時に2回押すと最後に移動する事ができます。

行番号の表示

”:set number”を入力し”Enter”キーを押します。
表示を消す場合はノーマルモードより”:set nonumber”を入力し”Enter”キーを押します。

指定する行番にカーソル移動

”:カーソルを移動させたい行数”を入力し”Enter”キーを押します。

文字列検索

”:/検索ワード(正規表現使用可能)/”を入力し”Enter”キーを押します。
検索結果は”n”キーを押すことにより次を検索できます。

文字列置換

個々に置換
”:/検索ワード(正規表現使用可能)/置換後の文字/”を入力し”Enter”キーを押します。

カーソルのある行全てを置換
”:/検索ワード(正規表現使用可能)/置換後の文字/g”を入力し”Enter”キーを押します。

ファイル内全て再帰的に置換
”:%s/検索ワード(正規表現使用可能)/置換後の文字/g”を入力し”Enter”キーを押します。

ノーマルモードからの削除

ノーマルモードからの文字削除
削除したい文字にカーソルを合わせ”x”キーを押すと文字を削除する事ができます。

ノーマルモードからの行削除
削除したい文字にカーソルを合わせ”d”キーを2回押すと文字を削除する事ができます。

文字コードを指定して開き直す

”:e ++enc=文字エンコーディング”を入力し”Enter”キーを押します。

ClamAVによるOS破壊を全力で阻止してみる

以前ClamAVをインストールしてremoveオプションを付け実行したところカーネルイメージを”破損した実行ファイル”と検知し削除されて起動しなくなったという事件が起きて以来、ClamAVでremoveオプションをつける事はなくなったのですがやっぱり誤検知しているようなので対策したいと思います。

誤検知中の様子。。。

/boot/vmlinuz-2.6.18-238.9.1.el5: Heuristics.Broken.Executable FOUND
/boot/vmlinuz-2.6.18-164.el5: Heuristics.Broken.Executable FOUND
/boot/vmlinuz-2.6.18-348.6.1.el5: Heuristics.Broken.Executable FOUND
/boot/vmlinuz-2.6.18-238.19.1.el5: Heuristics.Broken.Executable FOUND
/boot/vmlinuz-2.6.18-238.5.1.el5: Heuristics.Broken.Executable FOUND

設定ファイル(clamd.conf)の下記の行を次のように書きかえる。
DetectBrokenExecutables yes
DetectBrokenExecutables no

これで自分自身を”駆除”することはなくなりそうですね。

CentOS 5.9 ClamAV SELinux環境で実行する

ClamAVをインストールして起動しようとしたらエラーを吐いたのでメモ
# service clamd start

Starting Clam AntiVirus Daemon: LibClamAV Warning: RWX mapping denied: Can't allocate RWX Memory: Permission denied
LibClamAV Warning: Bytecode: disabling JIT because SELinux is preventing 'execmem' access.
Run  'setsebool -P clamd_use_jit on'.

言われた通りにSELinuxを設定しようとコマンドを実行してもエラーを吐く
# setsebool -P clamd_use_jit on

libsemanage.dbase_llist_set: record not found in the database
libsemanage.dbase_llist_set: could not set record value
Could not change boolean clamd_use_jit
Could not change policy booleans

下記の様にコマンドを実行すれば良いらしい。
# setsebool -P clamd_disable_trans on

正常に起動できる事を確認する
# service clamd start

Starting Clam AntiVirus Daemon:                            [  OK  ]

リモートサーバへ差分バックアップ CentOS5

以前使用していたrsyncを用いた差分バックアップスクリプトを書き換える機会があったのでついでに公開しておきます。

#!/bin/bash
#
# バックアップスクリプト(リモートサーバ)
#

#################### 各種環境設定 #######################
# rsyncコマンドのパス
RSYNC_BIN='/usr/bin/rsync'
# sshコマンドのパス
OPSSH_BIN='/usr/bin/ssh'
# バックアップ先のサーバのアドレス
HOST_NAME='example.net'
# バックアップ先のサーバのパス
HOST_PATH='/backup-example.net'
# rsyncコマンドのオプション
RSYNC_OPTION='-avz --delete -e'
# sshコマンドのオプション
OPSSH_OPTION='-i'
# ssh接続で使用する秘密鍵のパス
OPSSH_KEY='/root/.ssh/id_rsa'
# バックアップするディレクトリ
BACK_UP_PATHS='/'
################# バックアップ設定 ######################
# バックアップから除外するディレクトリ一覧
EXCLUDE_PATHS=(\
  '/lib/'\
  '/lib64/'\
  '/dev/'\
  '/proc/'\
  '/sys/'\
  '/misc/'\
  '/mnt/'\
  '/srv/'\
  '/opt/'\
  '/media/'\
  '/selinux/'\
  '/var/log/'\
  '/var/lib/'\
  '/var/run/'\
  '/var/cache/'\
)

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

# バックアップ除外オプションの作成
for PATH in ${EXCLUDE_PATHS[@]}
do
  EXCLUDE=${EXCLUDE}' --exclude '${PATH}
done

# 実行
${RSYNC_BIN} ${RSYNC_OPTION} \
"${OPSSH_BIN} ${OPSSH_OPTION} ${OPSSH_KEY}" \
${EXCLUDE} ${BACK_UP_PATHS} ${HOST_NAME}:${HOST_PATH}${BACK_UP_PATHS}

CentOS 5 物理メモリに余裕があるのに仮想メモリを使ってしまう 対策

swappinessの値を確認(デフォルト値:60)
この数値を減らせば減らすほど物理メモリを可能なかぎり使用するようになります。
# cat /proc/sys/vm/swappiness
60

下記の設定ファイルを開き追記する
# vi /etc/sysctl.conf
# Controls the swap memory usage
vm.swappiness = 0

設定ファイルのリロード
# sysctl -p

設定が反映されたことを確認
# cat /proc/sys/vm/swappiness
0

参考サイト
カーネルパラメータvm.swappiness によるスワップの最適化

mod_security と ModSecurity_Core_Rule の導入

mod_securityをアップデートしたら色々とひどい目にあったのでメモしておきます。

リポジトリ”Atomic”が必要となるので事前に導入しておいてください。
新規インストールする人はmod_securityをインストールします
# yum –enablerepo=atomic install mod_security

アップデートの場合、古いModSecurity_Core_Rule(1系)を使用しているとid周りの書式が違うらしくエラーを吐きます
そのためにApacheを再起動する前に設定ファイルの文法エラーがないか必ず確認しておいてください
# service httpd configtest

ModSecurity_Core_Ruleをダウンロードして下さい
# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master
ダウンロードしたファイルを展開します
# tar zxvf master
ディレクトリ名を変更します
# mv SpiderLabs-owasp-modsecurity-crs-9a715d8 modsecurity.d

念のためApacheの設定ファイル関連を一式バックアップします。
# cp /etc/httpd /etc/httpd_backup

ModSecurity_Core_Ruleをインストールします
# mv modsecurity.d /etc/httpd/
設定ファイルのテンプレートをコピーします
# cp /etc/httpd/modsecurity.d/modsecurity_crs_10_setup.conf.example\
/etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf

ModSecurity_Core_Ruleを設定します
# vi /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf
下記の項目を設定します。項目がない場合は自分で記述します。

SecAuditEngine RelevantOnly
SecRuleEngine On

SecAuditLogType Serial
SecAuditLog logs/audit_log

#SecDefaultAction "phase:1,deny,log"
SecDefaultAction "phase:2,log,deny,status:406"

mod_securityの設定を確認します
# vi /etc/httpd/conf.d/00_mod_security.conf
多分、デフォルトでは下記の様になっているとおもいます。

# ASL mod_security Template: /var/asl/data/templates/template-00_mod_security.conf
#
LoadModule security2_module modules/mod_security2.so
LoadModule unique_id_module modules/mod_unique_id.so
#
<IfModule mod_security2.c>
        # Basic configuration goes in here
        Include modsecurity.d/tortix_waf.conf

        # Rule management is handled by ASL
        Include modsecurity.d/00*exclude.conf
        Include modsecurity.d/*asl*.conf
        Include modsecurity.d/99*exclude.conf

</IfModule>

これを下記のように書き換えます。
※ Include modsecurity.d/base_rules/*.conf の部分は各自の用途に合わせて設定してください。ちなみに全部読むと多分エライことになると思います。

# Debug Log.
SecDebugLog logs/modsec_debug_log
SecDebugLogLevel 1

# Log File.
#SecAuditEngine On
#SecAuditEngine RelevantOnly
#SecAuditLog logs/mod_security_audit_log
#SecAuditLogType Serial
LogFormat "%V %h %t %{UNIQUE_ID}e \"%r\" %>s %X | %I %O | %<{mod_security-time1}n %<{mod_security-time2}n %<{mod_security-time3}n %D" mperformance
CustomLog logs/modsec_performance_log mperformance

# ASL mod_security Template: /var/asl/data/templates/template-00_mod_security.conf
#
LoadModule security2_module modules/mod_security2.so
LoadModule unique_id_module modules/mod_unique_id.so
#
<IfModule mod_security2.c>
        # Basic configuration goes in here
        #Include modsecurity.d/tortix_waf.conf
        Include modsecurity.d/modsecurity_crs_10_config.conf

        Include modsecurity.d/base_rules/*.conf

        # Rule management is handled by ASL
        Include modsecurity.d/00*exclude.conf
        Include modsecurity.d/*asl*.conf
        Include modsecurity.d/99*exclude.conf

</IfModule>

なお、2バイト文字を含むデータを渡すと”modsecurity_crs_40_generic_attacks.conf”内に定義されている”Heuristic Checks”の”Repeatative Non-Word Chars”に引っかり406エラーを返すため下記のようにコメントアウトします。
# vi /etc/httpd/modsecurity.d/base_rules/modsecurity_crs_40_generic_attacks.conf

#
# -=[ Heuristic Checks ]=-
#
# [ Repeatative Non-Word Chars ]
#
# This rule attempts to identify when multiple (4 or more) non-word characters are repeated in sequence
#
#SecRule ARGS "\W{4,}" "phase:2,capture,t:none,t:urlDecodeUni,block,id:'960024',rev:'2',ver:'OWASP_CRS/2.2.7',maturity:'9',accuracy:'8',msg:'Meta-Character Anomaly Detection Alert - Repetative Non-Word Characters',logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},setvar:'tx.msg=%{rule.msg}',setvar:tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION-%{matched_var_name}=%{tx.0}"

これまでの設定の文法が正しいか確認します
# service httpd configtest
問題がなければmod_securityを有効化するためApacheを再起動します
# service httpd restart

下記のようなURLへアクセスするとこで406エラーが出れ正常に動作している事が確認できます。
ディレクトリトラバーサル攻撃
http://サーバのURL/index.html?q=/etc/passwd
ヌルバイト攻撃
http://サーバのURL/index.html?q=./%00
OSコマンドインジェクション攻撃
http://サーバのURL/index.html?p=|traceroute
SQLコマンドインジェクション攻撃
http://サーバのURL/index.html?p=2%20order%20by%201
クロスサイトスクリプティング攻撃
http://サーバのURL/index.html?q=<script>alert(0)</script>

ESXi5.1 APC Smart UPS 連携 メモ

前回のアップデートESXi5.1を623860から914609へアップデートするにより、”vmware-autohalt.sh”を使用しなくてもゲストOSを自動でシャットダウンできるようになったため連携の仕方が若干変わった。

USP連携についてはあまり触れているところは少ないため大まかながらメモしておく。

無料版ESXi5.1のホスト方ではUSP連携に対応していないためゲストを利用してUPSと連携する。
※ 方法は色々あるようで”VMware vSphere Management Assistant”と呼ばれる物を導入する方法もあるようだが今回はゲストにCentOS5を使用して実現する。

使用するゲストにシリアルポートを認識させる。
WS000043

ゲストにApcupsdをインストールする。
インストールの方法は色々と紹介されているので他サイトを参照。

シリアルポートのディバイスファイルの設定が正しいか確認する。
# cat /etc/apcupsd/apcupsd.conf | grep “DEVICE”

# You must also specify a DEVICE, sometimes referred to as a port.
# For USB UPSes, please leave the DEVICE directive blank. For
# UPSTYPE   DEVICE           Description
# usb       <BLANK>          Most new UPSes are USB. A blank DEVICE
DEVICE /dev/ttyS0

Apcupsdを起動する。
# service apcupsd start

ゲスト側でUPSが認識されているか確認するために下記のコマンドを実行する。
# apcaccess

APC      : 001,051,1246
DATE     : 2013-05-28 13:06:07 +0900
HOSTNAME : UPS-SERVER
VERSION  : 3.14.10 (13 September 2011) redhat
UPSNAME  : UPS_IDEN
CABLE    : Custom Cable Smart
DRIVER   : APC Smart UPS (any)
UPSMODE  : Stand Alone
STARTTIME: 2013-05-28 12:33:37 +0900
MODEL    : SMART-UPS 1000
STATUS   : ONLINE
LINEV    : 101.4 Volts
LOADPCT  :  15.6 Percent Load Capacity
BCHARGE  : 100.0 Percent
TIMELEFT :  93.0 Minutes
MBATTCHG : 30 Percent
MINTIMEL : 10 Minutes
MAXTIME  : 1200 Seconds
MAXLINEV : 102.0 Volts
MINLINEV : 099.4 Volts
OUTPUTV  : 101.4 Volts
SENSE    : High
DWAKE    : 000 Seconds
DSHUTD   : 180 Seconds
DLOWBATT : 02 Minutes
LOTRANS  : 090.0 Volts
HITRANS  : 110.0 Volts
RETPCT   : 000.0 Percent
ITEMP    : 40.0 C Internal
ALARMDEL : 5 seconds
BATTV    : 28.3 Volts
LINEFREQ : 50.0 Hz
LASTXFER : Line voltage notch or spike
NUMXFERS : 0
TONBATT  : 0 seconds
CUMONBATT: 0 seconds
XOFFBATT : N/A
SELFTEST : NO
STESTI   : 336
STATFLAG : 0x07000008 Status Flag
DIPSW    : 0x00 Dip Switch
REG1     : 0x00 Register 1
REG2     : 0x00 Register 2
REG3     : 0x00 Register 3
MANDATE  : 02/04/99
SERIALNO : WS9906012897
BATTDATE : 02/04/99
NOMOUTV  : 100 Volts
NOMBATTV :  24.0 Volts
EXTBATTS : 0
FIRMWARE : 60.12S.A
END APC  : 2013-05-28 13:06:46 +0900

ESi5.1ホストマシンでシェルの使用とSSHでの接続を有効にする。
WS000044

※これらを有効にするとサマリで警告が表示されるが特に問題は無いので気にしない。

SSHを鍵を使い、パスワードなしでログインできるようにする。
SSHの鍵作成については過去記事ESXi5 SSH 公開鍵暗号化方式 作製を参照。

ゲストに秘密鍵を下記のパスになるようにコピーする。
/root/.ssh/esxi_id_rsa.pub

ESXi5.1ホストマシンに鍵を使ったSSHでパスワードなしでログインできることを確認する。
# ssh -i /root/.ssh/esxi_id_rsa.pub root@<ESXi5.1ホストマシンのIPアドレス>

ゲストでESXi5.1ホストマシンをシャットダウンするシェルスクリプトを作成する。
# vi /usr/local/bin/esxi_shutdown.sh

#!/bin/sh
ssh -i /root/.ssh/esxi_id_rsa.pub root@<ESXi5.1ホストマシンのIPアドレス> "/bin/halt"

実行権を与える。
# chmod 700 /usr/local/bin/esxi_shutdown.sh

実際に実行してESXi5.1ホストマシンがゲストからシャットダウンできるか確認する。
# /usr/local/bin/esxi_shutdown.sh

Apcupsdがシャットダウン時に実行するコマンドを書き換える
# vi /etc/apcupsd/apccontrol

#SHUTDOWN=/sbin/shutdown
SHUTDOWN=/root/bin/esxi_shutdown.sh

Apcupsdを再起動する。
# service apcupsd restart

最後にUPSの電源を引きぬいてESXi5.1ホストマシンが自動でシャットダウンされるか確認する。

参考サイト
ESXi 4.1 から ESXi 5.0 へアップグレード | SS-NET サポート
VMware ESXi 5.0 + vMA 5.0で電源管理 (3) – apcupsdの導入 « RootLinks Co., Ltd.
自宅サーバ構築じぶんめも SSH設定編 | ken39rajima

Raspberry Pi 自分の用途に合わせたディスクイメージを作成する Debian 最小構成

RaspbianはRaspberry Piに適した素晴らしいLinuxですがGUIが不要な用途だったりすると
不要なパッケージがあまりにも多く含まれていると感じたり
ほかのデスクトップ環境のディスクイメージを作りたいと考える人もいるかと思います
そこで、自分の用途に合わせたディスクイメージの作り方をメモしておきます

必要な物
・Raspberry Pi
・Raspbianの入ったSDカード
・空のSDカード
・カードリーダライタ

Raspbianの入ったSDカードで起動し
空のSDカードにディスクイメージとなる環境を作ります

SDのパーティション削除とジオメトリの設定
$ sudo fdisk /dev/sda

Command (m for help): p

Disk /dev/sda: 1990 MB, 1990197248 bytes
241 heads, 63 sectors/track, 256 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63     3886847     1943392+   b  W95 FAT32

Command (m for help): d
Selected partition 1

Command (m for help): x

Expert command (m for help): h
Number of heads (1-256, default 241): 255

Expert command (m for help): s
Number of sectors (1-63, default 63): 63

Expert command (m for help): c
Number of cylinders (1-1048576, default 256): 各自計算したシリンダ数

Expert command (m for help): r

Command (m for help): p

Disk /dev/sda: 1990 MB, 1990197248 bytes
255 heads, 63 sectors/track, 241 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

シリンダ数の計算
SDカードの容量 / 255 / 63 / 512 = シリンダ数
例) 1990197248 / 255 / 63 / 512 = 241
割り切れない数値は切り捨てます

Windowsパーティション’/boot’の作成 (64MB)
$ sudo fdisk /dev/sda

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-3887103, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-3887103, default 3887103): +64M

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (W95 FAT32 (LBA))

Command (m for help): a
Partition number (1-4): 1

Command (m for help): p

Disk /dev/sda: 1990 MB, 1990197248 bytes
62 heads, 62 sectors/track, 1011 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536    c  W95 FAT32 (LBA)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.

Linuxパーティション”/”の作成 (残りの容量全部)
$ sudo fdisk /dev/sda

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 2):
Using default value 2
First sector (133120-3887103, default 133120):
Using default value 133120
Last sector, +sectors or +size{K,M,G} (133120-3887103, default 3887103):
Using default value 3887103

Command (m for help): p

Disk /dev/sda: 1990 MB, 1990197248 bytes
40 heads, 6 sectors/track, 16196 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536    c  W95 FAT32 (LBA)
/dev/sda2          133120     3887103     1876992   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

必要なパッケージのインストール
$ sudo apt-get install dosfstools debootstrap git-core ca-certificates

フォーマット
$ sudo mkfs -t vfat -v -c -F 32 /dev/sda1
$ sudo mke2fs -t ext4 /dev/sda2 -m 1

SDカードに作成したパーティション/を/mntにマウントしてdebootstrapを使いDebianをインストール
$ sudo mount -o defaults,noatime /dev/sda2 /mnt/
$ sudo debootstrap –exclude=ed,nano –foreign –arch armel wheezy /mnt http://ftp.jp.debian.org/debian

必要なファイルをコピー
$ sudo cp /etc/inittab /mnt/etc/inittab
$ sudo cp /etc/hosts /mnt/etc/hosts
$ sudo cp /etc/fstab /mnt/etc/fstab
$ sudo cp /etc/network/interfaces /mnt/etc/network/interfaces

rootユーザで/mntをchrootし疑似的にLinuxを触る
chrootするとsudoコマンドは使えないためrootユーザになっておく必要があります
作業中は一応、ヒストリーに履歴が残ってしまうようなので残らないようにしておきます
debootstrapを実行させるとマウントしていた/procがアンマウントされるようなので再度マウントします
$ sudo su –
# export HISTSIZE=0 HISTFILESIZE=0
# chroot /mnt
# mount -n /proc
# export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# /debootstrap/debootstrap –second-stage –no-resolve-deps
# mount -n /proc

リポジトリの追加
これは標準のDevianのリポジトリを追加していますが面倒ならRaspbian側のファイルをコピーしても問題ありません
# vi /etc/apt/sources.list

# See sources.list(5) for more information, especialy
# Remember that you can only use http, ftp or file URIs
# CDROMs are managed through the apt-cdrom tool.
deb http://http.us.debian.org/debian stable main contrib non-free
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free

# Uncomment if you want the apt-get source function to work
#deb-src http://http.us.debian.org/debian stable main contrib non-free
#deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free

アップデートとアップグレードの実行とその他、各自必要なパッケージのインストール
ここで好きなパッケージをインストールしておくことで用途に合わせたディスクイメージを作成することができます
# apt-get update
# apt-get upgrade
# apt-get install console-common console-setup console-data console-tools \
keyboard-configuration locales ntpdate ntp lua5.1 vim ssh sudo syslog-ng usbutils

ユーザの作成とsudoグループへの追加
この時にpasswdコマンドを使用しrootユーザのパスワードを設定することもできます
# adduser pi
# gpasswd -a pi sudo

chrootでの作業とrootでの作業の終了
# exit
# exit

起動時にeth0を有効化させる設定
$ sudo vi /mnt/etc/network/interfaces

auto lo eth0

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

/bootとモジュールのコピー
$ sudo mount /dev/sda1 /mnt/boot
$ sudo cp -rp /boot/* /mnt/boot
$ sudo cp -rp /lib/modules/* /mnt/lib/modules

カーネルとモジュールのアップデート
$ sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update
$ sudo chmod +x /usr/bin/rpi-update
$ sudo ROOT_PATH=/mnt BOOT_PATH=/mnt/boot rpi-update

SDカードをアンマウント
$ sudo umount -l /mnt

シャットダウン
$ sudo shutdown -h now

SDカードを引き抜き、SDカードのイメージを作成すればオリジナルディスクイメージの完成です。
イメージ作成はWin32 Disk Imagerなどを使用すると簡単かもしれません

最後に作成したSDカードをRaspberry Piに接続し電源を入れ、正常に起動するするかを確認してみてください。

参考URL
覚書的な何か » Blog Archive » Raspberry PiでまっさらなDebianのインストール
Debian Linux for Raspberry Pi – GreenLeaf
Raspberry piにDebian squeezeをインストールする – もぐてっく
fdiskでフォーマットする – Android on Beagle