忍者ブログ
開発やらlinuxについてやったこと、ひっかかったことのメモ
[1] [2] [3] [4] [5] [6] [7] [8]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

簡単に出来るらしいのだが,出来ません.なぜだ.
mixiアプリで実装しているのですが,
400 Bad Requestが出てしまって失敗.firebugでもどこがおかしいのか分からず.

しょうがないから,mixiアプリから離れ,テスト環境で実装してみましたが,,,出来ず.
出来ました(20091109)

なぜだー.
以下11月05日(現在)のソースコード


 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3 <html xmlns="http://www.w3.org/1999/xhtml">
  4   <head>
  5     <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
  6     <title>ようこそ</title>
  7
  8     <link rel="stylesheet" href="./test.css" type="text/css">
  9
 10     <script src="http://maps.google.co.jp/maps?file=api&amp;v=2&amp;key=ABQI    AAAA3rz-n0Fwa7en-yAJRj5J1hQhaKahdK6unGGkGElxMSZ-PRd4IxQiddQzSOYpyPwJdZ3q5Y3D    9G9QEg"
 11       type="text/javascript"></script>
 12     <script type="text/javascript">
 13
 14     var map = null;
 15     var geocoder = null;
 16
 17     function load() {
 18       if (GBrowserIsCompatible()) {
 19         var map = new GMap2(document.getElementById("map")); ←そりゃダメだわw
 20         map.addControl(new GLargeMapControl());
 21         map.addControl(new GMapTypeControl());
 22         var niigata_univ = new GLatLng(37.868044,138.947353);
 23           map.setCenter(niigata_univ, 15);
 24         geocoder = new GClientGeocoder();
 25       }
 26     }
 27
 28 function showAddress(address) {
 29   alert(address);
 30       if (geocoder) {
 31          geocoder.getLatLng(
 32               address,
 33               function(point) {
 34               if (!point) {
 35               alert(address + " not found");
 36               } else {
 37               map.setCenter(point, 13);
 38               var marker = new GMarker(point);
 39               map.addOverlay(marker);
 40               marker.openInfoWindowHtml(address);
 41               }
 42               }
 43               );
 44          }
 45          }
 46
 47
 48     </script>
 49
 50   </head>
 51
 52 <h1>ここはindexページです.</h1>
 53
 54 <br/>
 55 <script language="JavaScript"><!--
 56 function myMenu(){
 57   select = document.selectForm.menu.selectedIndex;
 58   location.href = document.selectForm.menu.options[select].value;
 59 }
 60 //--></script>
 61
 62 <form name="selectForm">
 63 <select name="menu">
 64 <option value="test.html">testページへ
 65 <option value="css-test.html">スタイルシートの練習へ
 66 </select>
 67 <input type="button" value="go" onclick="myMenu()">
 68 </form>
 69
 70
 71 <!-- google maps APIを利用した地図データの表示 -->
 72 <!--  -->
 73 <BODY onload="load()" onload="GUnload()">
 74   <form onsubmit="showAddress(this.address.value);return false" action="#"/>
 75     <input type="text" name="address"/>
 76     <input type="submit" value="検索"/>
 77   </form>
 78     <div id="map" style="width: 500px; height: 300px"></div>
 79
 80
 81 </BODY>
 82
 83 </html>


今日は疲れたからやめます.



PR
うちのPCはDell Inspiron 530sという機種なのですが,

ブートデバイス順を
ハードディスクよりRemovable(USB)を優先した状態で起動すると,正常にブートできませんでした.ちなみにUSBの外付けHDDは大丈夫.このBIOSはそれをRemovableではなくハードディスクとして認識している模様(良いことなんだけどそのおかげで余計この問題になかなか気付かなかった).

しらべてみると「USB地雷」という有名な初期不良問題を抱えていたらしいです.

そんな問題抱えたまま出荷すんじゃねーよ!さすがDell.

安さには必ず訳があるというわけです.

で,BIOSをアップデートすると治るかもよ!とグーグル先生が言ってくれたので,早速実行.

しかし結果は変わらず.

試しにUSBフラッシュメモリをipod nanoにしてみたら正常に起動することを確認できました.

つまりはBIOSを最新バージョンにアップしても,まだUSB地雷の根本的な解決に至っていない模様.

以下に今回の問題を個条書きでまとめました.
【問題】
・BIOSのブートデバイス順をHard diskよりRemovableを優先させた状態で,USBフラッシュメモリを刺したまま電源をいれると,BIOSがデバイスの正常ブートを行えない(USBをブートしている段階で止まる?)

【詳細】

[問題が起きた機種]
Dell Inspiron 530s

[BIOS]
BIOS 1.0.16(前バージョンは1.0.5.前バージョンでも問題は発生)

[問題が発生したフラッシュメモリ]
Transcend JFV30/2GB

[問題の発生したUSBポート]
フロント(2つ)とバックポートでも問題が発生
※バックポートに関しては一つしか確認していない

【気付いたこと】
・USBの外付けHDDはBIOSはHard diskとして認識しているから大丈夫
・Transcendの代わりにipod nanoに代えたところ正常にブートされた.


【補足】
・CDROMデバイスの方では問題は起きなかった.
・BIOS1.0.5のときはipod nanoでも異常が発生していた気がする.

MBMはフリーのブートローダで,

メインの仕事は,
「選択された各パーティションのPBRを呼び出す」ことらしい.

このMBMは今回ディスクからインストールしたのだけれど,
MBMはフロッピーからブートするインストーラしか配布していないため,

それをisoイメージに変換する必要がある.

最新版(MBM R0.39)のダウンロード

http://my.vector.co.jp/servlet/System.FileDownload/download/http/0/35596/pack/dos/util/boot/mbm039.zip

FDイメージ->isoイメージ変換プログラム
www.geocities.co.jp/SiliconValley-Cupertino/3686/fdtoiso.html

そんでもって適当なライティングソフトでCDに焼いたら,

CDからブートするとMBMのインストーラが立ち上がる.

【注意】
MBMをインストールしてしまうと,デフォルトインストールしたLinuxは読み込めなくなるかも?必ず,LinuxのGRUBをPBR領域に書き込んでからMBMをインストールすること


インストール手順は以下のとおり
1.   3.Install boot managerを選択
2.   インストールHDDを選択(通常は0)←MBRを配置したい場所
3.   yでEnter

これでインストール完了
MBMのヘルプはググること.
 
【参考URL】
マルチブートするなら2段階ブートに統一しよう
wikiwiki.jp/disklessfun/


マルチブート環境構築レポート(概要編)でも説明したように,

Linuxは1段階ブートであるので,
Windowsや他のOSとの共存における問題回避のためにも

Linuxを2段階ブートで起動できるようにする.

そのためには,
grubコマンドを使用する
※root権限で実行すること

端末上で
>sudo grub
すると,

grub>

と出力され,
grubコンソールが起動するので.

grub>root (hd1,0)
grub>setup (hd1,0)

を実行する.
(hd x , n)はBIOSで認識されている(x+1)番目のハードディスクの(n+1)番目の
パーティションであることをあらわしている.
つまり,上記の例はUSBHDD上の1番目のパーティションのPBRにGRUBをインストールしたということ.

ちなみにsudo fdisk -l を実行すると,パーティションの構成状況を確認可能.
私の場合は以下↓
>sudo fdisk -l
ディスク /dev/sda: 320.0 GB, 320072933376 バイト
ヘッド 255, セクタ 63, シリンダ 38913
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0xd8000000

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sda1               1           8       64228+  de  Dell ユーティリティ
/dev/sda2               9        1314    10485760    7  HPFS/NTFS
/dev/sda3   *        1314       38914   302019584    7  HPFS/NTFS

ディスク /dev/sdb: 250.0 GB, 250059350016 バイト
ヘッド 255, セクタ 63, シリンダ 30401
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0x19e8da2e

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sdb1               1       29653   238187691   83  Linux
/dev/sdb2           29654       30401     6008310    5  拡張領域
/dev/sdb5           29654       30401     6008278+  82  Linux スワップ / Solaris

sdaは1番目のHDD(内蔵HDD),sdbは2番目のHDDのパーティションという感じ.
数字がそのHDD内領域のパーティション番号ということらしい.

これでPBRにGRUBがインストールされた.(menu.lstの内容はそのままだった)

【参考URL】
マルチブートするなら2段階ブートに統一しよう
wikiwiki.jp/disklessfun/

半日かかった.
やっと終わった!

今回の作業でOSのブートに対する基礎知識は十分についたとおもう.

まず,基本的な知識から

MBR(マスタブートレコード)
これは,BIOSがOSブートの第1段階として呼び出す領域であり,原則OSのブートローダーはここに配置されている.

PBR(プライベートブートレコード)
これは,パーティションの先頭にある領域で,WindowsやFreeBSDなどLinux以外のほとんどのOSは,ここにメインのブートローダを配置する.要するにMBRは領域が少ないので,

MBR→PBR(MBRで出来ないようなこと)→OSをブート

という感じにしているっぽい.
ちなみにこれを「2段階ブート」と一般的に呼ばれているらしい.

PBRの説明で「Linux以外」となっていたことについて.
現行のLinuxはGRUBというブートローダを使用しており,GRUBは他OSのように2段階ブートせず,MBRから直接カーネルにアクセスし,/boot/grub/menu.lstを参照したり,stage2と呼ばれる作業を実行してOSをブートするらしい.
つまり,

MBR→OSをブート

している.これは前述の2段階ブートと比較して「1段階ブート」と呼ばれているらしい.

これがどういうことかというと,マルチブート環境構築時に問題が発生しやすくなってしまう.

例えばWindowsが入っていたPCにパーティションを区切ってLinuxを追加した場合,

MBRはGRUBで上書きされてしまう.

つまりWindowsを起動するためには

MBR(GRUB stage1)→Linuxファイルシステム(GRUB stage2)上のmenu.lstを参照し,OS選択→Windows用PBR→Windowsのブート

という経路になっているみたい.

で,今回私が経験した問題がこれで説明できる.
内蔵HDDにWindowsが入っていて,新規でLinuxをUSBHDDにインストールすると,内蔵HDD上のMBRにはGRUBが上書きされてしまうため,USBを外した状態でBIOSを起動すると以下のメッセージが出力されてしまう.

GRUB Loading stage1.5.  
GRUB Loading, please wait...  
Error 21


これはGRUBのstage1.5(stage2.0を呼び出すための準備?)をロードしようとしているが,stage2.0が存在しないため,エラーが発生してOSのブートが出来ない.

さらには/boot/grub/menu.lstは,GRUBインストール時のBIOSのハードディスクのブート順などが書かれているため,GRUBをインストールしてしまったあとで,下手にBIOSのハードディスクのブート順などを変更してしまったり,新たなHDDを追加してしまうと,エラーになってしまう恐れもあるらしい.

今回私は無知の状態で上記2つの問題を同時に経験したので,この問題の対処に半日費やす羽目になりました.

さらにstage2.0がUSBHDDに存在しているために,USBが壊れたら....ということもあるらしい.

なので今回対処方法として実践したステップ↓
1.Linuxのブートローダ(GRUB stage1)をPBR領域に配置
2.MBRに強力なフリーソフトのMBM(マルチブートマネージャ)をインストール

以上を行うことで設定を終えることができました.

設定の詳細は
このあと記述する記事を参照のこと.

【参考URL】
マルチブートするなら2段階ブートに統一しよう
wikiwiki.jp/disklessfun/




忍者ブログ [PR]
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
フリーエリア
最新CM
[06/12 ziggy]
最新TB
プロフィール
HN:
poti
性別:
非公開
バーコード
ブログ内検索
P R
FX NEWS

-外国為替-