2018年7月28日 星期六

使用 cryptsetup 將磁碟分區加密(encrypt)

Linux 核心內建 LUKS( Linux Unified Key Setup),搭配工具 cryptsetup 就可以將磁碟資料加密,確保個人隱私.為了要可以實際運作, 可以利用 gparted 將分區(partition)多餘的空間切割出另一個分區(例如我切割出 /dev/sda8),用工具 cryptsetup 命令選項 luksFormat 規劃並存放加密資料:
   sudo   cryptsetup   luksFormat   /dev/sda8

接著必須輸入大寫  YES ,緊跟著輸入兩次相同的片語,就會將分區資料全部洗掉作為加密碟.顯示該硬碟,輸入命令 luksDump,確認硬碟是否已經被加密:
   sudo  cryptsetup    luksDump   /dev/sda8

使用加密碟時,必須開啟(luksOpen)並賦予裝置一個名稱, 接著輸入正確的片語後,系統才會在目錄 /dev/mapper 產生一個對應裝置(device map)的符號鏈(像是 ../dm-X)
   sudo  cryptsetup     luksOpen    /dev/sda8    cryptDISK    &&    ls     /dev/mapper

一旦在 /dev/mapper 底下產生了對應裝置的符號鏈, 就可以像一般磁碟的使用方式(例如作成 EXT4 檔案系統,再把它掛進檔案系統來使用)
    sudo  cryptsetup     luksOpen    /dev/sda8    cryptDISK
    sudo  mkfs.ext4   /dev/mapper/cryptDISK
    sudo  mount   /dev/mapper/cryptDISK    /mnt

之後所有對  /mnt 的讀寫,都是先經過核心加/解密過程,使用者看不到該過程,最後磁碟不用時記得先卸載,再下一個關閉指令(luksClose),處理 cache 的資料避免遺失,讓資料保持隱密(encrypt)
    sudo  umount   /mnt
    sudo  cryptsetup     luksClose   cryptDISK

若沒了密碼, 便無法開啟 /dev/sda8, 整個分區都是一片亂數.對人是毫無意義可言,卻達成了個人隱私的目的.

安裝 linux mint

我很少將 Linux mint 安裝到硬碟, 最多將 iso 檔複製到硬碟後用 grub 來啟動它, 因 grub 可以將核心檔(vmlinuz) 及啟動檔(initrd.lz)從 iso 檔提取出來,只要將指示寫進 grub.cfg 啟用 loopback 命令引用loop裝置, Ubuntu 的核心系統會利用 boot=casper  iso-scane/filename 去找尋 iso 檔,之後將它掛載(mount)到 root 底下(/cdrom),Linux kernel 最後會將檔案/cdrom/casper/filesystem.squashfs 使用 overlay 檔案系統掛載(mount -t overlay)方式形成特殊的檔案系統, 底下列出我使用的 grub.cfg(不要搞混 grub 的 root 與 linux 系統的 root ,它是兩個獨立系統的詞彙用語):


menuentry "GPT Linux mint 191 Read Only" {
  set root=(hd0,1)
  set iso=/boot/linux191.iso
  loopback loop $iso
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso  locale=zh_TW.UTF-8
  initrd (loop)/casper/initrd.lz
}

一旦 linux 啟動完,檔案系統掛至定位, 只要將檔案系統複製到硬碟的 EXT4 分區(/dev/sda3), 一些目錄像是 /proc, /sys, /cdrom, /home, /media, /mnt, /run,/srv, /tmp, /boot 並不需要複製,只要用命令 mkdir 產生目錄,最後再將核心(vmlinuz)及啟動(initrd.lz)兩個檔案複製到檔案系統內(/boot). 開啟終端機,輸入以下命令(備註: /dev/sda3 需事先規劃成 ext4系統)來複製 Linux Mint 整個檔案系統:

   sudo su
   mount   /dev/sda3    /mnt
   for rd in bin dev etc lib lib64 opt root sbin usr var; do cp -aR /$rd /mnt/$rd; done
   for md in cdrom home media mnt proc run srv sys tmp boot;  do mkdir /mnt/$md; done
   cp    /cdrom/casper/vmlinuz    /mnt/boot
   cp    /cdrom/casper/initrd.lz    /mnt/boot
   sync;sync;sync
   umount /mnt
   reboot

系統複制好後,必須要有密碼才能登錄 linux 系統,利用 kermel 選項的  rw  init=/bin/bash 就可以讓 linux 直接使用超級使用者開啟終端機接受命令. 我修改了 grub.cfg 添加一些選單項目(memuemtry) :

set timeout=3
menuentry "GPT Linux mint@hardisk  /dev/sda3 " {
  set   root=(hd0,3)
  linux   /boot/vmlinuz   root=/dev/sda3    ro   locale=zh_TW.UTF-8
  initrd  /boot/initrd.lz

}

menuentry "Run linux's shell to change password for any user" {
  set   root=(hd0,3)
  linux   /boot/vmlinuz   root=/dev/sda3   rw   init=/bin/bash
  initrd  /boot/initrd.lz
}

menuentry "GPT Linux mint 191 Read Only" {
  set root=(hd0,1)
  set iso=/boot/linux191.iso
  loopback loop $iso
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso  locale=zh_TW.UTF-8
  initrd (loop)/casper/initrd.lz
}

重新開機,按著 ESC 鍵, grub 就會跳出選單,選第2個項目,讓 linux 先進入超級使用者的交談模式(super user shell), 敲入 password 指令重設超級使用者的密碼,利用 useradd 添加使用者, mkdir 建立一般使用者的家目錄, chown 賦予使用者權限, password 再重設一般使用者的密碼,修改密碼時系統會要求輸入兩次一模一樣的密碼做確認:

       #password
       ...
       #useradd    mason
       #mkdir    /home/mason
       #chown   mason.mason   /home/mason
       #password    mason
       ...
       #reboot

重新開機(gurb內定使用最前面的選單開機),使用 mason 身份及密碼去登錄, 登錄後在終端機可以用 su 命令,敲入超級使用者密碼,就可以變身為超級使用者,管理系統的工作

p.s. 安置裝好後,還有一些需要再調整的:
1. 修改 /etc/lightdm/lightdm.conf  將裡面的 autologin-user=mint 改成想要登錄的名稱,例如 autologin-user=mason,就可讓 mason 無需輸入密碼,自動登錄
2. 將 /etc/timezone 內容修改成 Asia/Taipei 符合台灣的時區
3. sudo apt-get install gcin 加入中文輸入法
4. 修改 /etc/sysctl.conf , 加入一行  vm.swappiness=1
5. 修改 /etc/passwd ,  將一般使用者登錄程序改用 /bin/bash, 預設可能會是 /bin/sh
6. 如果要初始化一些想要執行的程序, 可以修改 /etc/rc.local 讓它開機自動啟動

2018年7月21日 星期六

開始了解 GPT 並安裝 grub

早期硬碟的主要分割區最多只有 4 個,搭配老式的 BIOS(開機作業程序),基本上運作不成問題,但隨著新一代作業系統需要高容量儲存空間以及更多分割區的作業需求, 必須升級程 EFI , 甚至進階到 UEFI,硬碟分割表也必須跟著升級成GPT(GUID partition table)才能因應各種任務,因此有必要去了解 GPT 的運作常識,之前分割硬碟我常使用工具程式 fdisk, 但這回為了要製作 GPT, 在 Linux 作業系統上需要改用 gdisk, 大部份指令(使用 ? 就可以列表出來)與 fdisk雷同, GPT 為了與老式 BIOS 相容,使用 id 編號 0xEE 來識別, 因此用 fdisk 來看硬碟時只會看到 0xEE 的 GPT 分區,改用 gdisk 才能列表查 GPT 各分區磁區佔用的情形,還蠻容易操作的.底下列出 gdisk 一些常用到的指令:
      l            列出各種可用的註冊編號(list known partition types)
      n           在 GPT 內新增一個分區
      o           新建一個空的 GPT
      p           列出 GPT 內各分區資訊
      q           離開 gdisk
      t            修改 GPT 內分區的註冊編號(change a  partition's type code)
      v           驗證 GPT 內容
      w          將修改的內容寫到 GPT 內
      ?           列出所有可用指令

如果是用隨身碟製作 GPT,在劃分完後,可能需要拔插隨身碟一遍, 讓新的分割表可以被 Linux kernel 重新識別. 使用 partprobe 就可讓 kernel 重新讀取裝置的 partition table,而無需熱插拔:
      sudo partprobe /dev/sdb

為了能跑各種不同的作業系統,安裝像是 grub 2.0 的 bootloader 是一個非常實用的步驟,而要讓grub 一開機就取得主導權, 就必須先在 GPT 內新增一個編號 0xEF02 BIOS Boot partition 分區(簡稱 BBP),大小只要 1MiB 就足夠了,該分區不需要去規劃它(Format).目前我將 /dev/sdb1 保留給 grub 當作開機啟動區(BBP),大小設定成 64 MiB

但如果要啟動 EFI 相容的像是 Windows boot loader的啟動程序,就需要在 GPT 新增一個編號 0xEF00 EFI System 分區,大小約 500MiB 就夠了,該分區簡稱為 ESP (EFI System Partition),它必須規劃成(Format) FAT32,而所有用來啟動 EFI 的程序檔案就放在該分區的特定目錄底之下,底下將規劃 /dev/sdb2 成 EFI filesystem, 而 /dev/sdb3 將規劃成 ntfs:      
       sudo su      
       mkfs.fat  -F32 /dev/sdb2
       mkfs.ntfs /dev/sdb3

如果是要安裝 Linux 作業系統, 可以在 GPT 內新增一個編號 0x8300 Linux filesystem 分區,再規劃成(Format) EXT4 並將作業系統等檔案,甚至一些 grub bootloader 重要程序及驅動程式都可以放在該分區內,底下將 /dev/sdb2 規劃 EFI filesystem, 而將 /dev/sdb3 規劃成 Linux ext4 filesystem, 準備將 grub 開機程序注入 /dev/sdb 而 boot loader 的其它必要檔案將複製到 /dev/sdb3:
        sudo su
        mkfs.fat -F32 /dev/sdb2
        mkfs.ext4 /dev/sdb3

準備要安裝 grub bootloader, 先將磁碟分區 /deb/sdb3 掛到檔案系統上(例如 /mnt):
        mount  /dev/sdb3   /mnt

傳統 BIOS 則只要安裝 grub 到 BBP 就可以讓 grub 取得開機主導權, 若是安裝 32 位元的 grub:
        grub-install --root-directory=/mnt   /dev/sdb

若是安裝 64 位元的 grub:
        grub-install --root-directory=/mnt  --target=x86_64-efi   /dev/sdb

接著要製作符合 EFI 格式的 loader, 需事下載並安裝好 64 位元版的 grub-efi-amd64-bin 或是 32 位元版的 grub-efi-ia32-bin, 若是安裝 64 位元的版本,檔案會被複製到 /usr/lib/grub/x86_64-efi 目錄底下, 32 位元的版本則會被安裝到 /usr/lib/grub/i386-efi 目錄底下:
        sudo apt-get install grub-efi-amd64-bin  grub-efi-ia32-bin

準備將 /dev/sdb2 用來作為 EFI  開機區(簡稱ESP), 其實只要將 bootx64.efi 或 bootia32..efi 加上 grub.cfg 兩個檔案放到 ESP 特定目錄(通常 bootx64.efi 或 bootia32.efi 要放在 /EFI/BOOT, 而 grub.cfg 要複製到 /boot/grub 或 EFI/BOOT 目錄裏面), 就能讓 grub 取得開機主導權, 其中檔案 bootx64.efi 或 bootia32.efi 可以用 grub-mkimage 製作出符合 EFI 格式的執行檔, 64 位元的執行檔:
        umount   /mnt
        mount /dev/sdb2 /mnt
        cd /mnt
        mkdir  EFI    boot
        mkdir  EFI/BOOT   boot/grub
        grub-mkimage   -d /usr/lib/grub/x86_64-efi -o EFI/BOOT/bootx64.efi  -p /boot/grub   -O x86_64-efi  fat iso9660 part_gpt part_msdos normal boot linux linux16 configfile loopback chain efifwsetup efi_gop  efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf   cat

若是要用 32 位元的執行檔:
        grub-mkimage   -d /usr/lib/grub/i386-efi  -o EFI/BOOT/bootia32.efi  -p /boot/grub    -O i386-efi      fat iso9660 part_gpt part_msdos normal boot linux linux16 configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf  cat

稍微編輯一下 /mnt/boot/grub/grub.cfg 的菜單, 將以下內容輸入存檔.
#==== begin of grub.cfg ===========
set timeout=2
set default=0
hiddenmenu

menuentry "Linux mint 173 Read Only" {
set root=(hd0,3)
set iso=/boot/linux173.iso
loopback loop $iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso quiet slash locale=zh_TW.UTF-8
initrd (loop)/casper/initrd.lz
}
#==== end of grub.cfg ===========

需注意的是 grub.cfg 要放在 grub 可以抓到的地方(內定是 /boot/grub/grub.cfg).否則開機找不到時會跳進命令列模式(這時可以試試用 configfile 命令去指定檔案所在的地方讓它秀出選單). 最後將 linux 的 iso 檔複製到 linux 分區, 從上述 grub.cfg 的設定可以看出來, iso  開機檔是磁碟 0 第 3 分區(hd0,3) 的檔案 /boot/linux173.iso,

p.s. 經上述過程製作好的隨身碟, 用 usb hub 將它跟滑鼠及鍵盤連接我的 windows 10 平板電腦(型號是華碩的 vivotab 8, M80TA), 先單按電源鍵開機, 等燈亮起後放開,接著同時按住電源加上音量down鍵, 直接進入 EFI BIOS, 關閉  EFI secure boot 及  fast boot, USB controller 視需要改成 EHCI 或 XHCI, 儲存之後重新開機,按住 ESC 鍵就會跳出選單,選擇從 USB 隨身碟開機,讓 vivo tab 8 進入 linux mint 的世界, 但遺憾的是無線網路不通,觸控螢幕及觸控筆都無法運作. 但玩過一遍之後,我了解了 EFI  GPT 的運作模式,這是最大收穫的地方

2018年7月11日 星期三

使用 linux 命令 hdparm 清除 ssd

參考文章: https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase
固態硬碟用久了之後,感覺似乎開/關機的時間變久了,想來個大掃除,低階格式化可讓它回到初始狀態.使用命令 hdparm 就可以搞定:https://linux.die.net/man/8/hdparm

1. 用usb光碟或隨身碟的Linux mint作業系統來開機,開啟終端機先切換使用者為 su, 命令列輸入
    sudo su

2. 假設固態硬碟放在 /dev/sda, 先確認固態硬碟(SSD) 是否"沒被鎖定"
    hdparm -I /dev/sda 

...
Security: 
Master password revision code = 65534
supported
not enabled
not locked
not frozen
not expired: security count
not supported: enhanced erase
2min for SECURITY ERASE UNIT.
確認上述 not locked 的字眼. 確定該硬碟支援清除模式

3. 設定臨時的致能使用者( --user-master u), 以密碼 123456 (--security-set-pass 123456)為例, 密碼可以隨意指定, 但必須記住該密碼,待要清除固態硬碟時使用:
        hdparm --user-master u --security-set-pass 123456 /dev/sda
這時如果再用 hdparm -I /dev/sda 來查資訊,上述的Security黃色部份將會改為 enabled

4. 準備使用剛剛的密碼來低階格式化, 切記:將會把固態硬碟完整抹除無法回復.
        hdparm --user-master u --security-erase 123456 /dev/sda

5. 之後用  fdisk /dev/sda 重新分割固態硬碟,全新一顆固態碟又生龍活虎了
        fdisk /dev/sda