最近安装了 ubuntu24.04 双系统,想在 ubuntu 侧编辑和管理 windows 数据盘中的 hexo 博客目录,但由于 ubuntu 的磁盘挂载策略默认在 root 用户下,在配置过程中出现了很多权限问题,为了避免 sudo 指令使用 hexo,在这里总结一下 ubuntu 侧使用 windows 磁盘中 hexo 目录的流程。
  注意所有指令若无特别说明均在普通用户下的~目录(Home)运行。

一、安装 Node.js 和 npm

  安装 Node.js 和 npm 并确认安装情况:

1
2
3
4
5
6
7
8
# 更新软件包
sudo apt update && sudo apt upgrade
# 下载 node.js 和 npm
sudo apt install nodejs npm
# 查看 node.js 版本
node -v
# 查看 npm 脚本
npm -v

  apt 指令安装的 node.js 和 npm 可能不是最新版,需要手动进行升级:

1
2
3
4
# 更新 npm
sudo npm install -g n
# 更新 node.js
sudo n stable

  重启终端或刷新当前终端环境,再次查看版本信息:

1
2
3
4
# 查看 node.js 版本
node -v
# 查看 npm 脚本
npm -v

  一般到这一步就能够完成更新。接下来解决该部分的权限问题。

npm 权限问题

  默认情况下 Node.js 的全局路径 /usr/local/lib/node_modules 属于 root 用户,这一点可通过下列两条指令进行验证,这会导致普通用户使用 npm 时提示权限问题:

1
2
3
4
# 查看 npm 更新安装路径
npm root -g
# 查看 npm 全局安装路径
npm config get prefix

  需要修改全局安装路径到 home 目录:

1
2
3
4
5
6
7
8
# 在home/下创建存放全局模块的文件夹
mkdir -p ~/.npm-global
# 配置 npm 使用新的路径
npm config set prefix '~/.npm-global'
# 将路径加入环境变量
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
# 刷新配置
source ~/.bashrc

  在普通用户下重新安装 Hexo 命令,会发现无需 sudo 指令即可执行:

1
2
3
4
5
6
7
# 安装 hexo 包
npm install -g hexo
# 查看 npm 的全局包列表
npm list -g
# 输出如下:
> /home/your_name/.npm-global/lib
> └── hexo@8.1.1

二、磁盘权限配置

  windows 的磁盘一般为 NTFS 或 exFAT 分区,Linux 在挂载这些分区时,默认权限管理较为严格。如果挂载参数不对,普通用户无法获得 write 和 execute 权限。
  首先查看/etc/fstab文件,这里保存 linux 系统默认磁盘挂载策略:

1
2
/dev/disk/by-uuid/8469aa97-**** / btrfs defaults 0 1
/dev/disk/by-uuid/267D-**** /boot/efi vfat defaults 0 1

  可以看到只有 Ubuntu 系统的根目录和 EFI 引导分区的挂载信息,因此按照下列步骤进行配置:

2.1 获取 Windows 磁盘的 UUID

  在终端执行sudo blkid,在输出的列表中,寻找 TYPE="ntfs"TYPE="exfat" 的设备,找到博客目录所在的 windows 数据盘。记下 UUID 中的字符串,注意不含引号。

2.2 编辑 fstab 文件

该部分操作具有风险,请谨慎对待!

1
2
3
4
# 备份 fstab 文件
sudo cp /etc/fstab /etc/fstab.bak
# 编辑 fstab 文件
sudo vim /etc/fstab

  在 fstab 文件末尾,另起一行,添加以下内容:

1
UUID=你的UUID /media/luotian/Files ntfs defaults,uid=1000,gid=1000,umask=022,utf8 0 0

  参数解释:

  • UUID:比 /dev/sda1 这种设备名更稳定,防止插入 U 盘后盘符漂移
  • ntfs:指定文件系统格式
  • defaults:包含基本的读写和执行权限
  • uid=1000,gid=1000:将磁盘内所有文件和目录的底层所有权强行映射给普通用户,Ubuntu 默认建立的第一个普通用户 ID 均为 1000
  • umask=022:屏蔽部分写权限,使最终目录权限为 755,文件权限为 755,这是 Node.js 和 Git 运行的理想权限状态
  • utf8:指定字符集,防止 Hexo 生成时的中文文件名和路径乱码

  保存 fstab 文件并刷新系统配置:

1
systemctl daemon-reload

2.3 测试挂载配置

修改引导文件后,务必在重启前测试配置是否合法,否则会导致 Ubuntu 无法开机!

  关闭任何正在访问 windows 数据盘的软件或终端,执行以下命令:

1
2
sudo umount /media/luotian/Files # 如果提示未挂载可以忽略
sudo mount -a

  如果终端无任何信息返回,说明挂载参数完全正确,配置已生效。如果 mount -a 命令返回了错误提示,重新依次执行上述两条指令,若依旧提示报错,说明 fstab 配置有误。此时务必重新检查配置参数或执行 sudo cp /etc/fstab.bak /etc/fstab 恢复备份,切勿直接重启电脑!

三、git 配置

  git 配置指令如下:

1
2
3
4
5
6
7
8
9
10
# 安装 git
sudo apt install git -y
# 配置用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "youremail@example.com"
# 配置 SSH 密钥
# 接下来一路回车,全部保持默认,直到终端输出完毕
ssh-keygen -t ed25519 -C "youremail@example.com"
# 读取公钥内容
cat ~/.ssh/id_ed25519.pub

  复制终端中输出的整串字符。随后登录 GitHub 网页,依次点击右上角头像进入 Settings,在左侧边栏找到 SSH and GPG keys,点击 New SSH key。Title 栏可以随意填写(如 Ubuntu),将刚才复制的公钥粘贴至 Key 输入框中,点击 Add SSH key 完成保存。

  在终端执行下列命令测试与 GitHub 的连接:

1
ssh -T git@github.com

  打开 Hexo 博客根目录下的 _config.yml 文件,定位到 deploy 字段。确保 repo 这里是 SSH 格式的链接:

1
2
3
4
deploy:
- type: git
repo: git@github.com:yourName/yourName.github.io.git
branch: master

  如果你的分支不是 master,请保持原有的分支名称。

git 权限问题

  博客目录在 windows 的数据盘下,因此在博客目录中使用 git 命令属于跨文件系统分区操作,会触发 Git 的底层安全锁,导致部署命令失效,出现dubious ownership 报错,需要将该目录加入全局信任白名单:

1
git config --global --add safe.directory /你的博客目录

四、hexo 博客目录配置

  进入博客目录,如果你之前已经在博客目录中使用了 sudo 指令,需清理受到 root 权限污染的文件:

1
2
3
4
5
6
# 清除旧的缓存配置与部署目录
sudo rm -rf db.json .deploy_git
# 清除旧的 Node 依赖树
rm -rf node_modules package-lock.json
# 重新安装局部依赖包
npm install

  安装完成后,如果看到含有 vulnerabilities 的提示,无需理会,这是 Node.js 生态中极其常见的现象。不要执行 npm 推荐的任何指令。在博客根目录下重新清理并推送:

1
2
hexo clean && hexo g && hexo s
hexo d

  如果能够顺利生成 public 文件夹且没有报错,说明博客环境已搭建好,并成功避免 sudo 指令问题。