顯示具有 Macbook 標籤的文章。 顯示所有文章
顯示具有 Macbook 標籤的文章。 顯示所有文章

2025-06-18

kanata鍵盤程式可以在三種OS使用

用了一陣子keyd之後,覺得可惜的是它只能在Linux用,沒辦法推薦給更多非Linux使用者。所以換用kanata看看,一開始被它的設定檔搞得一頭霧水,慢慢摸索終於把keyd用的default.conf 轉換過來,在kanata也能使用相同於keyd的操作方式。

https://github.com/jtroo/kanata
這裡有compile好的可執行檔可以下載來用
https://github.com/jtroo/kanata/releases/tag/v1.8.1

kanata 最大優點是能跨三種OS使用,Linux, Windows, MacOS(某些功能受限)。兩者的設定檔不同,不過有了keyd的設定概念,轉來kanata用也不會太難懂。

kanata 有一項keyd沒有的功能,就是tap-dance

可以定義某個鍵按幾下是什麼功能,例如

Home按一下是Home
Home按兩下是End
Left按一下是Left
Left按兩下是Home
當然不止能按兩下,也可以定義Home按三下=up、按四下=down……,不過按那麼多下其實也不是很好用。

(上面說的「按幾下」是說快速連續按)
以下是我的kanata.kdb 裡面的功能跟我在keyd 定義方式一樣。


(defcfg
  process-unmapped-keys yes
)

(defsrc
  grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
  tab  q    w    e    r    t    y    u    i    o    p    [    ]    \
  caps a    s    d    f    g    h    j    k    l    ;    '    ret
  lsft z    x    c    v    b    n    m    ,    .    /    rsft
  lctl lmet lalt          spc          ralt rmet rctl
)

(defvar
  streak-count 3
  streak-time 325
  tap-timeout 200
  hold-timeout 500
  hold-time-slow 300
  chord-timeout 50
)

(deftemplate charmod (char mod)
  (switch 
    ((key-timing $streak-count less-than $streak-time)) $char break
    () (tap-hold-release-timeout $tap-timeout $hold-timeout $char $mod $char) break
  )
)

(defchords piano $chord-timeout
  ( 2 ) 2
  ( 3 ) 3
  ( q ) q
  ( w ) (tap-hold 200 200 w (layer-while-held himep))
  ( e ) (tap-hold 200 200 e (layer-while-held mmouse))
  ( r ) r
  ( f ) (t! charmod f lmet)
  ( g ) g
  ( 2 3 ) esc
  ( w e ) A-left
  ( e f ) home
  ( r g ) C-S--
  ( x ) x
  ( c ) c
  ( v ) v
  ( b ) b
  ( 9 ) 9
  ( 0 ) 0
  ( - ) -
  ( u ) u
  ( i ) i
  ( o ) o
  ( p ) p
  ( h ) h
  ( j ) (t! charmod j rmet)
  ( m ) m
  ( , ) ,
  ( . ) .
  ( x c ) A-tab
  ( c v ) mmid
  ( v b ) enter
  ( i o ) A-right
  ( i j ) end
  ( u h ) pgup
  ( h b ) pgdn
  ( 9 0 ) bspc
  ( m , ) C-f12
  ( , . ) C-tab
)

(deflayermap (main)
  ;; for some Notebook combine up/down/left/right with pgup/pgdn/home/end
  ;; use tap-dance to set one key with multiple functions by tapping more than once
  ;; KEY (tap-dance timeout ACTIONa ACTIONb ACTIONc)
  up (tap-dance 170 (up pgup))
  down (tap-dance 170 (down pgdn))
  home (tap-dance 200 (home end))
  lsft (tap-hold 200 200 (tap-dance 180 ((macro M-a lctl) (macro M-f lctl))) lsft)
  rsft (tap-hold 200 200 (tap-dance 180 ((macro M-f lctl) (macro M-a lctl))) rsft)
  caps (tap-hold 200 200 C-spc (layer-while-held capc))
  2 (chord piano 2)
  3 (chord piano 3)
  q (chord piano q)
  w (chord piano w)
  e (chord piano e)
  r (chord piano r)
  a (t! charmod a lalt)
  s (t! charmod s lsft)
  d (t! charmod d lctl)
  f (chord piano f)
  g (chord piano g)
  x (chord piano x)
  c (chord piano c)
  v (chord piano v)
  b (chord piano b)
  9 (chord piano 9)
  0 (chord piano 0)
  - (chord piano -)
  u (chord piano u)
  i (chord piano i)
  o (chord piano o)
  p (chord piano p)
  h (chord piano h)
  j (chord piano j)
  k (t! charmod k rctl)
  l (t! charmod l rsft)
  ; (t! charmod ; ralt)
  m (chord piano m)
  , (chord piano ,)
  . (chord piano .)
  rctl (tap-hold 200 200 C-f12 rctl)
  spc  (tap-hold 200 200 spc (layer-while-held nav))
)

(deflayermap (nav)
  i up
  j left
  k down
  l right
  h home
  ; end
  y bspc
  u del
  g `
  f esc
  m mute
  , vold
  . volu
  q 1 ;; kp1
  w 2 ;; kp2
  e 3 ;; kp3
  a 4 ;; kp4
  s 5
  d 6
  z 7
  x 8
  c 9
  v 0
)

(deflayermap (capc)
  g `
  f esc
  i (mwheel-up 50 120)
  j mlft
  k mmid
  l mrtp ;; mrgt
  , (mwheel-down 50 120)
  u (mwheel-left 50 120)
  o (mwheel-right 50 120)
)

(deflayermap (himep)
  o (macro . o spc)
  k (macro . k spc)
  i (macro . i spc)
  y (macro . y spc)
  p (macro . p spc)
  h (macro . h spc)
  j (macro . j spc)
  . (macro . spc)
  f (macro . f spc)
  g (macro . g spc)
)

2025-03-26

Linux Live的記憶體(RAM)使用

 二十幾年前開始玩KNOPPIX這個很不同的Linux distribution後,就再也沒回去用正常安裝方式,KNOPPIX當時的壓縮法是用cloop,幾年之後各大distribution也開始採用Live system的方式來製作自家的CD/DVD ISO,絕大多數都是採用squashfs壓縮演算法,之後差不多squashfs主導了Live system。

 不過各家Live system用在initrd裡的系統導引法各有不同,Debian用「live」, Ubuntu用「casper」,已經走入歷史的CentOS用的也叫「live」但和Debian不同,Siduction用fll。各種live system有一個相同的開機參數「toram」, 它會把整個Live系統cp到RAM裡面,在開機完成後,我們可以把用來開機的USB隨身碟或光碟整個拿掉,因為系統已經不再依賴它了。

 但是Ubuntu用的casper在遇到「toram」參數後,會cp整支USB隨身碟全部進入RAM裡面, 這樣是有問題的,如果你的USB是64GB,而裡面裝了其他不是Live system的檔案,它會全部cp到RAM裡,萬一你的RAM只有16GB或更少,這樣就無法完成開機,因為RAM被塞滿了,而系統還沒完全cp進入RAM。

 使用Ubuntu而不要讓它cp所有USB裡的檔案進入RAM,必需自行手動拆解initrd好把casper裡面cp「整支USB」的那一段程式改成只cp「某個目錄」之下的檔案,再做成initrd,這樣才不會把RAM灌爆掉。其他Live system有的會有不同的參數(例如image_name)來指定只cp目錄下的特定檔案(squashfs壓縮的主系統檔)到RAM裡,像siduction用的fll會自行計算該檔案的大小,以便切割出為存放那個檔案大小的區域,也避免會浪費RAM。

 Live system有一項重要的參數"overlay", 在絕大多數initrd裡的規化都是採用50%, 極少數可以讓user自行指定,在我實際使用上發現50%其實不太符合需求,特別是在RAM少的電腦,例如RAM只有4G的系統下,overlay 50%的話就是只有2G能拿來當儲存體,存放開機完成後諸如 /etc, /home, /usr, /var等等,會相當不足!

 如果把"overlay"加大到90%的話,既使只有4G RAM的電腦也還算堪用,但這時就不宜使用"toram"的方式,而是保持系統放在儲存設備如USB隨身碟或電腦本身的硬碟。

至於開機有哪些參數可用,好像沒有共通的說明文件,只能自行拆解「initrd」看它裡面有什麼相關的參數可用,沒有的話就只能自行修改。

關於RAM少的電腦還有一個可以補救的方法就是使用zram, 而zram大概用50%就好,因為RAM已經很少,然而這50%可以存放大約三倍容量的資料,也就是說一台只有4G RAM的電腦,使用zram後的記憶體相當等於(4-2)+(2*3)=8G RAM,邏輯上多出來一倍,不過它要依賴CPU運算進行「壓縮/解壓縮」,或許會稍微延遲軟體的執行,但對於無法在物理上增加RAM的環境,還是相當有益處。

2025-02-27

MacBook與Linux kernel

 之前在一台退休的Intel MacBook跑Linux Live系統都只是用USB隨身碟開機進入使用,完全沒動到它的SSD,因為老機器RAM很少,不能用"toram"來載入,因此全程都要掛一支USB碟在機器上,其實有些不方便也不好看。

 後來這台MacBook的macOS已經無法再升級(其實硬要升級還是有辦法,只是已經對使用macOS沒什麼興趣)。個人在各種機器上使用Linux Live system已經二十幾年了,想到這台老MacBook的touchpad觸感不錯,重量相對的輕,電池續航力也有三個多小時,偶而帶它外出也蠻好用,現在把它的SSD割了10GB一小塊,打算用來塞入Live system(只是單純從USB copy到SSD, 不是執行正常的Linux install)。

 之前做的USB開機碟可以支援MacBook本身的Wifi以及Camera,更新到最後是Ubuntu 20.04.4,可以看到MacBook的SSD無誤,但有一陣子沒再用它,加上20.04有點年紀了,某些軟體無法換用新版本,於是這次改用Debian Trixie來開機,並且做好Wifi以及Camera(Mac叫做FacetimeHD)的支援,MacBook的硬體都能用到。

只是用它開機完成後,發現完全看不到MacBook已經割好的SSD!就是說用cat /proc/partitions時除了USB隨身碟之外完全看不到MacBook的SSD partition。變成使用的全程要一直依賴插一支支USB隨身碟。

 這時再降回去用Ubuntu 20.04.4開機,卻是可以在/proc/partitions看得到SSD,先懷疑Trixie包的initrd方式不同,於是拆除initrd裡的early,early2,再試還是一樣!看來不是initrd裡面的問題。

 搜尋網路上的相關Linux以及MacBook的資訊,但看到一堆都是講怎麼用apfs-fuse來mount,而我遇到的問題是完全看不到SSD,跟mount的問題無關。

 接著分別找了Arch,Debian,Ubuntu相關或衍生的distribuion的kernel/initrd (4.x或5.x以及6.x)來開機比對,發現只有5.x能看到SSD,而4.x跟6.x都看不到,真的是很奇怪的問題?

 又在網路上陸續找一些相關MacBook問題,最後找到一篇小小的文裡提到解決方法是在boot option加上intel_iommu=off

 加了這個option的Trixie 6.x kernel開機後果然能看到MacBook的SSD。

 那麼隨機找幾個不同kernel版本來看看它是怎麼定義"intel_iommu"的?

  • 4.9.0
    CONFIG_INTEL_IOMMU_DEFAULT_ON=y
  • 4.15.0-20
    CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
  • 5.10.188
    CONFIG_INTEL_IOMMU_DEFAULT_OFF=y
  • 5.19.0-32
    CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
  • 6.1.0-29
    CONFIG_INTEL_IOMMU_DEFAULT_OFF is not set
  • 6.11.5
    CONFIG_INTEL_IOMMU_DEFAULT_OFF is not set
  • 6.12.6-1
    CONFIG_INTEL_IOMMU_DEFAULT_ON=y
  • 6.13.2
    CONFIG_INTEL_IOMMU_DEFAULT_ON=y

 以上各版本kernel在不加任何boot option的情況下,只有5.10.188可以看得到MacBook SSD, 因為只有它是CONFIG_INTEL_IOMMU_DEFAULT_OFF=y 也就相當於在開機時加上 intel_iommu=off

 其它版本有幾個都是相當於
intel_iommu=on
或可以說,沒定義成off 就看不到SSD了。

 根據kernel文件提到「The Intel IOMMU driver allocates a virtual address per domain. Each PCIE device has its own domain.」
如果想進一步研究,可以參考以下文件:
http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/vt-directed-io-spec.pdf

2022-08-29

舊Macbook升級新版macOS

雖然Apple的機器已經從Intel CPU改成ARM CPU,但還有很多人擁有舊Macbook, 以Apple公司的官方方法,不少舊機器是無法升級使用新版macOS,以致不能升級大多數應用軟體,讓你的舊Macbook變成廢物。

我們不能怪Apple,因為這是賺錢的手段之一,不然大家都不買新機器,他們的股價怎麼辦?既然不能怪Apple,那就只有怪自己沒努力去找解決辦法。網路上各種神人提供了非官方方式的升級macOS工具,例如 

https://www.libhunt.com/compare-Opencore-Legacy-Patcher-vs-Patched-Sur
https://dortania.github.io/OpenCore-Legacy-Patcher/
http://dosdude1.com/catalina/ 

至於你的機器適合哪一版OS ? 也要考慮硬體的工作能力(像Monterey跟Big Sur是在M1上市的年代,可能對RAM的要求要8G)

目前macOS排列是
Ventura (macOS 13, 2022)
Monterey (macOS 12, 2021)
Big Sur (macOS 11, 2020)
Catalina (macOS 10.15, 2019)
Mojave (macOS 10.14, 2018)
High Sierra (macOS 10.13, 2017)
Sierra (macOS 10.12, 2016)
El Capitan (macOS 10.11, 2015)
Yosemite (macOS 10.10, 2014)

非官方升級辦法可以升級到Monterey,或者至少可以到Catalina,這樣就能升級你的應用軟體。

說到舊Macbook再戰十年還有一個條件,可能就是電池肚子大起來,那就自己手動換新電池吧!因為舊機器大多過了Apple Care,不可能幫你免費換新電池,這方面可以到網路上找你機型適用的電池,很多賣家還附了拆殼工具,其實Macbook換電池很簡單,拆開殼,拔掉舊電池接頭,換新電池,幾分鐘就解決了,電池價格大約台幣1000左右。

就我的理解如果你的舊機器只有4G RAM,可能不要考慮Monterey,而是升級到Catalina就好了,因為從下載的image來看就多了大概50%,Monterey跟Big Sur大約12G,Catalina大約8G.

你要準備一支USB外接隨身碟至少16G(或USB外接硬碟),來製作安裝硬碟,製作完成重開機時要按住Option不放,再用左右鍵選擇從安裝碟開機,就能一步一步完成安裝。

最近幫一台肚子大起來的Macbook Air(生產日期2015年,型號算2014年)換了新電池,macOS從Yosemite升級到Catalina,目前用起來順順的,不曉得能不能再戰十年?

2016-04-03

USB Live Linux 開機進 Macbook Air 更簡單

上一篇提到可以經由 isohybrid 來轉一個 image 再 dd 到 USB
專門做為 Macbook 開機,再導引到原有的 USB Live Linux.

現在找到比那種方式更簡便的辦法,就是直接用原有的 USB Live Linux
設定好讓 Macbook 的 EFI 認識,就能由 USB 開機進入 Live Linux.

最主要的就是我們需要一個 efi 的 bootloader, 可以找現成的抓來用,
像是包在 Ubuntu 15.10 ISO 檔案裡的
/EFI/BOOT/grubx64.efi

我們可以在以下這裡列表裡找到它
ftp://ftp.yzu.edu.tw/Linux/ubuntu-cdimage/ubuntu-gnome/15.10/
ubuntu-gnome-15.10-desktop-amd64.list

不過還是把 ISO 檔抓下來,
ftp://ftp.yzu.edu.tw/Linux/ubuntu-cdimage/ubuntu-gnome/15.10/
ubuntu-gnome-15.10-desktop-amd64.iso

mount -o loop /PATH/ubuntu-gnome-15.10-desktop-amd64.iso /media/ISO
再從其中 copy 出來, 改成另一個名字 bootx64.efi。

假設我們把 USB disk 掛載在 /media/USB/ 之下

mkdir -p /media/USB/efi/boot
cp /media/ISO/EFI/BOOT/grubx64.efi /media/USB/efi/boot/bootx64.efi
然後
mkdir -p /media/USB/boot/grub
再 vi /media/USB/boot/grub/grub.cfg

基本格式如下(kernel 後面的參數請依實際的代入):

set default=0
set timeout=10
manuentry 'Debian 8.3' {
linux /deb83/vmlinuz opt1 opt2 opt3 live-media-path=deb83
initrd /deb83/initrd.xyz
}
manuentry 'Ubuntu 15.10' {
linux /ub1510/vmlinuz opt1 opt2 opt3 live-media-path=ub1510
initrd /ub1510/initrd.aa
}
manuentry 'Ubuntu 15.04' {
linux /ub1504/vmlinuz opt1 opt2 opt3 live-media-path=ub1504
initrd /ub1504/initrd.kk
}

這樣製作出來的 USB disk 本身就可以在 Macboot 環境開機,又保持為 read/write,相當方便。

2016-03-24

製作 Macbook 可執行的多重 Linux Live USB

這裡所謂「多重」是指一支 USB disk 上有多種版本的 Linux, 例如 Debian, Mint,
Ubuntu, CentOS, 或是包括 Ubuntu 14.10, 15.04, 15.10, 16.04 多版本全放在一支
USB disk, 因為現在 USB disk 越來越大,一支 64GB 的可以裝10個以上不同Linux.

對於想要拿Macbook 來跑Linux 的人,跑Live Linux on USB disk 應該最方便, 
不必動到 Macbook 硬碟,更不必藉由 virtual machine. 直接把一支 USB 碟
插在 Macbook 按住 Option 開機就能進入 Linux 環境工作。

長期以來我都是把 USB disk format 成 vfat 再用 grub 0.97 放在 boot/ 下,就可以
在任何 x86 電腦上開機進入 Linux 環境,只是這樣的 USB 遇到 Macbook 就不能開機,
沒得玩了!
(grub 0.97 既可以 boot CD/DVD 也可以 boot vfat USB disk)

從網路上找到的製作 Macboot 可開機的 Linux Live USB 的方式是:
1. 下載 ISO 檔(例如 Ubuntu_xxxx.iso)
2. 在Macbook 執行 hdiutil convert -format UDRW -o yyyy.img Ubuntu_xxxx.iso
3. dd if=yyyy.img of=/dev/diskN bs=1m

但這支USB disk 變成read only, 又只能塞進一種 Linux, 剩下的空間(幾GB ?)
完全用不到,而且這個 Linux 是原出廠設定, 這不是我要的操作方式.

那我來重製 ISO 檔,這樣做出來的 Linux Live USB 開機後就是我想要的環境。
可是發現修改過的ISO(改內容,再重製成 ISO file) 經過hdiutil 轉過後,卻不像
原廠 ISO 做出來那樣可開機,我改的ISO dd 出來的 USB 在 Macbook 開機時完全看不到。

幾過多次試作,發現有兩種原因造成自行改過的 ISO 無法被Macbook 用來開機,
因此要這樣才能開機:
1. boot loader 必需要用 isolinux
2. 用genisoimage/mkisofs 做出來的ISO 檔要再過一次 isohybrid

genisoimage --no-emul-boot --boot-info-table --boot-load-size 4 \
-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -J -r -l \
-o my_Linux.iso my_Linux_source_directory
然後執行
isohybrid my_Linux.iso

這樣做出來的 ISO 檔直接在 Linux 環境 dd 到 USB disk, 便可以插在 Macbook 開機,
完全不必再拿到 MacOS 環境下再用 hdiutil 轉換。
(dd if=my_Linux.iso of=/dev/sdX bs=1M)

只是,這樣就很不方便,因為對 Live Linux 內容任何大小的修改,每一次都必需重製成 ISO
再 dd 到 USB disk, 非常浪費時間。

換一個方式,把我原本可以在 x86 電腦開機的 USB disk 上各種 Linux 的 kernel/initrd
copy 出來,用上面提到的方式 改以 isolinux.cfg 來寫開機控制,參數可直接取用原有
那支 USB 的 grub/menu.lst 過來即可。

然後用上面的 genisoimage 指令及 isohybrid 做成一支可供 Macboot 開機的 USB disk,
在 Macbook 開機的時同時,也插入另一支我原本的 USB disk,

這樣在 boot loader 載入 kernel/initrd 後便會去另一支 USB disk(Macbook 不認定可開機的)
上面找對應的系統檔案,完成開機進入完整的 Linux 環境。

大部份的 Live Linux 都可以兩支同時插著開機(當然在按power 的同時也要按住 Option),
少數 Live Linux 要插拔一下非開機用的那支,才會被偵測到,載入完整系統。