2007年7月14日 星期六

可切換成唯讀模式的作業系統--Windows XP 及 Ubuntu 7.04

為了在筆電上使用 CF 轉 IDE 作為主要儲存作業系統的媒體,又考慮到 CF 卡的寫入次數問題,上網查詢相關資訊,研究出下列方式可達成唯讀的作業系統(以記憶體取代硬碟的寫入)。

底下針對兩種常用的系統提出設計方法:

(有關自行設計與修改的檔案,請到 Mobile 01下載附件檔案即可)

一、Windows XP

使用 微軟公司的產品 Embedded XP 內的驅動程式 Enhanced Write Filter 來達成唯讀的功能

所需檔案:
(請下載微軟公司的 Windows Embedded Studio 產品,安裝後建立一虛擬機,內含相關檔案)
ewf.sys
ewfdll.dll
ewfinit.dll
ewfntldr
ewfmgr.exe
----------------
(自行設計的檔案)
ewfsetup.bat
ewfram.bat
ewframp1.reg
ewframp2.reg
ewframp3.reg
ewfoff.bat
ewfon.bat

安裝方法:

1.依標準方法安裝 Windows XP 並安裝相關驅動程式及所需軟體

2.最佳化:儘量減少寫入硬碟的設定,如:取消自動更新、自動記錄、停用分頁檔、使用Ramdisk來當 Temp 等,(特別注意:要取消系統還原功能)

3.開機設定:請依下圖設定 (系統內容/進階/啟動及修復)




















4.將上述檔案全置於 C:\EWFSET 資料夾中,進入命令提示字元後,cd \EWFSET

5.執行 ewfsetup.bat (此時會將所需檔案複製到 Windows 系統的相關資料夾)
-------------------------------------------------
ewfsetup.bat
-------------------------------------------------
@echo off
if exist c:\ntldr.bak goto backupok
attrib -h -s -r c:\ntldr
ren c:\ntldr ntldr.bak
attrib +h +s +r c:\ntldr.bak
:backupok
if exist c:\ntldr attrib -h -s -r c:\ntldr
copy ewfntldr c:\ntldr /y >nul
attrib +h +s +r c:\ntldr
copy ewf.sys c:\windows\system32\drivers /y >nul
copy ewfdll.dll c:\windows\system32 /y >nul
copy ewfinit.dll c:\windows\system32 /y >nul
copy ewfmgr.exe c:\windows\system32 /y >nul
copy ewfon.bat c:\windows\system32 /y >nul
copy ewfoff.bat c:\windows\system32 /y >nul
copy ewfram.bat c:\windows\system32 /y >nul
copy ewframp?.reg c:\windows\system32 /y >nul
echo.
echo EWF files setup ok...
echo.
echo Please RUN ewfram.bat later to activate EWFRAM mode...
echo.


6.執行 ewfram.bat (特別注意:要知道自己 Windows XP 系統的分割區是哪一個)
ewfram.bat 1 (分割區1)
ewfram.bat 2 (分割區2)
ewfram.bat 3 (分割區3)

-------------------------------------------------
ewfram.bat
-------------------------------------------------
@echo off
if "%1"=="" goto ewfhelp
goto ewfgo
:ewfhelp
echo.
echo EWFRAM.BAT partition_number (1,2,3)
echo.
goto end
:setupfirst
echo.
echo Please RUN ewfsetup.bat first...
echo.
goto end
:ewfgo
if not exist c:\windows\system32\drivers\ewf.sys goto setupfirst
reg import c:\windows\system32\ewframp%1.reg
echo.
echo EWFRAM mode will be active after rebooting system...
echo.
echo You can use EWFON.BAT (or EWFOFF.BAT) to enable(disable) EWF.
echo.
:end

---------------------------------------------------------------
ewframp1.reg (請依紅字修改成 ewframp2.reg, ewframp3.reg)
---------------------------------------------------------------
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction]
"Enable"="N"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\OptimalLayout]
"EnableAutoLayout"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"NtfsDisableLastAccessUpdate"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters]
"EnablePrefetcher"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
"BootExecute"=""

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ewf]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Type"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{71A27CDD-812A-11D0-BEC7-08002BE2092F}]
"UpperFilters"="Ewf"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ewf\Parameters]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ewf\Parameters\Protected]

; the following values are for EWF-RAM reg mode
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ewf\Parameters\Protected\Volume0]
"Type"=dword:00000001
"ArcName"="multi(0)disk(0)rdisk(0)partition(1)"


7.重新開機後,即進入唯讀模式

8.要切換模式可在開機後馬上執行 ewfoff.bat 及 ewfon.bat (執行完後會自動重新開機)
----------------------------------------------------
ewfoff.bat (2007.07.31 修改)
----------------------------------------------------
ewfmgr c: -commitanddisable
shutdown -r -t 0

----------------------------------------------------
ewfon.bat
----------------------------------------------------
ewfmgr c: -enable
shutdown -r -t 0


二、Ubuntu 7.04

使用 unionfs 及 aufs 的觀念來達成唯讀的功能。
(特別感謝 penk 所製作的 PUD live cd,參考其中的作法才能完成)

所需檔案:(2008.01.30 修改下載位址 Ubuntu 7.04 feisty) (Ubuntu 7.10 gusty)
(請下載 ftp://mirror.nttu.edu.tw/penk/patch/binary/feisty/aufs.ko)
aufs.ko
----------------
(自行修改的檔案)
modules
local
init
12fstab
13swap


安裝方法:

1.由 Ubuntu CD 安裝系統及其它軟體 (核心請更新至 2.6.20-16)

2.進入終端機模式,複製 initrd.img-2.6.20-16-generic 到家目錄
cp /boot/initrd.img-2.6.20-16-generic .

3.解開此檔(使用壓縮管理員兩次)到 initrd.img-aufs 資料夾

4.底下均以 initrd.img-aufs 為工作目錄 (cd initrd.img-aufs)

5.編輯 conf/modules (插入第一列空白列後,輸入 aufs)

6.新增 lib/modules/2.6.20-16-generic/kernel/fs/aufs 資料夾,並複製 aufs.ko 置於此資料夾

7.編輯 scripts/local (方法如下)
移到檔案後方,約在
第 74 列 # Mount root
第 75 列 mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
將 75 列 加上 # 註解
在第 76 列插入下列指令碼:

if [ ${aufsmb} = no ]; then
mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
else
modprobe aufs
mkdir -p /rofs
mkdir -p /aufs
mount -t tmpfs -o size=${aufsmb}m /dev/shm /aufs
mount -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} -o ro /rofs
mount -t aufs -o dirs=/aufs=rw:/rofs=ro unionfs ${rootmnt}
fi


8.編輯 init (方法如下)
移到約第 37~44 列 (此處均為 export ??? 型式)
移到最末的 export 後插入一列 export aufsmb=no
移到約第 117 列找到 break=*)
在此列前插入三列,分別輸入
aufs=*)
aufsmb=${x#aufs=}
;;


9.新增兩個文字檔於 scripts/init-bottom/ 資料夾 (名稱為 12fstab 及 13swap)
(特別注意:此兩個檔案必須改變屬性為可執行,chmod +x 12fstab)
------------------------------------------------------
12fstab:
------------------------------------------------------
#!/bin/sh

if [ ${aufsmb} != no ]; then
cat > /root/etc/myfstab1 << EOF
unionfs / unionfs rw 0 0
tmpfs /tmp tmpfs nosuid,nodev 0 0
EOF
cat /root/etc/fstab | grep '/ ' -v > /root/etc/myfstab2
cat /root/etc/myfstab1 /root/etc/myfstab2 > /root/etc/fstab

rm -f /root/etc/myfstab1
rm -f /root/etc/myfstab2

rm -f /root/etc/rcS.d/S*checkroot.sh
fi

------------------------------------------------------
13swap: (2007.07.31 修改)
------------------------------------------------------
#!/bin/sh

cat /root/etc/fstab | grep 'swap'
if [ $?==1] && [ ${aufsmb} != no ]; then
devices=""
for device in /dev/[hs]d[a-z][0-9]*; do
if ! [ -b "$device" ]; then
continue
fi

magic=$(/bin/dd if="$device" bs=4086 skip=1 count=1 2>/dev/null | /bin/dd bs=10 count=1 2>/dev/null) || continue

if [ "$magic" = "SWAPSPACE2" -o "$magic" = "SWAP-SPACE" ]; then
devices="$devices $device"
fi
done

for device in $devices; do
cat >> /root/etc/fstab << EOF
$device swap swap defaults 0 0
EOF
done
fi

10.製成開機檔 initrd.img-2.6.20-16-aufs
find | cpio -H newc -o | gzip -9 > ../initrd.img-2.6.20-16-aufs

11.複製 initrd.img-2.6.20-16-aufs 到 /boot/ 資料夾
cd ..
sudo cp initrd.img-2.6.20-16-aufs /boot

12.編輯 /boot/grub/menu.lst (複製原有選項,並修改如下)
Title Ubuntu (readonly)
root (hd....)
kernel /boot/vmlinuz-2.6.20-16-generic ....(同原選項) aufs=32
initrd /boot/initrd.img-2.6.20-16-aufs
quiet

註:修改處 Title 及 aufs=32 及 initrd.img-2.6.20-16-aufs
其中 aufs=32 表示使用 32MB RAM 來當做寫入用的緩衝記憶體 (適用於實際記憶體 256MB RAM,可視自己電腦配備調整數字)

13.重新開機後進入 grub 選單時,選擇 Ubuntu, kernel 2.6.20-16-generic (可寫入模式)
或選擇 Ubuntu (readonly) 則進入唯讀模式

8 則留言:

不滾不落格 提到...

小宇平安,
小弟對唯讀的 xp 有興趣, 只是不材,
無法取得 ewf 完整資料, 不知兄
可否將所需之檔案不吝賜予, 壓縮寄至
hhlin@mail.cyut.edu.tw
感激不盡.
hhlin

匿名 提到...

http://www.badongo.com/file/4404832

匿名 提到...

謝謝,我可以用來安裝在 EeePC 上了。

匿名 提到...

你好,
按照這篇教學完工後,有問題想請教,就是執行ewfon.bat 會出現訊息將啟動還原功能,這篇文章真的是將xp 改成"唯讀"嗎? ewfon ewfoff 來來回試了幾次,感覺上真的是像用來還原的。
另外還有一個問題,我的電腦有切了1GB 的ram 做ramdisk(分頁檔關了,temp 設定到ramdisk ,ie 的暫存也設定到 ramdisk ), 在ewfon 的狀態下,copy 大檔(200mb 以上)到桌面,電腦就怪怪的(400MB以上沒法COPY 到桌面),有點變慢,要叫出工作管理員,會出現錯誤,叫不出來,也無法正常關機,最後出現藍底白字,訊息好像是 hardware unknow,按電源重開機,又"還原"好了。會這樣是因為我的記憶體被吃光了嗎?
抱歉這麼多問題,最主要我也是想用CF(8GB) 做系統碟,裝到舊NB上(256MB的RAM) 。

匿名 提到...

採用 ewf 方式來達到【唯讀】,其實只是將會寫入 C:\ 的資料轉成寫到 RAM。
所以若 copy 大檔到桌面,即表示實際上會 copy 到 ewf 所使用的 RAM 上。

如果實體記憶體不夠,那就會出狀況。

一般建議若有 2GB RAM ,可以切 512MB ramdisk ,保留 1.5G 給 ewf 使用

若只有 256MB RAM,則不建議用 ramdisk,將全部記憶體留給 ewf 使用較好。

此外 ewfoff 後,可以更新軟體,再利用 ewfon 來改成唯讀模式。

我自己使用的情況是 8GB CF-IDE
partition 1: 60MB --> GeeXbox
partition 2: 3.5GB -> Windows XP
partition 3: 3.5GB -> Ubuntu 7.04
partition 4: 600MB -> Data (D:\)

RAM:768MB 使用 128MB 當ramdisk

匿名 提到...

請問 上述 "如果實體記憶體不夠,那就會出狀況" 是什麼意思? 是不是指如果Copy 一個檔案大於實體記憶體就會出錯?
此外,切多大的記憶體給 ewf 使用,需要考慮作業系統的使用量再額外分割出來嗎?例如,我有1GB RAM實體,需要考慮留一些給作業系統使用,還是說1GB RAM都給ewf,使用上也是正常的。

匿名 提到...

是的,若 copy 超過實體記憶體的檔案到 保護硬碟(C:) 就可能發生問題 (出現無法複製的警告)

其實 EWF 會自動使用作業系統的記憶體,也就是說除了自行切割的 RamDisk 外,其它記憶體均會由 EWF 管理使用,我們不需要再煩惱。

目前我已安裝了三台電腦使用此模式,一台 notebook (768MB RAM, 8G CF),兩台桌機(512MB RAM, 2G CF 及 256MB RAM, 1G CF),每次用來上上網,看漫畫、影片,聽音樂,用 Office 都蠻好用的,只是沒用過 PhotoImpact 等影像處理軟體。

匿名 提到...

你好!我現在也是用CF-IDE當NB的硬碟!可是我有安裝Returnil Virtual System來保護作業系統!請問也可以使用這個方式使XP成為唯讀嗎?問個笨問題,使否使用唯讀XP就可以不怕病毒跟木馬?因為理論上應該重開後就回復原來系統?感謝^^