Extensions hosted outside of the Chrome Web Store can only be installed by Linux users. This article describes how to package, host, and update .crx
files from a personal server. If distributing an extension or theme solely through theChrome Web Store, consult Webstore Hosting and Updating.
在指定的页面中阻止WordPress插入额外换行
众所周知WordPress
会对编辑器里的内容再格式化一遍,比如自动分段。但有些时候这些添加的格式反而也会让人很头疼。最近遇到WordPress
在input
,select
,pre
前会插入额外的换行即<br>
,从而破坏页面样式的问题。
内存带宽简单介绍
内存,作为影响现代计算机性能至关重要的部件,最重要的指标有两个,分别是容量和带宽,而容量一般都很好理解,比如1G、2G,这也是大多数人对内存的最直观认识。更多关于内存的相关知识介绍,网上有一篇很好的文章“千丝万缕的联系 DDR1-3和GDDR1-5全解析”,所以这里也不打算多讲理论,还是来点更工程性的东西,或者说更实际点的。
以“KVR1333D3N9/2G”为例,这就包含有几个信息:产商为金士顿(KVR)、等效频率为1333MHz、传输类型为DDR3(D3)、容量2G。SDR内存和DDR内存的数据总线位宽都为64bit,所以等效频率为1333的内存带宽为1333MHz*64bit/8=10.664GB/s(注意:这里的G等于1000*1000*1000,而非1024*1024*1024)。这个公式应该很好理解:也就是一次传输64bit,一秒传输1333M次,所以一秒的总传输量(也就是带宽)就等于1333M*64。
对于双通道或三通道,可以简单的类比理解为,以前单通道是一根管子(内存控制器)放水,而双通道或三通道是两根或三根管子放水,所以放水量(内存带宽)成倍增长,当然这需要机器(以前是需要主板支持,更具体点是北桥芯片,但在Nehalem架构集成内存控制器后,就需要CPU来支持)对双通道或三通道的支持(即主板或cpu有两个或三个内存控制器,并且各个内存控制器相互独立工作),那么相应的,系统总内存带宽就能达到10.664GB/s*2=21.328GB/s或10.664GB/s*3=31.992GB/s。
32GB/s是1333内存三通道情况下的理论带宽,而实际带宽还与其它东西相关联,比如Intel Xeon E5504 CPU,虽然支持三通道,但其支持的最高频内存只是DDR3 800,所以即便是在Xeon E5504的机器上安装DDR3 1333的内存也并没有什么益处,因为DDR3 1333会被自动降频到800来使用,所能达到的最大内存带宽也就只有19.2GB/s。
[root@localhost lenky]# cat /proc/cpuinfo | grep "model name" | uniq model name : Intel(R) Xeon(R) CPU E5504 @ 2.00GHz [root@localhost lenky]# dmidecode -t 16 # dmidecode 2.9 SMBIOS 2.6 present. Handle 0x002B, DMI type 16, 15 bytes Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 192 GB Error Information Handle: Not Provided Number Of Devices: 6 Handle 0x0039, DMI type 16, 15 bytes Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 192 GB Error Information Handle: Not Provided Number Of Devices: 6
将上面信息对照链接http://www3.intel.com/cd/channel/reseller/asmo-na/eng/products/server/processors/5500/feature/410125.htm中的表格:
Usage | Workloads | Memory Frequency | Max B/W | Recommended # of DIMMs per Channel | Max DIMMs2 | Max Capacity3 |
Maximum bandwidth | HPC | 1333 MHz | 32 GB/s | 1 | 6 | 48GB |
General purpose | Various apps | 1066 MHz | 25.5 GB/s | 2 | 12 | 96GB |
Maximum capacity | Virtualized platforms | 800 MHz | 19.2 GB/s | 2 QRO RDIMM 16GB | 12 | 192GB |
3 SR/DR RDIMM 8GB | 18 | 144GB |
可以看到匹配在800 MHz(Memory Frequency)/12(Max DIMMs)/192GB(Max Capacity)这一行,也即当前内存工作频率为800MHz。另外,对照Xeon E5504 CPU的Intel官方内存规格说明:
Memory Specifications | |
Max Memory Size (dependent on memory type)
|
144 GB |
Memory Types
|
DDR3 800 |
# of Memory Channels
|
3 |
Max Memory Bandwidth
|
19.2 GB/s |
Physical Address Extensions
|
40-bit |
ECC Memory Supported
|
Yes |
虽然最大内存容量标注为144GB,但其括号内已注明这个依赖于内存类型,而且144GB也是800MHz所对应的内存最大容量,所以并没有问题;支持三通道;最大带宽为19.2 GB/s;支持ECC内存校验。
另外的,Linux下可利用如下命令查看内存安插的情况,几个重要字段分别为:Data Width: 64 bits(数据总线位宽)、Size: 1024 MB(插槽上的内存容量为1G)、Speed: 1333 MHz (0.8 ns)(等效频率为1333MHz):
[root@localhost lenky]# dmidecode -t 17 # dmidecode 2.9 SMBIOS 2.6 present. Handle 0x002D, DMI type 17, 28 bytes Memory Device Array Handle: 0x002B Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: DIMM0 Bank Locator: BANK0 Type: Other Type Detail: Other Speed: 1333 MHz (0.8 ns) Manufacturer: Manufacturer00 Serial Number: SerNum00 Asset Tag: AssetTagNum0 Part Number: ModulePartNumber00 Handle 0x0031, DMI type 17, 28 bytes Memory Device Array Handle: 0x002B Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 1024 MB Form Factor: DIMM Set: None Locator: DIMM2 Bank Locator: BANK2 Type: Other Type Detail: Other Speed: 1333 MHz (0.8 ns) Manufacturer: Manufacturer02 Serial Number: 00000000 Asset Tag: AssetTagNum2 Part Number: ...
参考链接
网页自动填充工具
ubuntu 16.04(x64)编译LimeSDR v1.4的USB固件
最近在捣鼓LimeSDR
,如果只使用USB
供电的话,默认USB
固件只向系统声明了400MA
的电流。
明显当设备全功率运行的话,是不够设备使用的,全功率大约是3W
以上的样子,因此,我们需要调整USB
固件,向系统多申请些电流。
USB 3.0
可以提供900MA
的电流。
下面是如何编译LimeSDR
的USB
固件:
$ cd ~ $ wget http://www.mobibrw.com/wp-content/uploads/2018/02/FX3_SDK_Linux_v1.3.3.tar.gz $ tar -zxvf FX3_SDK_Linux_v1.3.3.tar.gz $ tar -zxvf ARM_GCC.tar.gz $ tar -zxvf fx3_firmware_linux.tar.gz $ tar -zxvf eclipse_x64.tar.gz $ export PATH=~/arm-2013.11/bin:$PATH $ export FX3_INSTALL_PATH=~/cyfx3sdk $ export ARMGCC_INSTALL_PATH=~/arm-2013.11 $ export ARMGCC_VERSION=4.8.1 #编译镜像打包工具 $ cd ~/cyfx3sdk/util/elf2img $ gcc elf2img.c -o elf2img -Wall $ cd ~ $ git clone https://github.com/myriadrf/LimeSDR-USB_FX3.git $ ./eclipse/ezUsbSuite
MCC 移动设备国家代码 (Mobile country code)
概述
移动设备国家代码 ( Mobile country code / MCC ) 定义于国际电信联盟 E.212 ,其目的为在电信网络中辨识用移动设备基地,特别是在全球移动通信系统和通用移动通信系统中。移动设备国家代码通常和移动设备网络代码结合使用(MCC/MNC)以用来辨试网络营运商。
移动设备国家代码是国际移动用户识别码的一部分。此识别码是用来辨认特定的用户,通常存储于可移除的SIM卡。在 GSM/UMTS 无线调制解调器中可用 AT 指令 AT+COPS 来得到目前的国家代码。
ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境
操作系统调整
参考 ubuntu 16.04低延迟内核 安装低延时内核CPU
调整为最大性能模式,并且不允许降低频率。
$ sudo apt-get install cpufrequtils $ sudo touch /etc/default/cpufrequtils $ sudo sed -i "/GOVERNOR.*/d" /etc/default/cpufrequtils $ test -s /etc/default/cpufrequtils && sudo sed -i '$a\GOVERNOR=\"performance\"' /etc/default/cpufrequtils || echo "GOVERNOR=\"performance\"" | sudo tee /etc/default/cpufrequtils $ sudo update-rc.d ondemand disable $ sudo reboot
安装依赖包
$ sudo apt-get install cmake g++ libpython-dev python-numpy swig git libsqlite3-dev libi2c-dev libusb-1.0-0-dev libwxgtk3.0-dev freeglut3-dev
编译安装SoapySDR
$ cd ~ $ git clone https://github.com/pothosware/SoapySDR.git $ cd SoapySDR $ git pull origin master $ mkdir build && cd build $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig
编译安装LimeSDR
$ cd ~ $ git clone https://github.com/myriadrf/LimeSuite.git $ cd LimeSuite #目前的测试发现,超过这个版本的代码无法正常的发出信号, #也就是手机搜索不到我们创建好的基站, #反复研究,确认是“Commit 9883bb97 by ignasj, 2017-06-30 下午04:20” #对于“lms7_device.cpp”的修改导致的问题,原因为天线发射增益设置不正确 #解决方法参考 https://www.mobibrw.com/?p=11957 #截止目前2018.09.03版本的代码貌似已经修正这个问题了,应该已经可以正常使用了。 #测试来说,还是使用这个版本吧 $ git checkout v17.06.0 # 不可删除build目录,清理build目录后要还原被误删除的文件, # 原因在于build目录下存在mcu程序,默认应用启动后从这个目录提取mcu程序刷新到设备 $ mkdir build ; cd build # cmake -DCMAKE_BUILD_TYPE=Debug .. $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig $ cd ../udev-rules/ $ sudo bash install.sh # Download board firmware $ sudo LimeUtil --update #固件下载地址 http://downloads.myriadrf.org/project/limesuite/ #如果上述的固件无法下载,可以从此处下载一份拷贝 #http://www.mobibrw.com/wp-content/uploads/2018/03/17.06-LimeUtils-fpga-fw.zip
编译安装USRP
驱动
$ sudo apt-get install libboost-all-dev libusb-1.0-0-dev python-mako doxygen python-docutils python-requests cmake build-essential $ cd ~ $ git clone git://github.com/EttusResearch/uhd.git $ cd uhd; mkdir host/build; cd host/build $ cmake -DCMAKE_INSTALL_PREFIX=/usr .. $ make -j4 $ sudo make install $ sudo ldconfig #下面脚本的作用是到http://files.ettus.com/binaries/images/下载最新的镜像文件,并解压缩到 /usr/share/uhd/images目录下 $ sudo /usr/lib/uhd/utils/uhd_images_downloader.py #如果上面的镜像下载失败,可以尝试执行如下命令从本站下载 # cd ~ ; wget http://www.mobibrw.com/wp-content/uploads/2018/03/uhd-images_003.010.003.000-release.zip # sudo unzip uhd-images_003.010.003.000-release.zip -d /user
下载并解压缩需要的补丁,点击此处下载
$ cd ~ # 原始补丁地址 http://open-cells.com/d5138782a8739209ec5760865b1e53b0/opencells-mods-20170710.tgz $ wget http://www.mobibrw.com/wp-content/uploads/2018/03/opencells-mods-20170710.tgz $ tar xf opencells-mods-20170710.tgz
下载并编译eNB
$ cd ~ $ git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git $ cd openairinterface5g $ git checkout develop #目前的补丁程序只在这个版本上是有效的,后续版本会补丁失败 $ git checkout 08b8b3142df16831396a5283a015564ff56bf91c -b ubuntu16 #应用补丁 $ git apply ../opencells-mods/eNB.patch #对于国内的用户来说,国外的几个代码地址需要修改一下,否则会出现无法下载或者下载非常慢的情况 $ sed -i "s/git clone https:\/\/gist.github.com\/2190472.git \/opt\/ssh/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/ssh.tar.gz \&\& sudo tar -zxvf ssh.tar.gz -C \/opt/g" cmake_targets/tools/build_helper $ sed -i "s/git clone https:\/\/gitlab.eurecom.fr\/oai\/asn1c.git \/tmp\/asn1c/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/asn1c.tar.gz \&\& tar -zxvf asn1c.tar.gz -C \/tmp/g" cmake_targets/tools/build_helper $ sed -i "s/https:\/\/pypi.python.org\/packages\/18\/fa\/dd13d4910aea339c0bb87d2b3838d8fd923c11869b1f6e741dbd0ff3bc00\/netifaces-0.10.4.tar.gz/https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/netifaces-0.10.4.tar.gz/g" cmake_targets/tools/build_helper $ sed -i "s/https:\/\/github.com\/google\/protobuf\/releases\/download\/v2.6.1\/protobuf-2.6.1.tar.gz/https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/protobuf-2.6.1.tar.gz/g" cmake_targets/tools/build_helper $ sed -i "s/git clone https:\/\/github.com\/protobuf-c\/protobuf-c.git/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/protobuf-c.tar.gz \&\& tar -zxvf protobuf-c.tar.gz/g" cmake_targets/tools/build_helper $ sed -i "s/http:\/\/mirrors.dotsrc.org\/gcrypt\/gnutls\/v3.1\/gnutls-3.1.23.tar.xz/https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/gnutls-3.1.23.tar.xz/g" cmake_targets/tools/build_helper $ sed -i "s/https:\/\/ftp.gnu.org\/gnu\/nettle\/nettle-2.5.tar.gz/https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/nettle-2.5.tar.gz/g" cmake_targets/tools/build_helper #修正兼容问题,更高版本的protobuf-c跟我们上面安装的版本不匹配,会导致编译错误 $ sed -i "s/cd protobuf-c/cd protobuf-c \&\& git checkout 2a46af42784abf86804d536f6e0122d47cfeea45/g" cmake_targets/tools/build_helper #执行编译 $ source oaienv $ ./cmake_targets/build_oai -I # install SW packages from internet # ./cmake_targets/build_oai -w USRP --eNB # compile eNB # 注意如果后续重新编译过limesdr的驱动,这部分也需要重新编译 $ ./cmake_targets/build_oai -c -w LMSSDR --eNB
下载并编译EPC
(核心网)
$ git clone https://gitlab.eurecom.fr/oai/openair-cn.git $ cd openair-cn $ git checkout develop $ git checkout 724542d0b59797b010af8c5df15af7f669c1e838 -b ubuntu16 #应用补丁 $ git apply ../opencells-mods/EPC.patch #对于国内的用户来说,国外的几个代码地址需要修改一下,否则会出现无法下载或者下载非常慢的情况 $ sed -i "s/git clone https:\/\/gitlab.eurecom.fr\/oai\/freediameter.git -b eurecom-1.2.0/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/freediameter.tar.gz \&\& tar -zxvf freediameter.tar.gz \&\& cd freediameter \&\& git checkout eurecom-1.2.0 \&\& cd ../g" build/tools/build_helper $ source oaienv; cd scripts #安装依赖的软件,库 $ ./build_hss -i # Do you want to install freeDiameter 1.2.0 ?<y/N>: yes # 其他具体情况自行处理 #对于国内的用户来说,国外的几个代码地址需要修改一下,否则会出现无法下载或者下载非常慢的情况 $ sed -i "s/git clone git:\/\/git.osmocom.org\/libgtpnl/wget https:\/\/www.mobibrw.com\/wp-content\/uploads\/2018\/03\/libgtpnl.tar.gz \&\& tar -zxvf libgtpnl.tar.gz/g" ../build/tools/build_helper #Install 3PP SW for mme and spgw $ ./build_mme -i # Do you want to install freeDiameter 1.2.0 ?<y/N>: no # Do you want to install asn1c rev 1516 patched? <y/N>: no # Do you want to install libgtpnl ? <y/N>: yes # 其他具体情况自行处理 $ ./build_spgw -i # Do you want to install libgtpnl ? <y/N>: no #调整mme的编译模板,默认情况下mme编译出来的是Debug版本, #但是这会触发"src/gtpv2-c/nwgtpv2c-0.11/src/NwGtpv2c.c"的断言异常 #”mme: ~/openair-cn/src/gtpv2-c/nwgtpv2c-0.11/src/NwGtpv2c.c:487: nwGtpv2cCreateLocalTunnel: Assertion `0' failed.“ #这个断言异常并不是大问题,直接无视即可 #因此我们把此处的编译调整为RelWithDebInfo $ sed -i "s/\"Debug\"/\"RelWithDebInfo\"/g" ../build/mme/CMakeLists.template #修正代码里面的几处问题 $ sed -i "s/while 0/while (0)/g" ../src/utils/log.h $ sed -i 's/char[ \t]*pid_dec\[32]/char pid_dec\[128]/g' ../src/utils/pid_file.c #正式进行编译操作 $ ./build_hss -c -v $ ./build_mme -v $ ./build_spgw -v
配置EPC
# 拷贝配置文件 $ cd ~ $ sudo mkdir -p /usr/local/etc/oai $ sudo cp -rp opencells-mods/config_epc/* /usr/local/etc/oai # 生成证书文件 $ cd openair-cn; source oaienv; cd scripts $ ./check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter hss.OpenAir5G.Alliance $ ./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter mme.OpenAir5G.Alliance # 配置出口网卡的名字,这个网卡用于访问互联网的时候使用 # 如果只有一块有线网卡,并且用这块有线网卡上网,则使用如下命令即可拿到网卡名 # `ifconfig | grep "Link" | awk '{print $1}' | grep "en"` # 其他情况请根据实际情况配置网卡 $ sudo sed -i "s/PGW_INTERFACE_NAME_FOR_SGI.*/PGW_INTERFACE_NAME_FOR_SGI = \"`ifconfig | grep "Link" | awk '{print $1}' | grep "en"`\";/g" /usr/local/etc/oai/spgw.conf # 配置访问MySQL时候的密码,"/usr/local/etc/oai/hss.conf",此处假定MySQL的密码为"123" $ sudo sed -i "s/^MYSQL_pass.*/MYSQL_pass = \"123\"/g" /usr/local/etc/oai/hss.conf #导入数据库,建立表结构 $ ./hss_db_import 127.0.0.1 root 123 oai_db ~/opencells-mods/opencells_db.sql
修改我们UE
需要使用的配置文件
$ cd ~ $ cd openairinterface5g; source oaienv #配置文件为"targets/PROJECTS/GENERIC-LTE-EPC/CONF/"目录下的包含lmssdr的配置文件 $ sed -i "s/mobile_network_code.*/mobile_network_code = \"92\";/g" ./targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.lmssdr.conf $ vim ./targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.lmssdr.conf
找到:
////////// MME parameters: mme_ip_address = ( { ipv4 = "192.168.12.148"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.150/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.150/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 };
替换为:
////////// MME parameters: mme_ip_address = ( { ipv4 = "127.0.0.20"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.10/8"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.10/8"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 };
测试功能,按照顺序打开四个独立Shell
$ echo -ne "\033]0;HSS\007" $ cd ~ $ cd openair-cn; source oaienv; cd scripts; #貌似需要运行之前先清理一下数据库才行,否则可能导致设备无法入网,应该是个BUG $ ./hss_db_import 127.0.0.1 root 123 oai_db ~/opencells-mods/opencells_db.sql $ ./run_hss
$ echo -ne "\033]0;MME\007" $ cd ~ $ cd openair-cn; source oaienv; cd scripts; $ ./run_mme
$ echo -ne "\033]0;SPGW\007" $ cd ~ $ cd openair-cn; source oaienv; cd scripts; $ sudo -E ./run_spgw
$ echo -ne "\033]0;EUE\007" $ cd ~ $ cd openairinterface5g; source oaienv #配置文件为"targets/PROJECTS/GENERIC-LTE-EPC/CONF/"目录下的包含lmssdr的配置文件 #这个配置文件跟天线的接入方式直接相关,天线接入的是主板上的RX1_H,TX1_2这两个天线接口 #最后的-d 参数是启动图形界面分析流量 $ sudo -E ./cmake_targets/lte_build_oai/build/lte-softmodem -O ./targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.lmssdr.conf --rf-config-file ./targets/ARCH/LMSSDR/LimeSDR_above_1p8GHz_1v4.ini -d #如果启动之后,出现 “[PHY][E]TX : Timeout (sent 6800/7680)” 这样的红色内容,然后退出,可以多尝试几次,一般就可以恢复正常了
正常启动之后,用手机(比如华为荣耀7)搜索运营型,可以找到一个名为20892
的运营商,或者有些欧洲制式的手机可以正确的显示Eurecom
这个法国电信运营商的名字。
OpenAir, single machine Ubuntu 17.04, after major EPC update
(updated: 2017, July 10th)
Modifs since version on July 6th:
- Latest commit
- Fix lacking file in the tarball
(non modified ones since the June version were missing) - improved code pieces formating in HTML, added automatic git patch
- Full re-test, from disk install of Ubuntu 17.04 to UE throughput measurement
This document explains how to install and configure OAI EPC+eNB on one single Ubuntu 17.04 64 bits machine connected with a regular UE (a Huawei E3272), routing the UE traffic to internet.
We use EPC after a major contribution in May 2017: a lot of code has been modified, all directories names were changes, configuration parameters names/values changed.
The description uses a USRP B210 board, a Lime SDR page is provided separately.
We also explain how to simplify, fix existing issues, to make a single computer as a full LTE network: EPC+eNB.
Known limitations fixed in the hereafter description
- OAI EPC require kernel >= 4.7, so we have to use Ubuntu 17.04
- We already pushed some enhancements in OAI, nevertheless some more are required
- GTP UDP ports are in conflict for eNB and SGW
- Useless link between OAI and the Ubuntu/Linux hostname removed
- Several simplifications and precisions to make easier and reliable installations
继续阅读OpenAir, single machine Ubuntu 17.04, after major EPC update
ubuntu 16.04执行git clone时失败“RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.”
前几天从github
下载代码的时候,一直失败,提示如下:
$ git clone http://github.com/myriadrf/LimeSuite.git 正克隆到 'LimeSuite'... remote: Counting objects: 13921, done. error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received. fatal: The remote end hung up unexpectedly fatal: 过早的文件结束符(EOF) fatal: index-pack failed
如果操作系统的语言是英文的话,输出如下内容:
error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received. fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed
刚刚开始以为是由于GnuTLS
的BUG
导致的。
当时的解决方法是翻墙出去进行克隆。或者用Windows
进行克隆操作。
然而,从最近的新闻来看,更像是遭受了攻击导致的。
ubuntu 16.04系统LimeSDR使用srsLTE搭建LTE实验环境
操作系统调整
参考ubuntu 16.04低延迟内核安装低延时内核
CPU
调整为最大性能模式,并且不允许降低频率
$ sudo apt-get install cpufrequtils $ sudo touch /etc/default/cpufrequtils $ sudo sed -i "/GOVERNOR.*/d" /etc/default/cpufrequtils $ test -s /etc/default/cpufrequtils && sudo sed -i '$a\GOVERNOR=\"performance\"' /etc/default/cpufrequtils || echo "GOVERNOR=\"performance\"" | sudo tee /etc/default/cpufrequtils $ sudo update-rc.d ondemand disable $ sudo reboot
安装依赖包
$ sudo apt-get install cmake g++ libpython-dev python-numpy swig git libsqlite3-dev libi2c-dev libusb-1.0-0-dev libwxgtk3.0-dev freeglut3-dev
编译安装SoapySDR
$ cd ~ $ git clone https://github.com/pothosware/SoapySDR.git $ cd SoapySDR $ git pull origin master $ mkdir build && cd build $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig
编译安装LimeSDR
$ cd ~ $ git clone https://github.com/myriadrf/LimeSuite.git $ cd LimeSuite # 再次更新一下,确保代码到最新 $ git pull # 不可删除build目录,清理build目录后要还原被误删除的文件, # 原因在于build目录下存在mcu程序,默认应用启动后从这个目录提取mcu程序刷新到设备 $ mkdir build ; cd build # cmake -DCMAKE_BUILD_TYPE=Debug .. $ cmake .. $ make -j4 $ sudo make install $ sudo ldconfig $ cd ../udev-rules/ $ sudo ./install.sh # Download board firmware $ sudo LimeUtil --update
编译安装srsGUI
$ cd ~ # srsGUI提供了一个软件示波器的功能,我们可以比较直观的观察到波形信息 $ git clone https://github.com/srsLTE/srsGUI.git $ cd srsGUI # 再次更新一下,确保代码到最新 $ git pull $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig
编译安装srsLTE
$ sudo apt-get install git cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libboost-thread-dev libconfig++-dev libsctp-dev
$ cd ~ $ git clone https://github.com/srsLTE/srsLTE.git $ cd srsLTE # 再次更新一下,确保代码到最新 $ git pull # 目前(2018.05.04)以及之前的代码中srsenb/src/upper/rrc.cc文件中 # uint32_t rrc::generate_sibs() 函数中存在一个数组越界问题, # 已经提交patch ,具体修改 # 参看https://github.com/srsLTE/srsLTE/pull/173 # 调用LimeSDR设备的代码在 lib/src/phy/rf/rf_soapy_imp.c 文件中 # 这个文件中默认的接收天线是"LNAH",默认的发送天线是"BAND1",需要根据实际情况 # 也就是自己天线接入的接口是哪个,就修改成哪个。 # 调整这里的参数,目前是直接修改代码。比如我这边的发送天线就修改为"BAND2" $ mkdir build $ cd build # cmake -DCMAKE_BUILD_TYPE=Debug .. $ cmake ../ $ make $ make test
测试
$ cd ~/srsLTE $ cd build/lib/examples #以20M带宽的形式进行基站的扫描,LTE基站带宽20M,目前版本测试不支持,无法扫描到基站 # ./cell_search -b 20 #目前测试仅支持此命令的运行 $ ./pdsch_enodeb
搭建LTE
测试环境
$ cd ~/srsLTE $ mkdir lteCell $ cd lteCell # 生成配置文件 $ mkdir lteENB $ cp ../srsenb/enb.conf.example lteENB/enb.conf $ cp ../srsenb/rr.conf.example lteENB/rr.conf $ cp ../srsenb/sib.conf.example lteENB/sib.conf $ cp ../srsenb/drb.conf.example lteENB/drb.conf $ mkdir lteEPC $ cp ../srsepc/epc.conf.example lteEPC/epc.conf $ cp ../srsepc/user_db.csv.example lteEPC/user_db.csv # 生成运行脚本 $ echo "echo -ne \"\033]0;ENB\007\"" >> run_enb.sh $ echo "cd lteENB" >> run_enb.sh # 需要gdb的话使用如下 #echo "#gdb -args ../../build/srsenb/src/srsenb enb.conf" >> run_enb.sh $ echo "../../build/srsenb/src/srsenb enb.conf" >> run_enb.sh $ echo "echo -ne \"\033]0;EPC\007\"" >> run_epc.sh $ echo "cd lteEPC" >> run_epc.sh # 需要配置如下转发规则,否则不能正常工作,配置信息参考openair-cn的SPGW中的代码 # sudo sysctl -w net.ipv4.ip_forward=1 # sudo sync # sudo iptables -t mangle -F FORWARD # sudo iptables -t nat -F POSTROUTING # export LANG=C # 如果没有修改过配置文件,则默认使用如下配置即可, # 如果修改过sgi_if_addr的地址(默认sgi_if_addr=172.16.0.1),需要更改这个字段 # export FORDING_IPs=172.16.0.0/12 # 有线网卡一般以"en"开头,比如"enp3s0",此处需要根据自身机器上的网卡进行设置,修改 # export NIC_NAME=`ls /sys/class/net | grep en` # export NIC_IP=`ifconfig $NIC_NAME | grep 'inet addr:' | awk '{print $2}' | cut -c 6-` # sudo iptables -t nat -I POSTROUTING -s $FORDING_IPs -o $NIC_NAME ! --protocol sctp -j SNAT --to-source $NIC_IP $ echo "sysctl -w net.ipv4.ip_forward=1" >> run_epc.sh $ echo "sync" >> run_epc.sh $ echo "iptables -t mangle -F FORWARD" >> run_epc.sh $ echo "iptables -t nat -F POSTROUTING" >> run_epc.sh $ echo "export LANG=C" >> run_epc.sh $ echo 'export FORDING_IPs=172.16.0.0/12' >> run_epc.sh $ echo 'export NIC_NAME=`ls /sys/class/net | grep en`' >> run_epc.sh $ echo "export NIC_IP=\\`ifconfig \$NIC_NAME | grep 'inet addr:' | awk '{print \$2}' | cut -c 6-\\`" >> run_epc.sh $ echo 'iptables -t nat -I POSTROUTING -s $FORDING_IPs -o $NIC_NAME ! --protocol sctp -j SNAT --to-source $NIC_IP' >> run_epc.sh $ echo "../../build/srsepc/src/srsepc epc.conf" >> run_epc.sh $ echo "gnome-terminal -e \"bash run_epc.sh\"" >> run.sh $ echo "sleep 2" >> run.sh $ echo "gnome-terminal -e \"bash run_enb.sh\"" >> run.sh # 运行测试 $ sudo bash run.sh #日志查看 /tmp/enb.log, /tmp/epc.log
如果设备(比如手机)的设置是按照ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境里面的设置的,设备参数如下图:
注意上图与OpenAirInterface中设置的不同之处,差别就是一个选中OPC,一个选中OP
则需要对配置文件进行如下调整:
$ cd ~/srsLTE/lteCell # 修改MNC,MCC $ sed -i -r "s/^mnc[ \t]*=[ \t0-9]*/mnc = 92/g" lteENB/enb.conf $ sed -i -r "s/^mcc[ \t]*=[ \t0-9]*/mcc = 208/g" lteENB/enb.conf $ sed -i -r "s/^tac[ \t]*=[ \t]*0x[0-9]*/tac = 0x0001/g" lteENB/enb.conf $ sed -i -r "s/^mnc[ \t]*=[ \t0-9]*/mnc = 92/g" lteEPC/epc.conf $ sed -i -r "s/^mcc[ \t]*=[ \t0-9]*/mcc = 208/g" lteEPC/epc.conf $ sed -i -r "s/^tac[ \t]*=[ \t]*0x[0-9]*/tac = 0x0001/g" lteEPC/epc.conf # 修改认证加密算法 $ sed -i -r "s/^auth_algo[ \t]*=[ \ta-Z]*/auth_algo = milenage/g" lteEPC/epc.conf # 需要软件示波器界面的话,修改 lteEPC/epc.conf 里面的 [gui]部分的enable = true # 但是打开示波器会导致CPU开销加大,降低实时性,稳定性变低 # 认证数据库中增加Name,IMSI,Key,OP,AMF,SQN 这里主要的就是IMSI,Key,OP这几个参数 # OPc=AES128(Ki,OP) XOR OP 因此需要反算 OP # openair-cn需要OPc,而 srsLTE 的epc需要 OP 这是两者的主要区别 # OPc = 504f20634f6320504f50206363500a4f # Ki = 6874736969202073796d4b2079650a73 # OP = 11111111111111111111111111111111 # 最后的 SQN 目前测试发现如果一直不能正常注册,并且提示 # "Sequence number synch failure" 则会观察到,当EPC退出时候,应用一定回写 # 成000000001b02 ,一旦出现这个数字,我们就没办法注册设备了。应该是个BUG # http://www.mobibrw.com/?p=12688 中我们持续跟进这个问题,目前猜测是要比设备最后 # 一次通信记录的数据号大就可以了,如果要复位可以让设备关机,应该就从0开始了。 $ sed -i '$a\ue3,208920100001100,6874736969202073796d4b2079650a73,11111111111111111111111111111111,8000,000000001b03' lteEPC/user_db.csv
注意目前srsLTE的CPU开销远远高于OpenAirInterface,差不多一个内核满负载,以及稳定性是低于OpenAirInterface的,经常出现连接困难以及中途掉线,这部分需要后续的持续修改。目前测试发现,在"lteEPC/epc.conf"中关闭GUI的显示,可以显著减低CPU开销,并增加稳定性,但是还是比OpenAirInterface要多消耗CPU。另外在"lteEPC/epc.conf"中日志设置成"all_level = none"也可以降低CPU开销,并且增加稳定性。
另外,注意"/tmp/enb.log",这个日志文件默认情况下,写入的比较多,文件大小增长很快,注意磁盘占用情况。
目前测试发现,使用Intel MKL加速的情况下,CPU降低并不明显,而稳定性下降非常多应该是代码的适配问题。因此,暂时不要使用Intel MKL。
目前测试发现,使用最新的FFTW3版本,使用AVX,AVX2加速的情况下,CPU开销更高,性能更差,应该是代码存在BUG。因此,暂时不要使用自己编译的FFTW3,使用系统自带的版本即可。
手机等设备的设置参考ubuntu 16.04系统LimeSDR V1.4使用OpenAirInterface搭建LTE实验环境最后的介绍。
上述的代码如果下载困难,可以从本站下载一份拷贝。
SoapySDR源代码下载
LimeSuite源代码下载
srsLTE源代码下载
srsGUI源代码下载
fftw3源代码下载