1. 程式人生 > >Win 10 UEFI + Ubuntu 18.04 UEFI 雙系統 (by quqi99)

Win 10 UEFI + Ubuntu 18.04 UEFI 雙系統 (by quqi99)

問題

本人昨天買了一塊SSD, 結果後來發現原來這塊SSD存在硬體質量問題, 造成了軟體上的種種詭異問題, 如U盤時而識別時而不識別, 如觸控式螢幕左鍵時而抽風, 如ghost安裝win10時幾乎到100%的進度時忽然來一個無響應, 重啟系統後出現了”To interrupt normal start up, press the blue ThinkVantage button.”, 此時鍵盤無反應, 既進不了系統, 也進不了BIOS. 撥CMOS電源也無效. 最後發現是這塊SSD有質量問題. 估計是SSD有控制器主要是軟體吧, 控制器軟體有bug導致執行ghost這種軟體時也能導致硬體掛住.
也正是因為這個問題吧, 七搞八搞, 一不小心在重試的過程中將之前的一塊linux分割槽誤刪了, 於是之前打算的遷移雙系統的想法泡湯(當然, 那些通過分割槽助手或者ghost來遷移分割槽的網上文章照著做沒一個是成功的).
這樣, 有機會事隔多年再一次重灌雙系統的機會, 但是發現世道變了, 之前百試不爽的方法現在行不通了. 後經查證, 主要原因是ubuntu 18.04開始預設採用UEFI, 而win10預設仍然是MBR. 這樣會導致一系列的問題, 如報錯: grub-efi-amd64-signed failed to install 18.04, 統一採用UEFI安裝.

BIOS設定

在BIOS中將Boot Mode設定為UEFI Only, 如果有Secure Boot選項還要disable它(不做這一步可能會造成按F12鍵之後無法找到U盤)
注: 改成UEFI only之後, 執行雙系統, 四系統都沒問題, 但後來進不了U盤的livecd, 報: couldn’t get UEFI db list, 所以只得改回Both, 但UEFI優先.

安裝win10

  • 下載大白菜UEFI專版 - http://www.bigbaicai.com/download.html?down2
  • 下載win10 ghost - axel -n 10 http://xz.win10cjb.com/18.5/win10_64/DEEP_Win10x64_201805.rar
  • 製作大白菜啟動U盤, 如果介面上有UEFI字眼就點上(不記得了, 有就點上), 還要注意一點, 記得點裡面的格式轉換, 將FAT32格式(HDD-FAT32)轉換成NTFS(HDD-NTFS)轉換, 否則HDD-FAT32格式不能拷貝大於4G的ghost檔案哦,
  • 按F12選U盤啟動進入大白菜後, 用DiskGenius工具重新分割槽, 必須將BIOS+MBR格式轉UEFI+GPT格式. 分割槽表格式為GUID而不是MBR, window上管EFI分割槽叫ESP/MSR分割槽
  • 注意, 不要修改推薦的卷標, 這個卷就是指向的ESP/MSR分割槽.

安裝win10後

安裝win10後需要將禁用掉快速啟動, 否則會造成按F12無法選擇U盤啟動. 選單路徑為: “設定 -> 系統 -> 電源與睡眠 -> 其他電源設定 -> 選擇電源按鈕的功能 -> 更改當前不可用的設定 -> 啟動快速啟動”

安裝ubuntu 18.04

像安裝win10一樣, 一樣要注意重要一點, 需建立大概300M左右的UEF分割槽, 另外, 還可以建立一個根分割槽和一個備份檔案用的bak分割槽.
注意, windows非常霸道, 它是總修改bios裡的啟動順序, 將它的”Windows boot Manager”放在”ubuntu grub”的前面, 可以在bios裡鎖定啟動順序

安裝win7

win7若沒有sata的驅動, 所以得先改回IDE, 裝完win7之後再改回AHCI, 否則也容易掛在啟動介面不動了.
注: 我未遇到以上問題, 可能因為我裝的win7並不是原版的, 已經帶了sata驅動

加裝SSD

如果加裝了SSD之後呢? 那得注意:

  • 裝win10時同樣需要進大白菜或老毛桃後用DiskGenius在SSD上劃分ESP/MSR分割槽
  • 裝ubuntu時, 分割槽處也要建立EFI分割槽, 同時grub設定安裝在SSD上, 相當於: grub-install /dev/sdX.
  • bios裡選擇哪塊硬碟啟動. 其實在SSD上安裝grub後, 這個grub會連HDD上原先的win10與ubuntu一起放在啟動列表裡. 注意, windows非常霸道, 它是總修改bios裡的啟動順序, 將它的”Windows boot Manager”放在”ubuntu grub”的前面, 可以在bios裡鎖定啟動順序
  • 有時候需要對ssd優化, 例如不要將swap分割槽放在ssd以延長壽命, 如更改i/o排程策略為noop, 如使用bcache

問題

裝完之後進入win10發現thinkpad小紅點左鍵失靈, 再切換進ubuntu發現小紅點左鍵正常(實際上, 5次大概有一次有問題, 只是登入介面左鍵與右鍵似乎混亂了, 登入之後就正常了. 再換PE進系統發現小紅點左鍵依然有問題. 所以基本斷定和硬體沒有關係, 應該是win10上的小紅點驅動有問題.
但搜尋了很多帖子, 沒一個能解決問題的, 聯想的小紅點win10驅動做得太爛了. 所以決定回到win7, 回到win7之後該問題解決. 另外, PE回到win7的過程中不會傷害之前SSD上安裝的ubuntu系統, 也不會傷害原HDD裡的雙系統.

資料遷移

現在在筆記本x220t上裝了win10, 也裝了ubuntu 18.04, 但是如何將工作機t440p的根分割槽遷移到x220t的根分割槽呢? 因為我們已經在x220t上安裝了ubuntu 18.04, 這樣省去了採用命令劃分EFI分割槽, 以及最後填充EFI分割槽的步驟. 現在將精力集中在如何快速遷移根分割槽上.

  • 目的機x220t因為有寫操作, 故要以livecd啟動, 啟動ssh server, 並將根分割槽載入到/mnt
sudo -i
apt install openssh-server
passwd
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
service ssh restart
fdisk -l
mount /dev/sdb4 /mnt

# backup 3 files
/mnt/boot/grub/grub.cfg
/mnt/etc/hostname
/mnt/etc/fstab
  • 源機t440p只有讀操作故不需要以livecd啟動. 但如果以livecd啟動的話, 未載入根分割槽所依賴的分割槽如/bak分割槽, 此時如果又沒掛載/bak分割槽的話, rsync命令遷移一些指向/bak分割槽的軟鏈時會報錯退出. 人工刪除該軟鏈重新執行即可. 且需要注意 rsync命令中的/mnt/後應該有/, 否則會將mnt目錄遷移到根分割槽的mnt目錄下.
sudo -i
fdisk -l
mount /dev/sda9 /mnt

# rsync will now copy all files, directories, permissions and owners over to the destination machine. 
# It also skips all files and directories that are not on the root filesystem, like /dev/, /sys/, /proc/. 
# If there are filesystems that are mounted separately on the source machine and your want those copied too, use rsync again on those mountpoints too.
# NOT USE livecd
rsync -xavP --numeric-ids --exclude='tmp' --exclude='/nas' /mnt/ [email protected]:/mnt/
# USE livecd
rsync -xavP --numeric-ids --exclude='tmp' / [email protected]:/mnt/

# then restore above 3 files
/mnt/boot/grub/grub.cfg
/mnt/etc/hostname
/mnt/etc/fstab
  • 可選, 如果之前沒有備份/mnt/boot/grub/grub.cfg, 這時也可以重新生成. 更新grub, 此時會報”canot find EFI directory”, 這樣會導致這時生成grub時無法找到原HDD中的雙系統, 不要緊, 只要找到目前SSD中的雙系統即可. 呆會下一步再執行一下grub命令即可解決
mount /dev/sdb8 /mnts
for d in dev sys proc; do mount --bind /$d /mnt/$d; done
chroot /mnt/ grub-install /dev/sdb   # canot find EFI directory
chroot /mnt/ update-grub
  • 可選, 如果之前沒有備份/mnt/etc/fstab, 這時也可以重新生成. 修復fstab, 之前執行上述遷移命令前忘了備份x220t上的fstab系統, 導致它被覆蓋, OK, 我們修復它.
blkid
e2label /dev/sdb8 "ROOT_SSD"
tee "/mnt/etc/fstab" <<EOF
#UUID can be found via blkid command
#LABEL=boot /boot ext2 sync 0 2
#UUID=735b3be3-779c-4d21-a944-b033225f3ab4 none   swap    sw      0       0
#LABEL=SWAP none swap sw 0 0
UUID=9401-D2EA /boot/efi vfat defaults 0 2
LABEL=ROOT_SSD / ext4 errors=remount-ro 0 1
EOF
  • 這時重啟系統, 就可以以grub選擇啟動SSD上的雙系統了, 如果還想把HDD的原有的雙系統也加到grub的話, 那進ubuntu系統後再執行一次update-grub命令即可.
  • 這種遷移方式效果非常好, 一個rsync命令搞定, 各種工作軟體不需要再重灌了. 呵呵

bcache

sudo apt install bcache-tools
# sdb is ssd, sda is hdd
# bcache will refuse to instantiate if it looks like a filesystem already exists on the device
sudo umount /data
sudo umount /bak
sudo wipefs -a /dev/sdb5
sudo wipefs -a /dev/sda5
# creating the bcache, --discard flag is for TRIM
sudo make-bcache -C /dev/sdb5 -B /dev/sda5 --block 4k --discard --writeback
# creae and mount the filesystem
sudo mkfs.ext4 /dev/bcache0
sudo mkdir -p /bak

# remember to comment /bak and /data as well, or it will throw: Welcome to emergency mode
vi /etc/fstab
#UUID=85d5095b-4288-4cc3-8ac7-aae3ed8e872c /bak            ext4    defaults        0       2
#UUID=e246b3d0-6905-4602-a3ae-2f2162f9871f /data           ext4    defaults        0       2
/dev/bcache0 /bak           ext4    defaults        0       2

# other commands
ls -la /sys/fs/bcache/
umount /bak
echo 1 /sys/block/bcache0/bcache/stop
echo f3e2ac40-5dc4-4e28-880c-4bbb6cd415e3 /sys/block/bcache0/bcache/detach
lsblk
cat /sys/block/bcache0/bcache/state
cat /sys/block/bcache0/bcache/cache_mode
cat /sys/block/bcache0/bcache/dirty_data
bcache-super-show /dev/sda5
bcache-super-show /dev/sdb5

恢復bak分割槽

bak分割槽存放資料, 由bcache加速

rsync -xavP --numeric-ids --exclude='images' /bak/ root@192.168.99.128:/bak/

調整分割槽

一個分割槽不夠用時, 可以使用gpartd合併相鄰的空閒分割槽.注意一點, 要合併的分割槽必須是umount狀態時才能合併.

SSD優化

# disable scanning for btrfs filesystems when boot
sudo apt-get purge btrfs-tools
sudo update-initramfs -ukall

# enable TRIM feature by adding discard option
# what's TRIM - https://blog.csdn.net/quqi99/article/details/50963308
# the option noatime is used to disable access time for a file
sudo hdparm -I /dev/sdb |grep TRIM
vi /etc/fstab
LABEL=ROOT_SSD /               ext4    noatime,discard,errors=remount-ro 0       1
sudo mount -o remount /dev/sdb8
sudo mount |grep sdb8 |grep discard

# Try not to use swap space unless it's running out of memory.
echo 1 > /proc/sys/vm/swappiness

# avoid visiting ssd by using ramdisk for /tmp instead of tmpfs
vim /etc/fstab
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/log tmpfs defaults,noatime,mode=1777 0 0
sudo mount -o remount /

# Set chrome to use ramdisk cache
cd ~/.cache/google-chrome/Default
rm -rf Cache 
sudo ln -s /tmp Cache 
rm -rf Media\ Cache/
sudo ln -s /tmp Media\ Cache

# Use noop for I/O elevator
cat /sys/block/sda/queue/scheduler
sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="elevator=noop"
sudo update-grub

# Test SSD speed
$ sudo hdparm -Tt /dev/sdb
/dev/sdb:
 Timing cached reads:   9128 MB in  2.00 seconds = 4569.28 MB/sec
 Timing buffered disk reads: 818 MB in  3.01 seconds = 272.07 MB/sec

# Make sure 4K align
$ sudo fdisk -lu |grep sdb |grep sectors
Disk /dev/sdb: 232.9 GiB, 250059350016 bytes, 488397168 sectors

# Health check
$ sudo smartctl -s on -a /dev/sdb |grep PASSED
SMART overall-health self-assessment test result: PASSED