2016年10月

UBNT的稳定性一直不错,特别是3.6.1的版本,最新的4.0.4大数据传输后,第二天老死机,连接不上。此文就针对3.6.1进行讲解怎么分离固件和最终生成固件。

1、下载​SDK.UBNT.v3.6.1.4873.tar.bz2,进行解压

tar xvf​​SDK.UBNT.v3.6.1.4873.tar.bz2

2、进入​./apps/gpl/mkfwimage/src,运行make,生成mkfwimage、fwsplit。

​mkfwimage: 用于创建固件的格式,包含kernel、cramfs(rootfs)、RedBoot;

​fwsplit:用于分离固件,把固件进行逆向操作,得到固件各分区的内容。

​3、进入./kernel/linux-kernel-2.4/scripts/squashfs,运行make,生成mksquashfs。
mksquashfs:用于创建rootfs分区的格式文件;

但还缺少解压squashfs格式的程序,这个好办,只要apt-get install squashfs 就可以安装最新的squashfs程序包,用unsquashfs 命令,进行解压操作。

4、mkfwimage、fwsplit、mksquashfs、unsquashfs 四大工具都备齐,就可以按以下操作,进行固件的分离、解压、修改、再合并生成固件。

4.1、固件的分离

fwsplit NanoStation2-v3.6.1.build4866.bin

将得到NS2.ar2316.v3.6.1.4866.110330.1244.cramfs、NS2.ar2316.v3.6.1.4866.110330.1244.kernel、
​​​​NS2.ar2316.v3.6.1.4866.110330.1244.RedBoot和NS2.ar2316.v3.6.1.4866.110330.1244.txt 四个文件,其中前三个为分区文件,最后一个记录固件的分区位置。

4.2、​NS2.ar2316.v3.6.1.4866.110330.1244.cramfs就是rootfs系统,且为squashfs文件格式。用unsquashfs命令,进行解压,就可以看到root目录下的一切。

4.3、接下来就按自己的需求添加程序、修改配置,就不多说了。

4.4、把修改好的root​​目录,进行打包,参数参照./rootfs/create_image.sh:

​# finally make the image

${MKSQUASHFS} ${stagingdir} $img -be -all-root -noappend

chmod 755 $img

这样就生成了rootfs分区数据。

4.5、​修改NS2.ar2316.v3.6.1.4866.110330.1244.txt,把NS2.ar2316.v3.6.1.4866.110330.1244.cramfs
,替换成新生成的rootfs分区文件名。

4.6、合并​各分区,生成固件,参照./rootfs/Makefile:

$(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER_LS) -o ${VER_LS}$${LAYOUT_SUFFIX}.bin;​

​这里的$${FW_INFOFILE},指代的就是NS2.ar2316.v3.6.1.4866.110330.1244.txt配置文件;$(VER_LS),指代的是“NS2.ar2316.v3.6.1.4866.110330.1244”字符串,最后一个就是生成的固件名称。

PS:这样生成的固件头为“OPEN”字符串,可以对​​mkfwimage程序进行修改,把"OPEN"替换成“UBNT”,这样生成的固件头就和官方的更一致了。

最后送上修改好的固件:​https://pan.baidu.com/s/1miprlES

这个一个简单的EXCEL透视表处理工具,批量将透视表数据转换成完整的记录行,方便数据的二次使用。

微信图片_20220819162216.png

基于vba宏编写,打开运行,需要启用宏,才能正常工作。

微信图片_20220819164549.png

处理代码如下:

Sub copy_Click()
'
' copy_Click 宏
'
' 快捷键: Ctrl+r
'
'定义 起始和结束单元变量
Dim start_range, end_range As String

'对起始和结束单元单元格进行赋值,取A4和B4的值
start_range = Range("A4").Value
end_range = Range("B4").Value

'定义 4个行列偏移量,相对于A1单元
Dim c1, r1, c2, r2 As Long
c1 = Range(start_range).Column - 1
r1 = Range(start_range).Row - 1
c2 = Range(end_range).Column - 1
r2 = Range(end_range).Row - 1

'行循环,从起始行到结束行
For i = r1 To r2

    '列循环,从起始列到结束列
    For j = c1 To c2
    
         '当本行单元格内容为空,且上行单元格不为空时,将上行单元格赋值到本行单元格
         If Range("A1").Offset(i, j) = "" And Range("A1").Offset(i - 1, j) <> "" Then
         
        '    Range("A1").Offset(i, j).Select
            Range("A1").Offset(i, j) = Range("A1").Offset(i - 1, j)
         End If
         
    '相当于 j++
    Next j
    
'相当于 i++
Next i

'操作完成输出提示,对话框
MsgBox ("已整理完毕!")

End Sub

范例下载