resize2fs:Memory alloction failed while trying to resize

最近入手一块 12T 的西数红盘,打算安装到 WD MyCloud Gen1 上,从 4TB 版本升级到 12TB 版本,作为 TimeMachine 来用。

使用 拯救死翘翘了的WD MyCloud 方式恢复镜像之后,最后一步执行

结果报告如下错误:

这个原因网上查询了很久,基本上断定是 e2fsprogs 1.42.5 的 BUG,这个问题在  e2fsprogs 1.42.9 版本修复。修复内容参考代码下的 debian/changelog

关键日志如下:

编译过程参考 How to successfully build packages for WD My Cloud from source 中对于 e2fsprogs 1.42.13 的编译。

参考链接


WD MyCloud编译golang/git-lfs

按照How to successfully build packages for WD My Cloud from source中的介绍,搭建完成WDMyCloud的编译环境

整个 WD MyCloud 的编译项目,可以直接在树莓派中进行编译。只是编译4KB分页(主要用于编译过程)的高版本应用的时候,需要在 raspbian-wheezy 系统中进行编译。

在树莓派中编译 WD MyCloud 代码的时候,由于都是 ARM 环境,因此,不需要 QEMU 的介入,以前由于 QEMU 导致的问题可以规避。

推荐在树莓派4B版本上搭建编译环境,效果来看,速度还是不错的。

这个问题产生的原因是在qemu中创建线程/进程的时候,要求增加CLONE_SYSVSEM标志,否则会出现异常。 go在创建线程/进程的时候,没有指定这个标记。解决方法就是修改src/pkg/runtime/os_linux.c中的void runtime·newosproc(M *mp, void *stk)函数,在flag中增加CLONE_SYSVSEM标志。

这个问题解决起来比较复杂,我们在x86下面直接进行交叉编译的时候,是没办法通过编译的,我们可以通过树莓派下进行编译。树莓派使用2015-05-05-raspbian-wheezy版本的镜像来进行编译。

树莓派这个版本的系统问题在于  wheezy  的源已经被移动地址,因此更新安装软件的时候会报告 404  错误,我们需要手工修改一下源地址。

安装编译依赖

下载并编译代码

完成之后,拷贝到编译环境中并执行安装

继续编译,报告如下错误信息:

这个问题产生的原因是在qemu中无法处理编号为 64 的信号(Qemu rejects rt_sigaction of SIGRTMAX (64).),我们需要忽略这个信号。解决方法就是修改src/pkg/runtime/os_linux.c中的void
runtime·setsig(int32 i, GoSighandler *fn, bool restart)
函数,忽略这个信号。

完成之后,拷贝到编译环境中并执行安装

编译环境安装完成之后,可以成功编译golang-1.3.3,中途可能会失败,失败之后,重新编译可以通过。

编译 golang-1.4 ,由于 golang-1.4 的特殊性,任何高于 golang-1.4 版本的 golang ,都需要 golang-1.4 的编译环境才能开始编译安装!
我们依旧需要在树莓派环境中 raspbian-wheezy && WD MyCloud 编译,如下:

完成之后,拷贝到编译环境中并执行安装


我们需要在 golang 1.4.3 环境中继续编译,可以在 golang 1.3.3 中运行:


可以本站下载:
golang_1.3.3-1deb8u2.dsc
golang_1.3.3-1+deb8u2.debian.tar.xz
golang_1.3.3.orig.tar.gz
修改完BUG之后编译好的 golang_1.3.3-1.deb(4KB分页)/golang_1.4.3-3.deb(4KB分页)用于编译环境使用,不能在WD MyCloud上使用。

参考链接


基于APC BK650-CH UPS连接群晖DS718+通过NUT(Network UPS Tools)实现WDMyCloud Gen1断电自动关机

最近新入手了 群晖 DS718+,鉴于群晖断电容易损坏硬盘的传说,为了保证设备的安全,特别购入了 APC BK650-CH UPS

APC BK650-CH UPS 有多个电源插槽,可以同时为多个设备提供断电保护,但是 APC BK650-CH UPS 只有一个 USB 设备接口,这个接口用来提供电源状态信息,比如是否断电,当前电量信息等数据。这就造成收到断电通知的只能有一个设备,这个设备必须通过网络通知其他设备,才能实现全部的断电通知。

继续阅读基于APC BK650-CH UPS连接群晖DS718+通过NUT(Network UPS Tools)实现WDMyCloud Gen1断电自动关机

软件磁盘阵列(RAID)

RAID软件磁盘阵列

RAID 即廉价磁盘冗余阵列,其高可用性和可靠性适用于大规模环境中,相比正常使用,数据更需要被保护。RAID 是将多个磁盘整合的大磁盘,不仅具有存储功能,同时还有数据保护功能.

软件磁盘整列通过mdadm命令创建.

RAID等级

  • RAID-0: 等量模式,stripe,性能较佳,磁盘利用率100%
  • RAID-1: 镜像模式,mirror,安全性较佳,磁盘利用率50%
  • RAID-0+1: 先组成RAID-0,再有RAID-0组成RAID-1 性能安全兼顾,磁盘利用率50%
  • RAID-1+0:先组成RAID-1,再有RAID-1组成RAID-0  性能安全兼顾,磁盘利用率50%
  • RAID-5: 等量模式与分布式奇偶校验,性能与安全份均衡,磁盘可用量等于n-1
  • RAID-6: 等量模式与双分布式奇偶校验,性能与安全均衡,磁盘可用量等于n-2

继续阅读软件磁盘阵列(RAID)

利用rsync断点续传scp中断的文件传输

服务器经常需要备份,但是长时间的下载,难免会出现下载中断的情况。

一直使用scp下载备份好的文件,以前数据量少的时候,直接重新下载就可以了。随着网站上数据越来越多,下载的时间越来越长,完全重新开始变得不现实了。有时候下载到90%以上的时候,失败了,完全重传是没有必要的。

我们只需要下载缺失的部分就好了,幸运的是rsync支持这种需求。

具体的做法是将如下的选项组合传递给rsync-checksum(文件分块计算校验和,只传输校验和不一致的部分),-in-place(将文件原地替换,因为rsync通常会写一个临时文件,然后移动)和-no-whole-file(告诉rsync不要复制整个文件,而是使用deltas(部分传输))。

例如:

下面是一个真实的例子:

整个过程非常的快,比完全重传快多了。

scp命令拷贝文件非常好用,但在拷贝大文件时存在一个问题就是连接经常会断开,此时再使用scp进行拷贝会重新拷贝文件,为了解决这个问题。我们可以使用rsync命令来进行断点续传。命令如下:

为了使用方便可以设置alias:

参考链接


WD MyCloud编译git-2.19

目前,能编译通过,但是安装的时候,依赖关系不正确,估计还是需要继续调整编译配置文件才行。
1.按照How to successfully build packages for WD My Cloud from source中的介绍,搭建完成WDMyCloud的编译环境2.从高版本Debian源里下载git-2.19的源代码包,然后手工编译,如下:

如果出现如下错误信息:

原因是低版本的系统上缺少几个无关紧要的文件,直接忽略这部分即可:

如果出现如下错误信息:

原因为dpkg的版本太低,导致部分命令无法正确执行,执行如下命令即可:

 

如果上述源代码的下载存在问题,可以本站下载一份文件拷贝:

git_2.19.1+next.20181026.orig.tar

git_2.19.1+next.20181026-1.debian.tar

参考链接


WD MyCloud编译的busybox-1.23.2中增加e2fsprogs-1.43.7

参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出来的镜像中缺少mkfs.ext3,mkfs.ext4,无法创建GPT分区,我们在此介绍一下如何增加mkfs.ext3,mkfs.ext4的功能。

首先参考Ubuntu 17.10上使用crosstool-ng-1.23.0建立WD MyCloud修复工具编译环境(uClibc)创建我们需要的编译工具。

接着参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出启动镜像。

具体编译过程如下:

重新打包uImage镜像

如果e2fsprogs-1.43.7的源代码不能下载,可从本站下载一份代码拷贝。点击这里下载

参考链接


WD MyCloud编译的busybox-1.23.2中增加mdadm-3.2.6(独立编译uClibc版本)

参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出来的镜像中缺少mdadm,无法创建Raid-1分区,我们在此介绍一下如何增加mdadm-3.2.6的功能。

首先参考Ubuntu 17.10上使用crosstool-ng-1.23.0建立WD MyCloud修复工具编译环境(uClibc)创建我们需要的编译工具。

接着参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出启动镜像。

具体编译过程如下:

重新打包uImage镜像

其他操作参照更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)

参考链接


WD MyCloud编译的busybox-1.23.2中增加parted-3.0/parted-2.3

参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出来的镜像中缺少parted,无法创建GPT分区,我们在此介绍一下如何增加parted-3.0/parted-2.3的功能。

首先参考Ubuntu 17.10上使用crosstool-ng-1.23.0建立WD MyCloud修复工具编译环境(uClibc)创建我们需要的编译工具。

接着参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)配置编译出启动镜像。

然后下载并编译libuuid-1.0.3的源代码

然后下载并编译parted-3.0/parted-2.3的源代码

完成后,打包我们刚刚构建的应用

重新打包uImage镜像

其他操作参照更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)

上面涉及到的源代码,如果不能下载成功,可以从本站下载一份代码拷贝。点击这里下载libuuid-1.0.3点击这里下载parted-2.3, 点击这里下载parted-3.0

参考链接


Building a minimal RootFS with Busybox, GLIBC and DropBear

Ubuntu 17.10上使用crosstool-ng-1.23.0建立WD MyCloud修复工具编译环境(uClibc)

参考更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)编译出来的Busybox是只有3MB大小的样子,这样编译出来的东西非常基础,功能有限。如果想要增加其他软件的时候,最少改动的情况下,一般都依赖GLIBC,而GLIBC完整编译出来的库接近50MB,而我们修复系统,是一个纯内存文件系统。直接采用GLIBC会非常浪费不多的内存空间。

因此在低内存的系统上采用uClibc,变成一个不错的选择。下面我们讲一下如何通过crosstool-ng-1.23.0构建一个我们需要的编译系统出来。

首先编译crosstool-ng-1.23.0源代码

如果下载crosstool-ng源代码存在问题,可以从本站下载一份代码拷贝。点击此处下载

最终的.config文件,可以参考下面的配置信息,或者简单的拷贝这个文件到编译目录即可

最终在如下目录生成我们需要的编译程序

编译过程中的源代码下载可能会非常缓慢,可以从本站下载一份代码的拷贝。点击这里下载。下载完成后,解压缩到当前用户根目录,编译的时候,会自动使用已经下载的文件。可以使用下面的命令进行下载解压缩操作:

如果懒得编译,也可点击这里下载一份已经编译好的编译工具

参考链接