Category: Tech

  • How to shrink the size of an AWS EBS volume – 如何對AWS EBS 進行縮容

    這個問題很古早,官方文檔告訴你:不行。

    但是,在特定的條件下是可以的。

    特定的條件如下:

    a)一台救援EC2。
    b)一台和舊EC2 OS 版本完全一樣的系統,但root volume 是更小的size。
    c)OS 版本必須完全一樣,並且都升級到最新的,相同的kernel版本,不一樣後果自負。

    那麼場景如下:

    一台救援EC2 ,使用Amazon Linux 2023,root volume 8G
    一台新EC2 ,使用較小的EBS volume size,root volume 10G
    一台舊EC2,使用較大的EBS volume size ,root volume 20G

    步驟如下:

    首先,將新舊兩台EC2 的root volume 都detach 然後attach 到救援EC2 上。

    接下來,在救援EC2上查看UUID,可以看到新EC2 和救援EC2 的UUID 是一樣的,這是因為使用了相同的AMI 啟動。將新舊兩台EC2 的root volume EBS 作為data volume 分別mount 到一個位置,例如 /10G 和 /20G ,可以看到fstab 配置文件中的UUID 都是原來的,等一下我們要修改10G 那個。

    sudo -i
    mkdir /20G
    mkdir /10G
    
    lsblk -f
    
    mount /dev/nvme1n1p1 /20G    # 20G old root volume
    mount -o nouuid /dev/nvme2n1p1 /10G    # 10G new root volume

    然後使用rsync 將 /20G 目錄中的文件使用rsync 完全同步到 /10G 目錄中,請注意:排除掉 /boot 目錄。

    rsync -avH --progress --delete --exclude=/boot /20G/ /10G/

    在進行上述同步前,您當然需要先行確認 /20G 目錄中的實際總容量小於10G並且有足夠冗余,否則您走到這一步從一開始就是錯誤的決定。

    同步完成後, 修改 vi /10G/etc/fstab 中的UUID 為新EBS volume 的UUID。

    關閉救援EC2 ,把10G EBS volume 掛載到新的EC2 上啟動,完成。

  • How to add Porn movie meta agent to Plex server

    這個 問題困擾了我很久,因為日本的AV 女優們總是缺少封面,也不知道主題。但是我沒有想過要解決他,直到某天突然想到,難道沒有官方的 Meta Agent嗎?

    真的有,但不是官方的,github 上有一個 ThePornDatabase project, 安裝起來很簡單。

    首先找到plex server 的plugin dir,Debian 的安裝在這個位置:

    /var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-ins

    把上面的project 複製下來:

    git clone https://github.com/ThePornDatabase/ThePornDB.bundle.git

    最後記得要重新賦權給plex 用戶 :

    chown -R plex:plex /var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-ins

    這樣還不行,需要註冊一個ThePornDB 的 帳戶並申請api key。

    將這個api key 填入到plex server meta agent 選項中,才可以進行檢索和匹配。

    實際使用中,因為日本AV 的車牌元素過於單一,只有兩個,比如MIDA-179 ,會匹配出很多類似的條目,需要認真查看到底是哪一個。

    因為ThePornDB 的數據完全依賴於志願者,所以還是會有很多影片檢索不到,不過總比沒有好,很多2025年的新片倒是可以檢索出來。

    NSFW Click to reveal

  • How to run Plex media server on AWS ARM64 graviton CPU with Amazon Linux 2023

    為什麼會有這個問題?

    因為Plex Media Server 官方支持的ARM 版本只可以在Ubuntu 和Debian 上運行。

    並沒有支持Redhat 系列的ARM 版本,那麼,是不是就沒有辦法在Amazon Linux 2023 上運行了呢?當然不是。

    Plex Media Server 官方Docker image 裡面有ARM 版本。

    Let’s Do it, 首先需要考慮使用什麼來放置media files,以存儲8Tb media files ,每天訪問2Gb 的文件,一個月訪問60Gb 為例。

    最理想的是EFS,標準存儲可以提供即時響應的media playback 體驗,IA 的響應時間則是“These storage classes provide first-byte latencies of tens of milliseconds.” ,對於長久未訪問的media 來說第一次有幾十個毫秒的延遲似乎也是可以接受的。

    EFS的問題在於,他的讀寫都是要收錢的,即使Infrequent Access storage 比例為90%,每月的存儲費用加上一個月訪問60G media 的讀寫,也會超過500$ 一個月。

    如果使用S3,S3 有一個 Intelligent-Tiering ,他可以在3種不同的Instant Access Tier 中自動轉換節省儲存成本。

    以存儲比例 5%/5%/90% 和上述存儲量,訪問量為例,每個月的成本將會下降到50$ 一個月左右。

    好了,將media files 上傳到Tokyo 的plexmediafiles S3 bucket,啟動一台 t4g.micro instance,對internet 打開32400 port,不能只對自己的IP地址開放,因為,Plex service 會從外部連結此port 並判斷網速和是否需要進行transcoding。

    接下來安裝docker , docker-compose , 然後從官方image 啟動,這裡把mount point 放在 /home/ec2-user/Videos :

    plex:
        image: plexinc/pms-docker:latest
        container_name: plex
        restart: unless-stopped
        ports:
          - "32400:32400/tcp"
        environment:
          - PLEX_CLAIM=claim-1234567812345-345678 #Get from https://plex.tv/claim if needed
          - PLEX_UID=1000
          - PLEX_GID=1000
        volumes:
          - /home/ec2-user/plex/config:/config
          - /home/ec2-user/Videos:/Videos
    docker-compose down plex
    sleep 3
    docker-compose up -d plex

    我原本想要使用AWS 官方的 mount-s3 , 但是,很遺憾,他不支持重新掛載到docker 容器中。

    搜了一下,還有很多的第三方工具可以達成,測試rclone 沒問題。

    首先安裝必要的組件:

    dnf install fuse3 fuse3-devel -y
    echo "user_allow_other" | sudo tee -a /etc/fuse.conf
    Download rclone - https://downloads.rclone.org/v1.72.1/rclone-v1.72.1-linux-arm64.rpm
    
    rpm -i rclone-v1.72.1-linux-arm64.rpm

    運行 rclone config 添加一個新配置,命名為Tokyo ,並將plexmediafiles bucket 加進去。

    rclone mount Tokyo:plexmediafiles /home/ec2-user/Videos \
      --allow-other \
      --default-permissions \
      --daemon

    測試播放一個電影,沒問題。

    但是需要讓他以service 運行:

    vi /etc/systemd/system/rclone-mount.service
    
    [Unit]
    Description=RClone Mount Service
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=notify
    User=ec2-user
    Group=ec2-user
    ExecStartPre=/bin/mkdir -p /home/ec2-user/Videos
    ExecStart=/usr/bin/rclone mount Tokyo:plexmediafiles /home/ec2-user/Videos \
      --allow-other \
      --default-permissions \
      --vfs-cache-mode writes \
      --log-level INFO
    ExecStop=/bin/fusermount -u /home/ec2-user/Videos
    Restart=always
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target

    systemctl daemon-reload
    systemctl enable rclone-mount.service
    systemctl stop rclone-mount.service
    systemctl start rclone-mount.service
    systemctl status rclone-mount.service

    重啟試試,沒問題。對於plex direct play 來說,t4g.micro 就足夠使用了,以1080p 的電影來看,CPU利用率甚至都沒到6%,完全在t4g.micro 的正常可用範圍內。

    如果需要在客戶端網速不足的情況下進行 transcoding,則需要更強的CPU,如果是面對多用戶的服務,則可能需要GPU 機型來強化transcoding。

    看起來被讀取的文件並不會因為被讀取而變成Standard Storage class 而是維持在 Intelligent-Tiering