给 kaldi 的egs 目录搬家
问题提出
服务器有两块硬盘,一块500G SSD固态硬盘, 一块1.8T机械硬盘。固态盘是系统盘,kaldi装在系统盘上了。最近跑librispeech recipe,疯狂下载数据集,把系统盘空间占满了。kaldi下egs目录占用空间最大,如何不改变kaldi目录结构,将egs内容移动到其它磁盘上,给系统盘的瘦身。
egs目录大小
(base) root@ai-PowerEdge-R740:/# du -sh /opt/asr/kaldi/egs/
251G /opt/asr/kaldi/egs/
egs内容存储盘是系统盘
(base) root@ai-PowerEdge-R740:/# df -l /opt/asr/kaldi/egs/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 459403376 430221280 5776016 99% /
解决方案
方案1:将/opt/asr/kaldi/egs目录备份到容量充足的磁盘,删除/opt/asr/kaldi/egs目录,新建分区或已有分区挂到/opt/asr/kaldi/egs目录,将备份数据重新拷贝到新挂载目录/opt/asr/kaldi/egs。
将egs目录备份到data目录
cp -p -r /opt/asr/kaldi/egs /data
拷贝成功,删除egs目录内容
rm -rvf /opt/asr/kaldi/egs/*
指定egs目录为机械盘
mount /dev/sdb2 /opt/asr/kaldi/egs
将备份数据剪切回egs目录
mv /data/egs/* /opt/asr/kaldi/egs
方案2:新建目录/asr_egs,新建分区 /dev/sdb2, 将分区挂载到/asr_egs, 复制/opt/asr/kaldi/egs 目录到/asr_egs,将/asr_egs/egs挂载到/opt/asr/kaldi/egs目录。
新建目录
mkdir /asr_egs
挂载机械盘分区/dev/sdb2 到该目录
mount /dev/sdb2 /asr_egs
复制egs目录到/asr_egs目录
cp -p -r /opt/asr/kaldi/egs /asr_egs
复制成功删除egs目录内容
rm -rvf /opt/asr/kaldi/egs/*
将asr_egs下egs目录绑定到/opt/asr/kaldi/egs目录,两个egs目录下内容相同。
mount --bind /asr_egs/egs /opt/asr/kaldi/egs
以上两种方式都可以对egs内容实现无感知的搬家.主要区别是mount使用方法不同,前者是通过将驱动直接挂载到目录,因为一个驱动文件系统只能挂载到一个目录下,不能一个目录同时挂几个驱动。这里驱动是指文件系统,或者简单理解为磁盘分区。两者挂载方式都会导致原有目录的内容不可用,所以挂载前最好将原有目录内容备份到其它地方。
mount /dev/sdb_num /some/where #将驱动挂载到目录
mount --bind /some/where /else/where #将目录挂载到目录
具体操作
查找较大目录
使用命令 df -h / | grep “G” >log 将系统盘下大小Gb以上文件夹占用情况输入到日志文件, vim log 正则匹配 /\d\d\dG 查找100G以上文件夹,找到较大目录,进入较大文件目录,进一步排查占用目录 du -sh
创建可用分区
查看可用磁盘空间
# fdisk -l
找到没挂载的分区
# df -h 查看哪些分区挂载了
# mount #查看分区挂载到哪些目录
最后找到/dev/sdb磁盘是有可用空间,要使用磁盘,首先先要对磁盘分区
fdisk /dev/sdb #注意是sdb磁盘,不是sdb_num分区,如sdb1
创建和删除新硬盘分区命令参数如下
fdisk可以用m命令来看fdisk命令的内部命令 |
---|
a:命令指定启动分区; |
d:命令删除一个存在的分区; |
l:命令显示分区ID号的列表; |
m:查看fdisk命令帮助; |
n:命令创建一个新分区; |
p:命令显示分区列表; |
t:命令修改分区的类型ID号; |
w:命令是将对分区表的修改存盘让它发生作用。 |
如果不用的分区,先删除该分区回收磁盘空间。
删除分区,输入参数 n修改, 输入d删除,输出删除的分区号,输入w保存修改。
创建分区,输入参数n开始创建,输入p创建主分区,输入创建分区号,输入创建分区起始节点,按回车默认,输入终止节点,可以输入分区大小来自动计算终止节点,输入w保存修改
详细操作记录
1. Command (m for help):n
2. Command action
3. e extended *//输入e为创建扩展分区*
4. p primary partition (1-4) *//输入p为创建逻辑分区*
5. p
6. Partion number(1-4):1 *//在这里输入l,就进入划分逻辑分区阶段了;*
7. First cylinder (51-125, default 51): *//注:这个就是分区的Start 值;这里最好直接按回车,如果您输入了一个非默认的数字,会造成空间浪费;*
8. Using default value 51
9. Last cylinder or +size or +sizeM or +sizeK (51-125, default 125): +800G #注:这个是定义分区大小的,+200M 就是大小为200M ;当然您也可以根据p提示的单位cylinder的大小来算,然后来指定 End的数值。回头看看是怎么算的;还是用+200M这个办法来添加,这样能直观一点。如果您想添加一个10G左右大小的分区,请输入 +10000M ;
10.
11. Command (m for help): w *//最后输入w回车保存。*
分区创建完成之后需要格式化,格式化分区为文件系统
mkfs.ext3 /dev/sdb2
移动egs内容
方案一操作记录
备份/opt/asr/kaldi/egs目录到/data
使用 cp 命令复制时, 记得带上 -p 参数, 保留文件权限设置. 使用 root 权限, 假设目标目录为 /asr_egs :
# cp -p -r /opt/asr/kaldi/egs /data
删除原目录内容
rm -rvf /opt/asr/kaldi/egs/*
挂载/dev/sdb2 目录到/opt/asr/kaldi/egs。
# mount /dev/sdb2 /opt/asr/kaldi/egs
然后把/data/egs内容剪切到/egs目录下
# move /data/egs/* /opt/asr/kaldi/egs
验证挂载效果
# cd /opt/asr/kaldi/egs
# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/sdb2 296G 42G 240G 15% /new_disk
方案二操作记录
新建/asr_egs目录,将分区/dev/sdb4挂载到/asr_egs
# mkdir /asr_egs
# mount /dev/sdb4 /asr_egs
使用 cp 命令复制时, 记得带上 -p 参数, 保留文件权限设置. 使用 root 权限, 假设目标目录为 /asr_egs :
# cp -p -r /opt/asr/kaldi/egs /asr_egs
删除原目录内容
rm -rvf /opt/asr/kaldi/egs/*
挂载/asr_egs/egs目录到/opt/asr/kaldi/egs。
# mount --bind /asr_egs/egs /opt/asr/kaldi/egs
验证挂载效果
# cd /opt/asr/kaldi/egs
# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/xvdb1 296G 42G 240G 15% /new_disk
持久化
防止机器重启挂载信息丢失。将挂载信息写入 /etc/fstab
文件,挂载永久生效。
第一种挂载方案:mount 方式挂载 写入内容
/dev/sdb2 /opt/asr/kaldi/egs ext3 defaults 0 0
第二种方案:mount --bind 绑定式挂载写入内容
/asr_egs/egs /opt/asr/kaldi/egs none bind 0 0
以上操作完成/opt/asr/kaldi/egs 目录更换文件系统。
总结
查看当前目录挂载情况
# cd dir_name
# df -l .
查看当前目录大小
# cd dir_name
# du -sh #查看文件夹大小
# du -h #递归查看文件夹大小
查看磁盘分区和使用大小
# fdisk -l
查看磁盘占用空间
# df -l
或
# df -h
分区挂载目录和卸载目录
mount /dev/sdb3 /dir_name #/dir_name原始内容不可用,新挂载目录为空
umount /dir_name #卸载后,/dir_name原始内容都在
绑定式挂载将已经存在目录挂载到另一目录
mount --bind /some/a /else/b #目录a挂载到b,b原始内容不可用,b拥有a相同,对a修改同时b也会同步发生修改
umount /else/b #卸载挂载点a,b原始内容恢复
查看挂载
# mount
一个分区挂载载一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。对于其他操作系统建立的文件系统的挂载也是这样,卸载后,目录以前的文件都还在,不会有任何丢失.
一个分区可以挂载多个目录,但反过来一个目录只能是一个分区的挂载点
绑定式挂载 mount --bind /some/a /else/b 修改在a或者b都可以,但是执行一般在b执行。
参考
https://www.cnblogs.com/sunsky303/p/12845022.html:较详细
https://segmentfault.com/a/1190000014282921:较简洁