CCCA wiki

交通大學校園電腦社群策進會

使用者工具

網站工具


側欄

側邊欄

社辦桌機ssd故障無法開機記錄

社辦桌機 ssd 故障無法開機記錄

2020-08-26 社辦的桌機 office monkey ,在更新 ubuntu 後重新開機, 無法進入 grub,出現的是 windows 的無法開機畫面。 使用隨身碟開機,發現無法讀到 ssd,得知是 ssd 故障導致無法開機。

這台在安裝時是用二顆硬碟拼起來的,一顆是 ssd 一顆是 hdd。 本來打算拿 ssd 當系統碟,但當時 ssd 裡有學長留下的 arch, 裡面有一些 docker 資料,我不想直接洗掉,於是就開 lvm, 先把 os 放在 hdd 的 pv 裡,ssd 就先放置處理。 估計未來把 ssd 清出來後,再用 pvmove hdd-pv ssd-pv , 就能把原本放在 hdd 的 pv 的系統,搬到 ssd 的 pv 裡。

但裝系統時發現無法用 grub-install /dev/sda 將 grub 裝在 hdd 上, 當時沒有深究,就直接改裝到 ssd 繞過問題。 因為 grub 不需要和開機的系統在同一顆硬碟,所以用起來也一直相安無事。 直到這次 ssd 掛了,連帶導致 ubuntu 無法開機。

現在重新 google,發現 hdd 無法裝的原因可能是硬碟開頭的空間留的太少。 可以從硬碟裡第一個分割區的開始位置看, 用 fdisk -l /dev/sdx 即可看到各分割區的開始和結束位置。

社辦的電腦第一個分割是在第 63 個磁區開始, 在這之前只有 62 個磁區,以這顆硬碟一個磁區是 512 byte, 相當於在硬碟開頭只有 31K。

~ $ sudo fdisk -l /dev/sda
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2f177ccb

所用裝置   可開機     Start      結束      磁區   Size Id 類型
/dev/sda1  *             63 629153791 629153729   300G  7 HPFS/NTFS/exFAT
/dev/sda2         629153792 641210367  12056576   5.8G 82 Linux 交換區/ Solaris
...

我手上另一台電腦,則有 2047 * 512 的大小,約 1M。

~ $ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdd3730c7

所用裝置   可開機 Start       結束       磁區  Size Id 類型
/dev/sdb1          2048 3907026943 3907024896  1.8T  7 HPFS/NTFS/exFAT
...

使用 grub-install 裝到 hdd 時出現的錯誤訊息是:

~ $ sudo grub-install --target=i386-pc /dev/sda
Installing for i386-pc platform.
grub-install: warning: your core.img is unusually large.  It won't fit in the embedding area.
grub-install:錯誤:embedding is not possible, but this is required for RAID and LVM install.

在安裝時,由於我用了 lvm, 所以 grub 似乎需要將整個 core.img 寫入硬碟開頭的磁區。 在社辦的電腦 grub 的 core.img 大小是 33K, 超過 62 個磁區的大小 31K。

~ $ ll /boot/grub/i386-pc/core.img 
-rw-r--r-- 1 root root 43479  9 月  5 23:29 /boot/grub/i386-pc/core.img

結論是保險起見第一個分割的磁區從 2048 開始比較好, 但有些比較節省的系統會是 63,我還不確定原因。 63 也是符合規範的,只是 linux 一些工具最小只能到 2048,如 fdisk。 而感覺 grub 也會儘量讓 core.img 的尺寸小一點, 應該能夠縮到 31K 以內,塞進 62 個磁區內, 但不知道為什麼 ubuntu 和 debian 的都超過。

完整 log 在 ~gholk/grub-install.log ,或與 gholk 聯絡。

後來解決方法是把 boot 放到 lvm 外面, 這樣可能就不需要把整個 core.img 塞進硬碟開頭。

parted -l /dev/sda # 檢查各分割大小

pvresize --setphysicalvolumesize $((original_size - 2000000000)) # 縮小 pv 大小

parted /dev/sda <<PART
resizepart 5 # 縮小實體分割大小
print free # 查看縮小後放出的空間
mkpart # 在縮小後空出來的位置建立新分割
quit
PART

mkfs -t ext2 /dev/sda6 # 格式化新建立的 boot 分割

lsblk --fs /dev/sda6 # 列出該分割的 uuid
# 將 boot 掛載選項加入 fstab
echo UUID=$uuid /boot ext2 errors=remount-ro 0 >> /etc/fstab

# 將原本的 boot 內容放到新分割
mv /boot /boot.bak
mkdir /boot
mount /boot
cp /boot.bak/* /boot

# 依修改過的 boot 分割更新 grub config 與安裝到硬碟,
# grub-install 會辨識出有 boot 分割可以用,就不會有 core.img 放不下的問題了。
update-grub
grub-install --target=i386-pc /dev/sda
社辦桌機ssd故障無法開機記錄.txt · 上一次變更: 2020/09/11 13:19 由 gold holk