2020年4月27日 星期一

使用 Linux 備份/還原 Windows OS

在以前,是用 Ghost 來複製系統,但使用 Linux 亦可備份/還原 Windows OS。對於 Linux 系統當然也是沒問題,可以用此方法。

參考 How can I clone/backup/restore Windows 10 from Linux?

分割區回復後,出現無法開機的處理
0xc0000225 Error Code on Windows 10 [Fixed]

在經過多次失敗後,最後終於成功。上面的解決辦法只適用於 MSDOS(MBR) 的磁碟分割表(partition table),使用 GPT  磁碟分割表,在執行 "bootrec /fixboot" 會出現 "存取被拒" 的錯誤訊息,解決辦法參考下面連結
windows10 Bootrec /Fixboot 存取被拒(Access Is Denied)

原始文章

I have just successfully finished the described scenario of backing up Windows 10 from Linux to a file and restoring them on a new drive.
With the old disk zero free space from Windows by doing
zdelete -z c:
using SDelete. 針對 Linux 的 ext2、ext3、ext4,則可用 zerofree 指令。

先把不要的檔刪一刪,再垃圾桶清乾淨。然後把刪除的磁區清成 '00',可以壓縮減小備份檔。
使用 lz4 壓縮,壓縮率較低,但速度快很多。

壓縮率 / 執行時間 的比較
gzip: 26.8% / 8.1s bzip2: 20.2% / 58.3s lz4: 35.6% / 1.3s

Get some live Linux USB to boot and backup MBR and partition table to a spare drive
dd if=/dev/sda of=/somewhere/mbr bs=512 count=63 
copy the boot partition to a file
dd if=/dev/sda1 bs=1M status=progress | lz4 > /somewhere/sda1.lz4
copy the system partition to a file
dd if=/dev/sda2 bs=1M status=progress | lz4 > /somewhere/sda2.lz4


備份分割區
dd if=/dev/sda of=GPT_TABLE bs=1 count=A

還原分割區
dd if=GPT_TABLE of=/dev/sdb bs=1 count=A
partprobe /dev/sdb

其中 A 的計算如下:
A=(128*B)+1024

B 為分割區的數目
B=parted -ms /dev/sda print |tail -1|cut -b1

例如有 4 個分割區, 則 count (A) 的值為 1536

還原

 測試檔案的大小是否正確
# lz4 -v sda1.lz4 > /dev/null
*** LZ4 command line interface 64-bits v1.9.2, by Yann Collet ***
Warning : using stdout as default output. Do not rely on this behavior: use explicit `-c` instead ! 
sda1.lz4             : decoded 104857600 bytes  

Place the new disk into the computer, boot the live Linux again and restore the beginning of the disk
dd of=/dev/sda if=/somewhere/file.mbr
That gets you the same primary partition layout (partitions inside extended partition are stored somewhere else and will not be restored by doing this).
Now restore the two Windows partitions
dd of=/dev/sda1 bs=1M status=progress < lz4cat /somewhere/sda1.lz4
dd of=/dev/sda2 bs=1M status=progress < lz4cat /somewhere/sda2.lz4  
上述指令會出現 "-bash: 1z4cat: No such file or directory" 的錯誤,我不瞭解問題所在。Google 找到另外的指令下法,就可以了
lz4 -dc sda1.lz4 | dd of=/dev/sda1 bs=1M
lz4 -dc sda2.lz4 | dd of=/dev/sda2 bs=1M status=progress  
The drive didn't boot at this stage (grub complaining). So boot windows rescue disk or the installation media and select "repair". In Troubleshooting start cmd prompt and run
bootrec /fixmbr
At this stage I got the original Windows system to boot on the new bigger drive. I got 50% compression rate with both gzip and lz4 (with 70% full drive) but gzip was limited by the CPU speed (27MB/s in my case) while lz4 was not (480MB/s CPU limit, 180MB/s my backup drive limit).
My first try was with ntfsclone but that didn't produce bootable Windows (it was complaining of some missing files in \Windows\System32). I am not sure why it didn't work. At the end the dd + lz4 solution created smaller image than ntfsclone by itself. Your mileage may vary based on how full the disk is modulo bugs in ntfsclone - dd seems much easier to get right :-)

測試 Windows 7 的備份/還原

使用 Vmware Workstation 的 VM 測試,Linux 則是用 Ubuntu

磁碟 60GB,分割區如下
sda1 : 100MB
sda2: 59.9GB,使用 16.3GB

備份的檔案大小
# ls -lh
total 7.7G
-rw-r--r-- 1 root root  32K Apr 28 01:34 mbr
-rw-r--r-- 1 root root  14M Apr 28 01:34 sda1.lz4
-rw-r--r-- 1 root root 7.7G Apr 28 01:41 sda2.lz4

備份 sda2 的花費時間
real 5m18.318s
user 1m4.509s
sys 3m17.199s

還原測試
# time lz4 -d sda2.lz4 | dd of=/dev/sda2 bs=1M status=progress
Warning : using stdout as default output. Do not rely on this behavior: use explicit `-c` instead ! 
64157974528 bytes (64 GB, 60 GiB) copied, 228 s, 281 MB/s
14086+444198 records in
14086+444198 records out
64317554688 bytes (64 GB, 60 GiB) copied, 229.768 s, 280 MB/s

花費時間 real 3m49.786s
user 1m5.480s
sys 3m11.717s

還原之後,即可正常開機。

在 ASUS VivoBook 14 備份/還原 Windows 10

這台筆電的分割區如下
                          Disk: /dev/nvme0n1
         Size: 476.96 GiB, 512110190592 bytes, 1000215216 sectors
       Label: gpt, identifier: 709EF8B9-4D28-4BF4-8326-A960661C0460

Device        Start    End   Sectors  Size Type
  /dev/nvme0n1p1  2048 534527 532480  260M EFI System          
/dev/nvme0n1p2 534528 567295 32768   16M Microsoft reserved
/dev/nvme0n1p3 567296  998881934 998314639 476G Microsoft basic data
/dev/nvme0n1p4 998883328 1000214527 1331200  650M Windows recovery environ

用 dd 指令還原 gpt 分割區失敗,只好用 cfdisk 手動建立,讓 start/end 的數字儘量一樣,不然失敗時,會不曉得是否為分割區不對所造成。其中 /dev/nvme0n1p3 的容量設到 476.0334G,勉強一致。

建立分割區後,使用 dd 指令還原各分割區的資料,其中476GB的分割區,要花費超過2個半小時,這比重新安裝的時間還久。但 dd 指令,就是要把每一個 byte 資料都寫回去才行啊,只好等囉。

資料還原後,必須重建 BCD (即 Boot Configuration Data),才能重新開機。這個有點順利,試了好幾次,差點放棄,還好最後成功開機了。

這台筆電 BIOS 中的 [SATA Mode] 有兩種,
[AHCI] 及 [Intel RST Premium With Intel Optane System Acceleration] (以下簡稱 RST)

原來裝 Win 10 時,是設成 RST。但必須改成 AHCI,Linux 的 LiveDVD 才能看到 SSD。

還原後,我先用 Windows10 -1803 版本的 ISO,SATA 在 RST 模式下,也是看不到 SSD。切換成 AHCI,可以看到,但重建 BCD 時,在 "bootrec /fixboot" 指令時,出現 "存取被拒",還原失敗,然後放棄。

中間有用安裝 ISO 從頭裝起,但裝著裝著就厭煩起來,實在 越來越不喜歡 Windows 的囉唆,而且資訊不明,根本不知它在做什麼。

後來在學校下載新的 Windows10 - 1909 版本的 ISO,又再試一次。這次在 RST 模式下,可以看到 SSD 了,果然新版的才有 driver。 但重建 BCD 在 "bootrec /fixboot" 指令仍然出錯。就用這指令當關鍵字,果然搜尋到一堆結果。挑了一篇來看,照著做,YA,成功,可以重開了。


步驟大致如下
----------------------
用安裝 ISO 開機後,選擇 [Troubleshoot]。
然後在 menu 中選 [Command Prompt],在命令視窗中
執行下述 command:
Diskpart ==> 進入程式,執行下述 command:
    List disk       
    Sel disk 0       (選擇安裝 Win 10 的磁碟,在此選 0)
    List vol         (選擇開機磁區,通常為 FAT32,且沒有磁碟編號)
    Sel vol 4
    assign letter=V: (指定開機磁區為 V: 磁碟)
    Exit

在命令視窗中,繼續執行

 bcdboot C:\windows /s V: /f UEFI
-----------------------

完成,重新開機









2020年4月1日 星期三

小紅點 (Trackpoint) 延伸桿

在機械鍵盤加裝 trackpoint (亦稱指點桿或小紅點) (Mechanical keyboard with Trackpoint),要如何延伸小紅點的長度,是關鍵的一個步驟。最初是買 TEX Yoda 套件的零件來用,但沒單賣延伸桿,要買整套,價格不便宜,而且它的小紅點模組,做得不太好,整個桿子一搬就掉下來了。直到找到了防鬆脫螺帽,才有了比較好的解決方案。

首先,要在鍵盤的固定板,GHB鍵之間,鑽一個孔。孔徑 3mm,孔的中心對準GH鍵的下緣是較佳的位置。若偏下,B鍵要削掉比較多。若偏上,B鍵可能完全不用削,可是比較不對稱。

延伸桿是用 3mm的平頭螺絲,切成適當的長度,用AB膠黏到原來的帽座上。在鍵盤固定板上鑽的孔,直徑也是 3mm,不想把孔擴大,就把延伸縲絲的中間的螺紋磨掉,螺絲的中間段就變細了。

小紅帽的固定座,是用AB膠翻模,然後黏在防鬆脫螺帽上。再將帽座鎖在延伸螺絲上。因為它是防鬆脫的,稍微鎖緊,即可方便的使用。因為控制桿長度延伸了好幾倍,手指推起來省力多了,變得更好使用。

螺絲裁切後的總長度 16mm。

把螺絲中段的螺紋磨掉,減少螺絲的直徑,儘量減小鍵盤上挖的孔,儘量不要影響到原有電路。


螺絲突出鍵盤固定板 7mm,螺絲鎖上固定座後,帽座下緣離固定板 9mm。
螺帽黏上帽座,總長 7mm,裝上小紅帽後總長 11mm。
螺絲裝上帽座和小紅帽後,固定板以上,總高 15mm。小紅帽高度 6mm。



3D 列印

小紅帽的固定座,最先是用軟性油土翻模,如上面的照片,效果不好,會歪掉,勉強勘用。後來找到熱塑土,也叫水晶土,稍好一點,仍不盡理想。最後還是走上 3D列印之路。

最先是趁雙11打折,買了一台 XYZprinting 的 da Vinci mini w+,FDM 機器。研究如何建模,就開始試著畫力量感測器 (force sensor) 的固定座。實在是太小了,FDM 的機器無法精確的列印這麼小的零件。後來還是買光固化列表機 Phrozen Sonic Mini。

兩種列印機的成品比較,綠色是 FDM,灰色是光固化,紅色是原來的。FDM 的細節完全印不出來,也無法裝在力量感測器上。


下圖是用光固化印出的成品,使用 Onyx Rigid Pro410 樹脂。此樹脂印出的成品還蠻堅固的,試著用3D 印出整支延伸桿。但硬的材質就比較脆,而且磨一磨,如重複裝上和拆下,就會粉化,變得起初能穩定的固定,後來就會變得有點鬆,而且也不確定能用多久。後來改成只印上下端的固定座,中間仍用M3螺絲連接。使用網路購買的便宜油性瞬間膠,黏接面夠大,黏得還算牢,要拆下時,泡了熱水還要破壞樹脂的固定座,才能完全拆下。另外光固化列印可以印出細微的細節,就可以印出用來供黏結時定位的凸起和凹座,不用肉眼對正,最後老是歪一邊。



2020年3月25日 星期三

Ducky 87 鍵盤改 Teensy 2.0 控制器

動機

幾個月中,改了3把鍵盤加裝 TrackPoint 模組,有一些心得。第一把的 Ducky 87 鍵盤是向網友買的,不知怎的,使用一個 USB HUB 連接鍵盤和 TrackPoint 模組,滑鼠的移動就會不順。測了好久,確定無法使用 HUB 來合併兩者的訊號。不得已只好再鑽一個洞,另外接出 TrackPoint 模組的信號。

在計劃改鍵盤時,因為看到網路有人用 Teensy 2.0 來連接 TrackPoint 模組,所以同時也買了 Teensy 2.0 板子。但後來使用 PS/2 to USB converter 可以順利連接,而且便宜很多,體積又很小,Teensy 2.0 就擱在一邊。改了3把鍵盤之後,平常工作有鍵盤可以使用,就回過頭來把那支無法內藏 HUB 的 Ducky 87 鍵盤的控制器改成 Teensy 2.0。


參考網頁

 kira3628800 的介紹文章: 使用QMK來搞一把鍵盤吧!、QMK加上小紅點吧!
QMK 的說明: QMK Firmware,Keyboards with AVR Processors
要連接 TrackPoint 模組,需要再參考: PS/2 Mouse Support,PS/2 Mouse - QMK

MCU 控制板的選擇,可參考
Pro Micro vs. Teensy 2.0 review

實作參考
Connecting thinkpad trackpoint mouse+buttons to teensy 2

鍵盤矩陣

首先把原來的控制 IC 整個拆掉,因為解焊太麻煩,也沒這技術,就直接用鋸子破壞掉。參見下面的相片,左邊 DIP 開關上方的 IC 整個被挖掉。

因為只有 87 鍵,電路稍做修改,可以少用一支 pin,不然 Teensy 2.0 的接腳不夠用。配合 qmk 程式的設定,接腳編號由 0 開始。


鍵盤矩陣總共需要的控制信號數為 8+12=20,另外想用1個信號控制 Caps Lock 以及 2個信號連接 Trackpoint 的 dat 和 clk,所以總共要 23個控制接腳。所以必須使用有 25個IO的 Teensy 2.0,無法使用 Arduino Pro Micro,Pro Micro 標準是 18 個 IO,就算可以把 RX/TX 改成 IO,也只有 20pin。雖然 Pro Micro 便宜多了,有更多人在賣,但也只好放棄。

在下面這個連結有一些相關的討論串,看來只能選擇較貴的 Teensy 2.0。

Arduino vs Teensy? - Geekhack
Most open firmware is written for the Teensy (2.0 mainly), but the Arduino / Pro Micro (cheap clone - quality may vary) has exactly the same chip (ATMega32u4 - worth checking on Arduino/Pro Micro boards). Its pretty easy to make a keyboard with the Arduino software, as its one of the examples.

關於連接 Trackpoint 的說明需參見 PS/2 Mouse - QMK,最好是使用 USART mode。

另外,Caps Lock LED 的控制: LED Control

Teensy 2.0 開發板的接腳。


Teensy 與 Trackpoint module 之間的接線。使用 USART mode
CLK: PD5 (XCK1)
DAT: PD2 (下圖的 PD4,經測試之後,好像是不能正常工作的。)另外,因為使用相同的工作電壓,不一定需要 4.7K 的 pull high 電阻即可運作。

PIN I/O 對應

鍵盤矩陣的 PIN 對應
ROW
PIN

ROW
PIN

COL
PIN

COL
PIN

COL
PIN
0
B0

4
D1

0
E6

4
F5

8
B5
1
B1

5
D3

1
F0

5
F6

9
B4
2
B2

6
C6

2
F1

6
F7

10
D7
3
B3

7
C7

3
F4

7
B6

11
D4

其他的 PIN 對應
PIN
說明
D6
Caps Lock,Teensy 2.0 開發板的 LED 指示燈
D5
TrackPoint 控制模組 PS2 界面的 CLK
D2
TrackPoint 控制模組 PS2 界面的 DAT

總共使用 23 個 PIN IO

直接把 Teensy 2.0 的板子用雙面膠黏在鍵盤的 PCB 上,旁邊黑色膠帶包著的是接 Trackpoint 模組的電容電阻。


電路板黏貼的位置和線路整理,要配合原來鍵盤的空間,才能將鍵盤密合的組裝。

上網找了一個適用的手托,嵌入滑鼠的按鍵,看起來稍有整體感。

Firmware 編譯環境

docker-compose.yml
# Teensy development environment
qmk_dev:
  build: .
  working_dir: /work
  volumes:
    - "./work:/work"
    - "./work:/home/ajax"
  stdin_open: true
  tty: true
  user: 1000:1000
  entrypoint: /bin/bash

Dockerfile

# ref: https://docs.qmk.fm/#/newbs_getting_started
FROM ubuntu:18.04
#FROM ubuntu:16.04

RUN apt-get -y update

RUN apt-get -y install build-essential gcc-avr binutils-avr avr-libc && \
    apt-get -y install git python3 python3-pip

RUN python3 -m pip install --upgrade pip && \
    python3 -m pip install qmk

# RUN yes | qmk setup

RUN groupadd ajax -g 1000 && \
    useradd -g 1000 -u 1000 ajax

CMD ["/bin/bash"]

docker run shell

echo "set prompt command: "
echo "export PS1='\[\033]0;\u@\h:\w\007\]\[\033[01;31m\]qmk_dev@docker\[\033[01;34m\] \w \$\[\033[00m\] '"

docker-compose -f docker-compose.yml run --rm qmk_dev


編譯
qmk config user.keyboard=Teensy_tst
qmk config user.keymap=default qmk compile

編譯好,再在 windows 下用 loader 將產生的 firmware 下載到開發板上。

2020年3月19日 星期四

ikbc Table E401 鍵盤 + 小紅點 (Trackpoint) 指標 -- 完成

機械鍵盤的手感遠勝於 Thinkpad 的薄膜鍵盤,而 trackpoint 卻是寫程式的利器,若能在機械鍵盤上加裝 trackpoint (Mechanical keyboard with Trackpoint) 就能結合這兩者的優點,這一直是我的夢想啊。這次是要把小紅點 (Trackpoint) 指標控制器加裝到 ikbc Table E401 鍵盤,因為它附有手一體式托,頗類似外接的 Thinkpad 鍵盤。

好不容易完成了,把小紅點 (Trackpoint) 指標控制器加裝到 ikbc Table E401 鍵盤。搭配這個鍵盤的一體式手托,改裝後,從正面看完整度比較高。不過它的加大按壓面積鍵帽,在剛開始使用時,常常會按到旁邊的鍵。適應一兩天後,也就習慣了。不過,用久了還是覺得它有塑膠外殼的噪音,頗為擾人,最後還是回去用 Ducky 的機械鍵盤。

關於 iKbc 鍵盤使用時的噪音,原本以為是在裡面塞入線路,造成組裝不密實而產生噪音。但拿另一個未改裝的鍵盤來比較,發現只要把鍵盤拿起來,晃一晃,整個外殼就會略微變型,產生噪音。相較而言,Ducky 的外殼比較堅實,不會有異音。iKbc 則只要壓一下,就會有擾人的異音。


但是看背面,就挖了一個大洞,露出小紅點的固定板,而且有點突出,必需將前面或後面墊高一點,固定板才不會碰到桌面。因為手托有點向下傾鈄,若墊高後面,例如將腳架扳起一段,在使用上,手腕會不舒服。在前面的下面用2支30公分直尺墊高一點,用起來就比較舒服點,高度大約 4mm。

正面看,GHB三個鍵要切掉一些,可以讓小紅點有移動的空間。在空白鍵下,切出可讓指標按鍵露出來的方孔。為了儘量完美,這個裝指標按鍵的孔,花了一整個下午才完成。


GHB鍵之間的孔。

用軟性油土翻的模,有點歪,堪用而已。材料是比較稀,長時間凝固的AB膠。下面是模型用的防鬆脫螺帽,可以固定在延長指標的螺絲上,不會鬆脫,也不會晃。


這個鍵盤是使用 type C 的 USB 接頭,SMD 的接頭,無法自己焊接。確定它是 USB 2.0 的界面,只用到 4條線,就把它改成 micro USB 的座,自己另外挖孔和固定。這個鍵盤可能是要出藍牙版本,留有很大的空間,用來放電池,因此在裡面塞一個 USB 2.0 的 HUB 和 PS2 轉 USB 的小電路板,空間非常夠。

改裝的過程,等以後有空再慢慢補齊了。

2020年3月4日 星期三

網誌存檔