從cygwin遷移到msys2的原因和步驟

weixin_33976072發表於2015-05-23

為什麼從cygwin遷移到msys2

習慣Linux後,再使用Windows的話,cygwin基本是必須的。但cygwin有一些痛點:

  1. 沒有一個好用的包管理工具,無論是官方的setup.exe,還是第三方的幾個apt-cyg,都存在使用不方便和功能不全的問題:
    • setup.exe選包很累人
    • apt-cyg和它的依賴得額外安裝
    • cygwin的已安裝軟體資料庫不區分是直接安裝的還是被依賴的包,一旦裝上想等解除安裝就只能自己手動分辨了
    • apt-cyg不支援軟體升級操作,我自己加上了這個功能(goreliu/apt-cyg),雖然基本能用,但還是存在一些問題
  2. cygwin的軟體打包方式不方便,並且為官方軟體倉庫提交新的包需要走加郵件列表、發郵件、確認、上傳等諸多流程
  3. cygwin裡不少軟體的版本還是比較老的,比如git還是2.1.4版本的,升級緩慢(一個好訊息是python和ruby最近幾天升級到最新版本了,之前還是python 2.7.8/3.2.2、ruby 2.0.0,盼了好久)

而msys2基本上解決了這些問題:

  1. 使用從archlinux移植過來的pacman,功能完整,使用方便
  2. PKGBUILD好寫,用過archlinux的話無學習成本,為官方源提交新包可以直接在github發PR
  3. msys2裡的軟體總體是要比cygwin新的(一個特例,最近cygwin的ruby升級到了最新的2.2,而msys2的還是2.1)

遷移的麻煩

我幾個月前就在垂涎msys2,但因為幾個麻煩的問題,每次都作罷:

  1. cygwin是可以使用acl選項掛載檔案系統的,這種情況下chmod基本可用(雖然也有些問題),而msys2只能使用noacl選項掛載,chmod基本無法工作(只能修改第一個w),每個使用者都有檔案的讀許可權,是否有執行許可權根據副檔名和內容決定。直接的影響就是使用git時無法使本地檔案許可權和遠端的一致。
  2. 我使用的一些軟體cygwin裡有,而msys2裡沒有,比如w3m、dig、atool、bvi、cygstart。
  3. 有些軟體支援直接在cygwin編譯,而在msys2編譯的話需要打patch。

之前主要是阻塞在第1個問題上了,查了好久如何開啟acl,無果。今天突然想到是否可以讓git忽略本機許可權,果然有方法:

git config core.filemode false

另外還有.ssh目錄無法修改成700的麻煩,好在我不需要在msys2開sshd,可以不考慮這個。那麼許可權的檔案基本就沒有了。

第2個問題就相對好處理了,自己編譯打包了bviplus、atool、w3m、cygutils(裡邊有cygstart)等,因為之前在archlinux就經常自己打包,輕車熟路,PKGBUILD見https://github.com/goreliu/my-MSYS2-Packages。Dig不好編譯,但有現成的可以下載

第3個問題只是稍微麻煩些,可以寫個指令碼搞定,基本不用考慮。

折騰了一下午,終於遷移了過了,刪掉了cygwin。

步驟

  1. 官網下載最新的安裝包,安裝到c:\msys64。

  2. 將之前cygwin的home目錄直接替換到msys64/home

  3. mkpasswd > /etc/passwd; mkgroup > /etc/group,和cygwin裡一樣

  4. 註釋掉/etc/fstab中的那一行,保留/cygdrive目錄,以和cygwin一致(可選)

  5. 修改/etc/etc/pacman.d/mirrorlist.*,改成國內地址,如http://mirror.bit.edu.cn/msys2/

  6. 使用pacman安裝需要的軟體

  7. 在檔案瀏覽器的郵件新增Open MSYS2 here的選單:

    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\Directory\Background\shell\open_msys2]
    @="Open MSYS2 here"

    [HKEY_CLASSES_ROOT\Directory\Background\shell\open_msys2\command]
    @="c:\msys64\usr\bin\mintty.exe /bin/sh -lc 'cd "$(cygpath "%V")"; exec zsh'"

    [HKEY_CLASSES_ROOT\Folder\shell\open_msys2]
    @="Open MSYS2 here"

    [HKEY_CLASSES_ROOT\Folder\shell\open_msys2\command]
    @="c:\msys64\usr\bin\mintty.exe /bin/sh -lc 'cd "$(cygpath "%V")"; exec zsh'"

  8. 建立指向C:\msys64\usr\bin\mintty.exe /usr/bin/zsh --login的快捷方式,並繫結快捷鍵

  9. 設定export MSYS="winsymlinks:lnk"關鍵變數,不然打軟連直接變成了複製

  10. 在需要忽略本地檔案許可權的git repo目錄執行git config core.filemode false

  11. isc.org下載windows版本的bind,包含host、dig等命令

  12. git clone git@github.com:goreliu/my-MSYS2-Packages.git,進入需要的目錄,執行 makepkgpacman -U xxx.tar.xz安裝自己打的包。

然後環境就和之前的cygwin沒有什麼區別了。

付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活定價,歡迎諮詢,微信 ly50247。

相關文章