引入
飞牛OS
是一个很好的免费国产NAS系统,其基于Debian,有着美观的界面,便于使用的逻辑,以及优秀的系统内置应用,被国内许多个人/家庭NAS用户所青睐。 我用J3160主板和一块120G的BIWIN固态组装了一台小NAS,但是存在这样的问题:
飞牛系统的docker服务默认只能储存到挂载的储存空间,也就是说我如果要存储docker服务在固态,直接通过飞牛的话,只能存储在仅有19.24GB的分区3,这是远远不够我们折腾的。而系统盘在安装时我分区给的比较大,飞牛OS系统本身也占不了多少,如果能把docker存储在系统分区的话,就能避免分区3紧张的空间,还能充分利用系统分区剩余的大量空间。为了实现这个目标,我们需要既能让飞牛的docker服务能正常在前端使用(即认为自己是在挂载的储存空间分区),又能让docker服务真正存储在系统分区,这就引出了Linux系统下的软链接的功能。
信息
软链接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。
具体用法是:ln -s 源文件 目标文件。
当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在其它的 目录下用ln命令链接(link)就可以,不必重复的占用磁盘空间。
例如:
ln -s /usr/local/mysql/bin/mysql /usr/bin这样我们就对/usr/bin目录下的mysql命令创建了软链接
【硬链接】
硬链接指通过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种链接就是硬链接。硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的链接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。
【软链接】
另外一种链接称之为符号链接(Symbolic Link),也叫软链接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
步骤
找到目前位置
简单来说,我们就是要利用软链接让原本存储docker的挂载的存储空间的docker位置,构建的docker文件夹里面的内容变成一个快捷方式,指向真实存储docker数据的系统分区里的docker
首先用飞牛的终端/SSH连接,找到目前Docker的位置:
sudo -i #提权
docker info | grep "Docker Root Dir"比如我这边docker服务原本存储在存储空间1,就会返回:
Docker Root Dir: /vol1/docker停止Docker服务
在搬走在vol1内的docker之前,首先保证现在的docker服务停止:
systemctl stop docker正常没有返回内容,如果想检查是否停止。输入 docker ps,如果提示“Cannot connect…”,说明已经停好了。
创建系统分区内的Docker位置
mkdir -p /system_docker_data搬数据
# 假设旧路径是 /vol1/docker,搬移前后的路径请根据实际情况替换,其中系统分区入口就是"/"
cp -av /vol1/docker/* /docker/注意
必须使用 -a 参数来保留所有权限和文件属性,否则 Docker 会报错!
建立软链接
- 首先把原有的docker服务改名(一是要解除其对docker的占用,二是作为备份)
mv /vol1/docker /vol1/docker1- 建立软链接
# 格式:ln -s [真实存放路径] [Docker原以为的路径]
ln -s /docker-data /vol1/docker- 检查
ls -l /vol1/docker如果输出lrwxrwxrwx 1 root root 7 {创建软链接的日期和时间} /vol1/docker -> /docker,即快捷方式所在->真实地址所在,即软链接创建成功
重新启动docker
链接成功以后,docker的构建配置基本不用更改,当访问/vol1/docker这个目录的时候,就会瞬间穿越到我们链接的真实地址/docker 你此时可以直接重新启动docker,然后看看运行状态是否OK
sudo systemctl start docker如果后续要构建docker,直接在飞牛前端使用docker服务还是一切正常,按原来的路径vol1/docker填写即可,后续它会自己链接到你的新路径。 如果使用一段时间没有明显问题,即可删除备份的docker服务,释放硬盘空间。
风险
软链接(Symbolic Link)在Linux中是非常成熟的技术,Docker 对它的支持也很好。基本不会出现什么问题。 但是有以下几点需要注意:
注意
- 重装系统:原本飞牛OS的系统和数据文件是分离的,也就是说可以在保留数据的情况下重做系统,但是现在由于强行把docker嫁接的系统分区,所以docker数据会在重做系统的时候被清空,故如果要重做系统,应该要先转移系统分区内的docker服务,再重做(更新系统一般不会大动系统分区,所以OTA更新正常进行即可,不用来回迁移docker);
- 飞牛备份:飞牛备份或其他备份软件默认不追踪软链接,如果你同步里面备份
/vol1/docker,大概率不能备份到docker服务数据,而是备份了一些快捷方式,所以如果要备份,请选择链接后的真实地址; rm -rf: 如果要删除软链接把docker搬回存储空间,注意区分:
- 正确的删法(只删链接,不删数据):
rm /vol1/docker <-- 注意结尾没有斜杠 /- 错误的删法(同时跟踪软链接删除了docker数据):
rm -rf /vol1/docker/ <-- 注意结尾多了个斜杠 /后话
除了搬移docker,软链接也可以极大的减少数据的重复存储,在所需要使用的目录进行链接即可,实现占用一次空间,多个位置使用的效果。 同时,Windows中的NTFS文件系统也可以创建链接,包括硬链接、符号链接和目录链接,和独有的快捷方式.lnk,这个功能在管理存储,清理C盘空间上也能起到不错的作用,和Linux下有不少异同,推荐阅读Windows中的硬链接、目录链接(软链接)、符号链接、快捷方式和Linux 硬链接与软链接详细实验了解。


