Bluefin项目分析
项目标题与描述
Bluefin 是一个基于Fedora的现代化Linux发行版,专为开发者和技术爱好者设计。项目名称为"Deinonychus antirrhopus",采用不可变操作系统架构,内置容器化开发工具和云原生工作流,提供稳定可靠的桌面体验。
项目状态:活跃开发中,提供稳定版本和测试版。
功能特性
核心功能亮点
-
不可变操作系统架构
- 基于OSTree技术构建,确保系统稳定性和可回滚性
- 支持系统快照和回滚操作
-
开发者友好环境
- 内置DevContainers支持,提供隔离的开发环境
- 预装VS Code及远程开发扩展
- 支持Kubernetes开发工具(kind, kubectl等)
-
云原生集成
- 原生支持容器化工作流
- 集成Podman、Docker等容器运行时
- 支持DistroShelf管理多发行版容器环境
-
硬件优化支持
- 自动检测并优化Framework笔记本电脑
- 支持ASUS和Surface设备(HWE版本)
- 集成NVIDIA显卡驱动选项
-
现代化桌面体验
- 基于GNOME桌面环境
- 集成Logo-menu扩展
- 自动月度壁纸更换功能
-
包管理系统
- 使用dnf5作为包管理器
- 支持COPR仓库
- 集成Homebrew(brew)用于用户空间软件管理
安装指南
系统要求
- 支持x86_64架构
- 推荐4GB以上内存
- 20GB以上磁盘空间
安装步骤
-
下载ISO镜像
- 从项目GitHub Releases页面下载最新ISO
- 支持标准版、NVIDIA版和HWE版
-
创建安装介质
# 使用dd命令创建USB启动盘 sudo dd if=bluefin.iso of=/dev/sdX bs=4M status=progress -
启动安装
- 从USB设备启动
- 使用图形化安装程序完成系统安装
-
首次启动设置
- 系统将自动完成初始配置
- 启用必要的系统服务
- 设置用户环境
依赖项
- Fedora基础系统
- OSTree容器运行时
- 必要的内核模块(akmods)
使用说明
基础操作
系统更新:
# 使用rpm-ostree更新系统
sudo rpm-ostree upgrade
回滚操作:
# 回滚到上一个系统版本
sudo bootc rollback
查看可用命令:
# 显示所有可用ujust命令
ujust --choose
开发环境设置
启用终端增强:
# 启用Bluefin CLI增强功能
ujust bluefin-cli
安装Kubernetes开发工具:
# 安装Kubernetes开发工具包
ujust install-k8s-dev-tools
使用Homebrew:
# 搜索软件包
brew search <package-name>
# 安装软件包
brew install <package-name>
容器开发
使用DevContainers:
- VS Code已预装DevContainers扩展
- 在项目根目录创建
.devcontainer/devcontainer.json - VS Code将自动检测并提供容器化开发环境
DistroShelf容器管理:
- 通过Logo菜单中的"Containers"选项访问
- 创建不同发行版的宠物容器
- 隔离的开发环境
系统管理
查看系统信息:
# 查看当前系统版本
cat /usr/lib/os-release
# 查看更新日志
ujust changelogs
切换更新频道:
# 使用rebase-helper切换到不同版本
ujust rebase-helper
核心代码
1. 系统信息配置脚本(00-image-info.sh)
#!/usr/bin/env bash
# 系统信息配置文件生成脚本
# 创建系统信息JSON文件和修改OS Release配置
set -ouex pipefail
IMAGE_PRETTY_NAME="Bluefin"
IMAGE_LIKE="fedora"
HOME_URL="https://projectbluefin.io"
DOCUMENTATION_URL="https://docs.projectbluefin.io"
CODE_NAME="Deinonychus"
VERSION="${VERSION:-00.00000000}"
# 创建镜像信息JSON文件
IMAGE_INFO="/usr/share/ublue-os/image-info.json"
cat >$IMAGE_INFO <<EOF
{
"image-name": "$IMAGE_NAME",
"image-flavor": "$image_flavor",
"image-vendor": "$IMAGE_VENDOR",
"image-ref": "$IMAGE_REF",
"image-tag":"$UBLUE_IMAGE_TAG",
"base-image-name": "$BASE_IMAGE_NAME",
"fedora-version": "$FEDORA_MAJOR_VERSION"
}
EOF
# 修改OS Release文件以反映Bluefin标识
sed -i "s|^PRETTY_NAME=.*|PRETTY_NAME=\"${IMAGE_PRETTY_NAME} (Version: ${VERSION})\"|" /usr/lib/os-release
sed -i "s|^NAME=.*|NAME=\"$IMAGE_PRETTY_NAME\"|" /usr/lib/os-release
sed -i "s|^ID=fedora|ID=${IMAGE_PRETTY_NAME,}\nID_LIKE=\"${IMAGE_LIKE}\"|" /usr/lib/os-release
2. 软件包管理脚本(04-packages.sh)
#!/usr/bin/bash
# 软件包安装管理脚本
# 根据packages.json配置文件安装和移除软件包
set -ouex pipefail
# 从JSON配置文件中构建需要包含的软件包列表
readarray -t INCLUDED_PACKAGES < <(jq -r "[(.all.include | (select(.all != null).all)[]), \
(select(.\"$FEDORA_MAJOR_VERSION\" != null).\"$FEDORA_MAJOR_VERSION\".include | (select(.all != null).all)[])] \
| sort | unique[]" /tmp/packages.json)
# 安装软件包
if [[ "${#INCLUDED_PACKAGES[@]}" -gt 0 ]]; then
dnf5 -y install "${INCLUDED_PACKAGES[@]}"
else
echo "No packages to install."
fi
# 构建需要排除的软件包列表
readarray -t EXCLUDED_PACKAGES < <(jq -r "[(.all.exclude | (select(.all != null).all)[]), \
(select(.\"$FEDORA_MAJOR_VERSION\" != null).\"$FEDORA_MAJOR_VERSION\".exclude | (select(.all != null).all)[])] \
| sort | unique[]" /tmp/packages.json)
# 移除排除的软件包
if [[ "${#EXCLUDED_PACKAGES[@]}" -gt 0 ]]; then
dnf5 -y remove "${EXCLUDED_PACKAGES[@]}"
else
echo "No packages to remove."
fi
3. 开发者工具安装脚本(04-override-install-dx.sh)
#!/usr/bin/bash
# 开发者工具安装脚本
# 为开发者版本(DX)安装特定工具和配置
set -eoux pipefail
# 安装kind(Kubernetes in Docker)
ghcurl "https://github.com/kubernetes-sigs/kind/releases/latest/download/kind-$(uname)-amd64" --retry 3 -o /tmp/kind
chmod +x /tmp/kind
mv /tmp/kind /usr/bin/kind
# 安装ls-iommu工具(PCI直通辅助工具)
DOWNLOAD_URL=$(ghcurl "https://api.github.com/repos/HikariKnight/ls-iommu/releases/latest" | jq -r '.assets[] | select(.name| test(".*x86_64.tar.gz$")).browser_download_url')
ghcurl "$DOWNLOAD_URL" --retry 3 -o /tmp/ls-iommu.tar.gz
mkdir /tmp/ls-iommu
tar --no-same-owner --no-same-permissions --no-overwrite-dir -xvzf /tmp/ls-iommu.tar.gz -C /tmp/ls-iommu
mv /tmp/ls-iommu/ls-iommu /usr/bin/
4. 硬件优化脚本(framework.sh)
#!/usr/bin/env bash
# Framework笔记本电脑优化脚本
# 自动检测Framework设备并应用相应的内核参数和系统优化
source /usr/lib/ublue/setup-services/libsetup.sh
set -x
# 检测CPU供应商
CPU_VENDOR=$(grep "vendor_id" "/proc/cpuinfo" | uniq | awk -F": " '{ print $2 }')
VEN_ID="$(cat /sys/devices/virtual/dmi/id/chassis_vendor)"
BIOS_VERSION="$(cat /sys/devices/virtual/dmi/id/bios_version 2>/dev/null)"
# 检查当前内核参数
KARGS=$(rpm-ostree kargs)
NEEDED_KARGS=()
echo "Current kargs: $KARGS"
# 移除不需要的nomodeset参数
if [[ $KARGS =~ "nomodeset" ]]; then
echo "Removing nomodeset"
NEEDED_KARGS+=("--delete-if-present=nomodeset")
fi
# Framework特定优化
if [[ ":Framework:" =~ :$VEN_ID: ]]; then
if [[ "GenuineIntel" == "$CPU_VENDOR" ]]; then
if [[ ! $KARGS =~ "hid_sensor_hub" ]]; then
echo "Intel Framework Laptop detected, applying needed keyboard fix"
NEEDED_KARGS+=("--append-if-missing=module_blacklist=hid_sensor_hub")
fi
fi
fi
# 应用内核参数更改
if [[ -n "$NEEDED_KARGS" ]]; then
echo "Found needed karg changes, applying the following: ${NEEDED_KARGS[*]}"
plymouth display-message --text="Updating kargs - Please wait, this may take a while" || true
rpm-ostree kargs "${NEEDED_KARGS[*]}" --reboot || exit 1
else
echo "No karg changes needed"
fi
5. 系统服务管理脚本(17-cleanup.sh)
#!/usr/bin/bash
# 系统服务管理脚本
# 启用和禁用必要的系统服务,配置系统启动项
set -eoux pipefail
# 启用核心系统服务
systemctl enable rpm-ostree-countme.service
systemctl enable tailscaled.service
systemctl enable dconf-update.service
systemctl enable ublue-guest-user.service
systemctl enable brew-setup.service
systemctl enable brew-upgrade.timer
systemctl enable brew-update.timer
systemctl enable ublue-fix-hostname.service
# 配置Flatpak源
flatpak remote-add --system --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
systemctl disable flatpak-add-fedora-repos.service
# 禁用测试性仓库(稳定版)
if [[ "${UBLUE_IMAGE_TAG}" != "beta" ]]; then
dnf5 -y copr disable ublue-os/staging
dnf5 -y copr disable ublue-os/packages
fi
这些核心代码展示了Bluefin项目的关键功能:系统配置管理、软件包管理、开发者工具集成、硬件优化和系统服务管理。项目采用模块化设计,每个脚本负责特定的功能,便于维护和扩展。