網際網路如同電與自來水成為理所當然,現代軟體幾乎全靠網路現場下載安裝,那些印刷精美的盒子與安裝光碟的五彩斑斕,只留在老人回憶裡已不復返。

但說來有趣,基於安全,偏偏有些電腦的字典裡沒有「上網下載東西」這檔事兒,於是如何在不能上網的環境完成原本即時下載的安裝程序,有時便是個實用的野外求生技巧。

這篇筆記如何在離線 RHEL 8 安裝 Python 及 Jupyter。

新版的 JupyterLab 4.x 需要 Python 3.10+。我找到一篇教學 Simple python 3.11 install in Rhel8 with no public internet repo vm,做法是準備一台 RHEL 8 VM 或 Docker 容器負責下載必要檔案,再複製到到離線主機主機安裝。RHEL 有個人開發者的免費授權,但要申請,不想麻煩的話,可用以下 docker-compose.yml 建一台 Rocky Linux 8 容器省點事。在本地開個 downloads 資料,映對到 Rocky Linux 的 /downloads 用來放下載的檔案:

services:
  rocky8:
    image: rockylinux:8
    container_name: rocky8-offline
    command: bash -c "sleep infinity"
    volumes:
      - ./downloads:/downloads

docker compose up -d 執行後,用 docker compose exec -it rocky8 /bin/sh 登入操作:

  1. 在 Rocky Liunx 安裝 python3.11.x86_64
    yum install --downloadonly --downloaddir=/downloads/python python3.11.x86_64
  2. 將檔案 scp 上傳到離線 RHEL 8,使用 rpm -ivh 安裝
    rpm -ivh python3.11-setuptools-wheel-65.5.1-2.el8.noarch.rpm
    rpm -ivh python3.11-pip-wheel-22.3.1-4.el8.noarch.rpm
    rpm -ivh mpdecimal-2.5.1-3.el8.x86_64.rpm
    rpm -ivh python3.11-libs-3.11.5-1.el8_9.x86_64.rpm
    rpm -ivh python3.11-3.11.5-1.el8_9.x86_64.rpm
    
    安裝完成後改 python3 別名指向 3.11:
    update-alternatives --install /usr/bin/python3 python3 /usr/bin/pytnon3.11 1
    update-alternatives --config python3
    # 該主機原本 python3 已指向 3.6,修改為
    # There are 2 programs which provide 'python3'.
    # 
    # Selection Command
    # *+ 1           /usr/bin/python3.6
    #   2           /usr/bin/python3.11
    #
    # Enter to keep the current selection[+], or type selection number: 2
    python3 --version # 檢查版本
    
  3. 回到 Rocky Linux,重跑 yum install python3.11.x86_64 也裝好 Python 3.11,建立下載用的虛擬環境:
    yum install python3.11.x86_64
    mkdir -p /downloads/jupyter
    python3.11 -m venv ~/jupyter-download-env
    ~/jupyter-download-env/bin/python -m pip install --upgrade pip
    
  4. 下載 Jupyter Lab、Jupyter Notebook、Python Kernel 及 pip,--only-binary=:all: 指定只下載 wheel,避免離線安裝時還要編譯或下載建置工具
    ~/jupyter-download-env/bin/python -m pip download --only-binary=:all: --dest /downloads/jupyter pip jupyterlab notebook ipykernel
    
  5. 將 ./downloads/jupyter 下的檔案複製到 RHEL ~/jupyter 目錄,登入 RHEL 操作:
    # 建立並切換虛擬環境
    python3 -m venv ~/venv/jupyter
    source ~/venvs/jupyter/bin/activate
    # 更新 pip
    python -m pip install --no-index --find-links="$HOME/jupyter" --upgrade pip
    # 安裝 Jupyter Notebook 相關套件
    python -m pip install --no-index --find-links="$HOME/jupyter" jupyterlab notebook ipykernel
    # 檢查是否有缺,正常要看到 No broken requirements found.
    python -m pip check 
    # 檢查版本 
    jupyter lab --version
    # 執行 Jupyter Lab,會出現帶有 ?token=... 的連結,如 http://localhost:8888/lab?token=9a8b7...
    jupyter lab --no-browser --ip=127.0.0.1 --port=8888
    

為了安全,我讓 Jupyter Lab 只限本機存取,再用 SSH Tunnel 將 RHEL 本機的 8888 Port 導到我的客戶端,ssh -N -L 8888:127.0.0.1:8888 user@offline-host 參考,完成後在客戶端用瀏覽器連上 http://localhost:8888/lab?token=9a8b7... 進入 Jupyter Lab 介面,大功告成!


Comments

Be the first to post a comment

Post a comment