hoge diary - March 10, 2005

[Gentoo] パケットライト

偶然に見つけた HOWTO Packet Writing on CD-RW - Gentoo Linux Wikiに書いてある手順をほぼそのまま実行してみました.

まずはカーネルのコンパイルから.gentoo-dev-sources-2.6.10-r6 には既にパケットライト用のパッチが当たっているようなので,改めてカーネルにパッチを当てる必要はありませんでした.

Device Drivers ---->
  Block Drivers ---->
    <*> Packet writing on CD/DVD Media (EXPERIMENTAL)
    (8) Freebuffers for data gathering
    [ ] Enable write caching
  File Systems ---->
    CD-ROM/DVD Filesystems ---->
      <*> UDF Filesystem Support

次はモジュールの設定を編集し,デバイスノードの作成を行います.

# vim /etc/modules.d/aliases
alias block-major-97 pktcdvd

# mknod /dev/pktcdvd0 b 97 0

udftools のインストールを.

# emerge udftools

2005 年 3 月 10 日現在にインストールされたバージョンは 1.0.0b-r4 で,パッチは不要でした.

fstab の編集も行います.現在使用しているカーネルは 2.6.10 で,HOWTO Packet Writing on CD-RW - Gentoo Linux Wiki には,%If you have a 2.6.8 kernel, the line above should be: とあるので,次のように編集します.

# vim /etc/fstab
/dev/pktcdvd/0 /mnt/cdrw udf noauto,noatime,rw,users 0 0
 
# mkdir /mnt/cdrw
# chmod 0777 /mnt/cdrw

リブート後,DVD+RW のフォーマットを試みました.

cdrwtool -d /dev/cdroms/cdrom0 -q
using device /dev/cdroms/cdrom0
832KB internal buffer
setting write speed to 12x
Settings for /dev/cdroms/cdrom0:
        Fixed packets, size 32
        Mode-2 disc

I'm going to do a quick setup of /dev/cdroms/cdrom0. The disc is going to be blanked and formatted with one big track. All data on the device will be lost!! Press CTRL-C to cancel now.
ENTER to continue.

Initiating quick disc blank
wait_cmd: Input/output error
Command failed: a1 01 00 00 00 00 00 00 00 00 00 00 - sense 05.30.05
blank disc: Illegal seek
can't unlock door

何かエラーが出ますね... ドライブに突っ込んでいるのが DVD+RW だからでしょうか.良く考えてみれば,DVD+RW の場合,dvd+rw-format というコマンドがあるので,そちらを使ってフォーマットすればいいだけでしょう.

... もとい,今回使用した DVD+RW はフォーマット済みですので,このステップは無視することに.

/etc/conf.d/cdrw を次の内容で作成しました.

cdrw_list="/dev/cdroms/cdrom0"

同様に,/etc/init.d/cdrw を次の内容で作成しました.

#!/sbin/runscript
# Copyright 1999-2003 Gentoo Technologies, Inc.
# Distributed under the terms of the GNU General Public License v2
# $Header: $

depend() {
  need localmount
}

start() {
  # Starting with kernel 2.6.8 there is a different syntax
  # for the pktsetup program.
  kernel_major=$(( `uname -r | cut -d'-' -f1 | cut -d'.' -f2` ))
  kernel_minor=$(( `uname -r | cut -d'-' -f1 | cut -d'.' -f3` ))
  local i
  local minor=0
  local retval=0
  local last_result=0
  if [ ! -e "/dev/pktcdvd" ]
    then
      /sbin/modprobe -a pktcdvd
  fi
  for i in ${cdrw_list}
  do
    ebegin "Enabling CD-RW packet writing on ${i}"
    if [ ${kernel_major} -ge 6 ] && [ ${kernel_minor} -ge 8 ]
      #then /usr/bin/pktsetup /dev/pktcdvd/${minor} ${i} >/dev/null 2>&1
      then /usr/bin/pktsetup ${minor} ${i} >/dev/null 2>&1
      #else /usr/bin/pktsetup /dev/pktcdvd${minor} ${i} >/dev/null 2>&1
      else /usr/bin/pktsetup pktcdvd${minor} ${i} >/dev/null 2>&1
    fi
    if [ -b /dev/pktcdvd/${minor} ]
      then last_result=0
      else last_result=1
    fi
    retval=$(( ${retval} + ${last_result} ))
    minor=$(( ${minor} + 1 ))
    if [ ${last_result} -gt 0 ]
      then
        ewend ${last_result} "Failed to enable packet writing on ${i}"
    fi
  done
  eend ${retval}
}

stop() {
  # Starting with kernel 2.6.8 there is a different syntax
  # for the pktsetup program.
  kernel_major=$(( `uname -r | cut -d'-' -f1 | cut -d'.' -f2` ))
  kernel_minor=$(( `uname -r | cut -d'-' -f1 | cut -d'.' -f3` ))
  local i
  local minor=0
  local retval=0
  local last_result=0
  for i in ${cdrw_list}
  do
    ebegin "Disabling CD-RW packet writing on ${i}"
    umount /dev/pktcdvd/${minor} >/dev/null 2>&1 || true
    if [ ${kernel_major} -ge 6 ] && [ ${kernel_minor} -ge 8 ]
      #then /usr/bin/pktsetup -d /dev/pktcdvd/${minor} >/dev/null 2>&1
      then /usr/bin/pktsetup -d ${minor} >/dev/null 2>&1
      #else /usr/bin/pktsetup -d /dev/pktcdvd${minor} >/dev/null 2>&1
      else /usr/bin/pktsetup -d pktcdvd${minor} >/dev/null 2>&1
    fi
    if [ -b /dev/pktcdvd/${minor} ]
      then last_result=1
      else last_result=0
    fi
    retval=$(( ${retval} + ${last_result} ))
    minor=$(( ${minor} + 1 ))
    if [ ${last_result} -gt 0 ]
    then
      ewend ${last_result} "Failed to disable packet writing on ${i}"
    fi
  done
  eend ${retval}
}

スクリプトを実行してみます.

# chmod 0755 /etc/init.d/cdrw
# /etc/init.d/cdrw start
 * Enabling CD-RW packet writing on /dev/cdroms/cdrom0...
 * Failed to enable packet writing on /dev/cdroms/cdrom0   [ !! ]
                                                           [ !! ]

うーむ,走りません.

試しに,最初に作ったブロックデバイススペシャルファイルを消去してみたところ,正常にスクリプトが起動しました.

# rm /dev/pktcdvd0
 * Enabling CD-RW packet writing on /dev/cdroms/cdrom0...  [ ok ]

デバイススペシャルファイルが自動作成されているので,major 番号を確認してみると...

# ls /dev/pktcdvd0
brw-rw----  1 root root 254, 0  3月 10 11:33 /dev/pktcdvd0

97 じゃないじゃないですか.まあいいか.

ということで早速 DVD+RW のパケットライトを試してみます.

% mount /mnt/cdrw
% touch /mnt/cdrw/hoge
touch: cannot touch `hoge': 許可がありません
% umount /mnt/cdrw

では,root ではどうでしょうか.

# mount /mnt/cdrw
# touch /mnt/cdrw/hoge
touch: cannot touch `/mnt/cdrw/hoge': 入力/出力エラーです

ぬぅ,まだまだ先は長いようです.

コメント

名前(何でも可):

テキスト(http:// を含む内容は投稿できません):

トラックバック

トラックバック URI: https://www.pakunet.jp/hoge/trackback/2005031001

トラックバックはありません.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Thu Nov 01 01:16:31 JST 2007