FreeBSD の USB 接続も機種による相性があるようだ2017年07月16日 14時31分44秒

動作が怪しいと思っていた外付けのハードディスクがあるが、結局今でも使っている。既に、十年近く経つわけだ。その十年物のハードディスクについても新しい発見があった。

時おり、ディスクアクセスが遅れたり失敗したりした。そのため、動作の怪しいパーティションを避けての利用を試みるなどしていた。動作に疑問を持ちつつ、時おりにしろ、結局十年も使っている。

ここ数日あれこれ繋ぐ機種を変えて、ファイルの共有に使っていた。時おり、エラーが出たり、出なかったり。今回、やっと一つのことに気が付いた。HP Pavilion dv6426us に繋ぐと、ディスクのエラーが結構起きるのだ。pkg の更新を試みたが、時おり動作が止まる。Samsung RV515 では、何一つ問題なかった。

Pavilion での更新に支障が出たので、このディスクを RV515 に繋ぎ直して、NFS 経由でファイルを参照すると、pkg の更新作業は何の問題も無く終った。

他にも、三台程常用している 2.5 インチの外付けのディスクがある。これらのディスクでは、このような症状はない。また、時おりしか電源を入れないが、もう一台ある 3.5 インチの外付けディスクでも、このような経験はない。

FreeBSD で swap デバイスを増やし続けると…2017年05月24日 13時35分03秒

プロセスがメモリを喰っていたので、緊急で swapon でスワップを増やしてみた。ところが、以下の警告が表示される。実機は FreeBSD 11.0-RELEASE。
warning: total configured swap (1048552 pages) exceeds maximum recommended amount (932064 pages).
warning: increase kern.maxswzone or reduce amount of swap.

warning: total configured swap (1572838 pages) exceeds maximum recommended amount (932064 pages).
warning: increase kern.maxswzone or reduce amount of swap.
kern.maxswzone は読み込みのみ。/boot/loader.conf に書いて、起動じのみに変更できる。

メッセージを見る限り、増やした分が使えないように見える。もう少し、調べてみた方が良さそうだ。

ディスクの不良セクタの位置2017年05月22日 13時54分36秒

badsect と fsck で不良セクタを取り敢えず回避している。もう一度、不良セクタに当たってしまったら、bsdlabel で細かく分裂して、gconcat で繋げて使う予定だ。

そのときの為に、今回不良箇所を dd にて特定してあるのでメモをしておく。

$ dd if=/dev/ada0s2e of=/null bs=1MB
1MB で読み続けると 3082 ブロック目で、IO エラーになる。このパーティションの 3GB を若干越えた位置だ。エラーと再試行を繰り返して長いので、Ctrl-C で一旦止める。
$ dd if=/dev/ada0s2e of=/null bs=1MB skip=2083
skip を指定してエラー箇所を飛ばして、次の不良部分を探せる。

badsect を行い、 fsck をかける2017年05月20日 13時21分48秒

折角なので、badsect を試してみる。このファイルシステムは、書き込み用にマウント出来ないので、newfs をした。もしかしたら、-f で強制的に、マウントして試しても良かったのかも知れない。

まず、ディレクトリを作る。そして、badsect にディレクトリ名と fsck にて問題があるとされたセクタを指定する。

# mkdir .BAD
# badsect .BAD 20468153 20468154
Don't forget to run ``fsck /dev/ada0s2e''
初めて使うので知らなかったが、fsck を行うように出た。

折角なので、各種コマンドがどの様にファイルを見つけるか実験。

# find .BAD/
.BAD/
.BAD/20468153
.BAD/20468154
# ls -l .BAD/
ls: 20468153: Bad file descriptor
ls: 20468154: Bad file descriptor
total 0
# file .BAD/*
file: No match.
Don't forget to run ``fsck /dev/ada0s2e''
ls は認識するが、表示形式が他のファイルとは全く違う。find はファイルとして見つけた。file はファイルの存在自体を見つけられていない。

次に fsck をかける。

# fsck_ufs -y /dev/ada0s2e
** /dev/ada0s2e
** Last Mounted on /usr/local
** Phase 1 - Check Blocks and Sizes

HOLD BAD BLOCK? yes

INCORRECT BLOCK COUNT I=1219937 (0 should be 8)
CORRECT? yes


HOLD BAD BLOCK? yes

2558519 DUP I=1219938
UNEXPECTED SOFT UPDATE INCONSISTENCY

INCORRECT BLOCK COUNT I=1219938 (0 should be 8)
CORRECT? yes

INTERNAL ERROR: dups with softupdates
UNEXPECTED SOFT UPDATE INCONSISTENCY
** Phase 1b - Rescan For More DUPS
2558519 DUP I=1219937
UNEXPECTED SOFT UPDATE INCONSISTENCY

** Phase 2 - Check Pathnames
DUP/BAD  I=1219937  OWNER=root MODE=100600
SIZE=4096 MTIME=Jun 16 23:23 2017 
FILE=/.BAD/20468153

UNEXPECTED SOFT UPDATE INCONSISTENCY

REMOVE? yes

DUP/BAD  I=1219938  OWNER=root MODE=100600
SIZE=4096 MTIME=Jun 16 23:23 2017 
FILE=/.BAD/20468154

UNEXPECTED SOFT UPDATE INCONSISTENCY

REMOVE? yes

** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
BAD/DUP FILE I=1219937  OWNER=root MODE=100600
SIZE=4096 MTIME=Jun 16 23:23 2017 
CLEAR? yes

** Phase 5 - Check Cyl groups
FREE BLK COUNT(S) WRONG IN SUPERBLK
SALVAGE? yes

SUMMARY INFORMATION BAD
SALVAGE? yes

BLK(S) MISSING IN BIT MAPS
SALVAGE? yes

282705 files, 2127437 used, 408434 free (66 frags, 51046 blocks, 0.0% fragmentation)

***** FILE SYSTEM MARKED DIRTY *****

***** FILE SYSTEM WAS MODIFIED *****

***** PLEASE RERUN FSCK *****
不良セクタを認識し、特別な処理をしたようだ。この後、また fsck をかけるように出る。
# fsck_ufs -y /dev/ada0s2e
** /dev/ada0s2e
** Last Mounted on /usr/local
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
282705 files, 2127437 used, 408434 free (66 frags, 51046 blocks, 0.0% fragmentation)

***** FILE SYSTEM MARKED CLEAN *****
今度は正常に終了したようだ。

前回

badsect ではマウントできないファイルシステムは回避できない2017年05月19日 17時44分47秒

FreeBSD には badsect という不良セクタを回避するプログラムがある。不良セクタが出ていたので試そうとしたが、今回は無理なケースだった。これはファイルをあらかじめ作成して、以降の利用を防ぐので、ファイルシステムが機能しないと使えない。

fsck を何度かけても、特定の場所で失敗する。

$ fsck_yfs -y /dev/ada0s2e
** /dev/ada0s2e
** Last Mounted on /usr/local
** Phase 1 - Check Blocks and Sizes

CANNOT READ BLK: 20468128
UNEXPECTED SOFT UPDATE INCONSISTENCY

CONTINUE? yes

THE FOLLOWING DISK SECTORS COULD NOT BE READ: 20468153, 20468154,
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
215141 files, 2680121 used, 2396958 free (27470 frags, 296186 blocks, 0.5% fragmentation)

***** FILE SYSTEM STILL DIRTY *****

***** PLEASE RERUN FSCK *****
本来なら、
$ mkdir .BAD
$ badsect .BAD 20468153 20468154
なのだろう。

しかし、かなりのダメージがあるようで、

# mount -onoatime /dev/ada0s2e /mnt/ufs
mount: /dev/ada0s2e: R/W mount of /usr/local denied.
Filesystem is not clean - run fsck.: Operation not permitted
と失敗する。

ここから復帰するには、newfs は避けられない様に見える。

次回

make_dev_credv が FreeBSD のバグレポートにあった2017年05月16日 12時33分25秒

agppart の問題は [panic] make_dev_credv: bad si_name (error=17, si_name=agpgart)に載っていた。結構、あちこちの人達が影響を受けていたようだ。

hint.agp.1.disabled="1" で dynabook は動くようだ2017年05月10日 12時30分36秒

古い dynabook に FreeBSD の 非 SMP カーネルを入れてみたらmake_dev_sv 関数で落ちるようになった。メッセージには
vgapci1: <VGA-compatible display> at device 2.1 on pci0
agp1: <Intel 8285xM (85xGM GMCH) SVGA controller> on vgapci1
make_dev_sv: bad si_name (error=17, si_name=agpgart)
と残っている。

調べると、855GM搭載機が FreeBSD 10.2-RELEASE にて kernel panic にて類似したケースが見付かった。そちらから [FreeBSD-users-jp 95594] FreeBSD 10.2-RELEASE VGA panic が参照されていて、/boot/loader.conf で agp1 が無効化出来るとある。

hint.agp.1.disabled="1"
hint.drmn.1.disabled="1"

私の環境では drmn のエラーやデバイスは無いので、agp だけで大丈夫だろう。試すと、10 系でも dynabook が起動できた。11.0-RELEASE でも起動できたが、11.1-PRERELEASE の 11-STABLE だと、SMP カーネルでは駄目だった。

カーネル自体は起動するようになったが、この dynabook のキーボードが幾つか壊れている。そのため、USB キーボードも動作しなくては起動しても使えない。現状では 10 系と 11.0-RELEASE ではうまく USB キーボードを使えないようだ。11.1-PRERELEASE だと SMP では動かない。もう少し USB 関連を見直せば、キーボードは動くかも知れない。

make_dev_sv 関数を覗く2017年05月09日 20時37分36秒

make_dev_sv の実装は sys/kern/kern_conf.c にあるようだ。残念ながら、panic の前のメッセージは kdb の出力で流れて読めないのだが、運良く、panic が関数内の一つのみ。

関数のこの部分で panic を起こしている様だった。

    dev = newdev(&args, dev_new);
    if ((dev->si_flags & SI_NAMED) == 0) {
        res = prep_devname(dev, fmt, ap);
        if (res != 0) {
            if ((args.mda_flags & MAKEDEV_CHECKNAME) == 0) {
                panic(
            "make_dev_sv: bad si_name (error=%d, si_name=%s)",
                    res, dev->si_name);
            }

古い dynabook に FreeBSD の 非 SMP カーネルを入れてみる2017年05月02日 10時38分40秒

まずは、SMP をサポートしないカーネルを作る。UP はそのままでは分かりづらい名前だが、シングル CPU を指す名前だ。最初にコードを見たときは、すぐには思い出せなかった。

11-stable のコードで試す。sys/i386/conf/UP ファイルを作って、SMP を無効にする。

include GENERIC

ident           UP

# To make an SMP kernel, the next two lines are needed
nooptions       SMP                     # Symmetric MultiProcessor Kernel
#device         apic                    # I/O APIC
#nooptions      EARLY_AP_STARTUP

カーネルを構築して、古い dynabook に入れて再起動してみた。落ちるには落ちるが、少し前進したようだ。

panic()
make_dev_sv()
make_dev()
agp_generic_attach()
agp_i810_attach()
device_attach()
bus_generic_attach()

古い dynabook で FreeBSD を試す2017年04月29日 12時33分24秒

起動しない dynabook の FreeBSD だが、11.1-RELEASE が出るので、試してみることにした。

どうせ起動しないのは分かっているので、make installkernel でカーネルのみインストールをして試す。

panic()
atpic_assign_cpu()
intr_assign_cpu()
intr_event_bind()
nexus_bind_intr()
取り敢えず、CPU の割り当てに失敗しているようだ。

コードを見てみると、x86/isa/atpic.c に atpic-assign_cpu が実装されている。

static int
atpic_assign_cpu(struct intsrc *isrc, u_int apic_id)
{
 
        /*
         * 8259A's are only used in UP in which case all interrupts always
         * go to the sole CPU and this function shouldn't even be called.
         */
        panic("%s: bad cookie", __func__);
}
この関数が呼ばれれば、即死亡のようだ。しかし、UP カーネルなら行けるかも知れないとの希望も出てきた。SMP を無効にして再度試そうと思う。