分类: Ubuntu
Ubuntu(友邦拓,网友也喜欢称之为“乌班图”)是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想.
Ubuntu 17.10/18.04使用内置指纹识别(联想T440内置Synaptics Validity Sensors)
最近想在自己的联想T440
机器上启用内置的指纹识别,具体的执行命令如下:
1 2 3 4 5 6 7 8 9 |
$ sudo add-apt-repository ppa:fingerprint/fingerprint-gui $ sudo apt update $ sudo apt install libbsapi policykit-1-fingerprint-gui fingerprint-gui $ sudo apt-get install fprintd libpam-fprintd $ sudo apt install fprint-demo |
继续阅读Ubuntu 17.10/18.04使用内置指纹识别(联想T440内置Synaptics Validity Sensors)
ubuntu 16.04系统上开启PHP7的OpCache
目前使用的阿里云服务器是通过阿里云ECS ubuntu 14.04.5 LTS升级到ubuntu 16.04.2 LTS升级上来的,升级之后,一直没有开启PHP 7.0
的OpCache
。以前感觉性能还够用,最近发现有些卡顿现象,因此想到开启OpCache
。
开启命令如下(PHP-FPM
模式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
$ sudo apt install php7.0-opcache $ sudo phpenmod opcache # PHP-FPM模式的配置文件 $ FILEPATH="/etc/php/7.0/fpm/php.ini" # Enable the opcache. $ SEARCH=";opcache.enable=0" $ REPLACE="opcache.enable=1" $ sudo sed -i "s:$SEARCH:$REPLACE:" $FILEPATH # Set the amount of memory we can use for caching. # The production server has oooooodles of RAM. $ SEARCH=";opcache.memory_consumption=64" $ REPLACE="opcache.memory_consumption=256" $ sudo sed -i "s:$SEARCH:$REPLACE:" $FILEPATH # increase the number of files to cache $ SEARCH=";opcache.max_accelerated_files=2000" $ REPLACE="opcache.max_accelerated_files=1000000" $ sudo sed -i "s:$SEARCH:$REPLACE:" $FILEPATH # Don't bother revalidating files for a long time because # they should never change. # Obviously you need to undo this in dev. $ SEARCH=";opcache.validate_timestamps=1" $ REPLACE="opcache.validate_timestamps=3000" $ sudo sed -i "s:$SEARCH:$REPLACE:" $FILEPATH #重启服务 $ sudo service php7.0-fpm restart |
网站响应速度有明显的飞跃。
参考链接
ubuntu 16.04系统minicom退出方法
1)需使用Ctrl+a 进入设置状态
2)按z进入设置菜单
(1)S键:发送文件到目标系统中;
(2)W键:自动卷屏。当显示的内容超过一行之後,自动将後面的内容换行。这个功能在查看内核的啓动信息时很有用。
(3)C键:清除屏幕的显示内容;
(4)B键:浏览minicom的历史显示;
(5)X键:退出mInicom,会提示确认退出。
参考链接
minicom保存uart log
使用minicom也有很长时间了,只用minicom抓过uart log,但是从来没有去保存过这个log,也不知道有这个功能。后来在超级终端中发现有这个功能(传送->捕获文字),想想minicom应该也有这个功能才对,后来搜索找到怎么用了,方法如下:
Ubuntu 16.04软件中心安装的Arduino IDE报告错误 – avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied
最近要使用Arduino
开发一个读取电压的装置,新电脑上没有安装Arduino IDE
,因此,从Ubuntu 16.04
软件中心中搜索找到一个名为arduino-mhall119
的软件,如下图所示:
继续阅读Ubuntu 16.04软件中心安装的Arduino IDE报告错误 – avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied
ubuntu 16.04使用rssh配置rsync服务通过ssh同步
-
安装配置
RSSH
为数据同步进行准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ sudo apt-get install rsync # ubuntu 16.04/18.04默认源中都存在rssh ,但是 ubuntu 20.04开始,已经没办法从系统源中安装了。 # 原因在于 rssh 存在安全漏洞,并且长时间没有修复,并且已经没人维护了,需要使用 rrsync 替代。 $ sudo apt-get install rssh $ export RSH_RSYNC_USER=rsh_backup $ export RSH_RSYNC_USER_PASSWORD=rsh_password # 如果需要备份/var/log 目录,建议把用户组设置成 adm 用户组,否则很多日志没办法读取 # sudo useradd -s /usr/bin/rssh $RSH_RSYNC_USER -g users -G adm # 后期也可以通过 sudo usermod -g users -G adm $RSH_RSYNC_USER 更改用户组 $ sudo useradd -s /usr/bin/rssh $RSH_RSYNC_USER $ echo $RSH_RSYNC_USER:$RSH_RSYNC_USER_PASSWORD | sudo chpasswd # 配置文件中的umask可以限制用户是否只读,是否有可执行权限 # 许可用户执行rsync操作 $ sudo sed -i "s/^#allowrsync$/allowrsync/g" /etc/rssh.conf # 增加许可的用户操作 $ sudo sed -i '$a\user = \"'$RSH_RSYNC_USER':011:100000:\"' /etc/rssh.conf # 在ubuntu 16.04上 通过 setfacl 给予同步用户某些特殊目录读取权限的方式,目前测试来看会出现很多问题 # 如果是自建的目录,这个操作是没问题的,但是对于系统目录,比如/var/log/ 这个工具会导致 # mysql,tomcat等软件工作异常。 # 我需要备份日志,因此需要给予日志目录读取权限,注意,我们需要给予执行权限, # 否则没办法同步,尽管我们只需要读取数据 # 如果我们只给予 r 权限 会导致报告如下错误 # rsync: readlink_stat("/data/log/denyhosts.3.gz") failed: Permission denied (13) # 我们的 /data/log 实际上上/var/log目录的一个软连接,内部文件权限复杂,因此需要特殊处理 # ubuntu 16.04 不要使用 # sudo apt-get install acl && sudo setfacl -m u:$RSH_RSYNC_USER:r-x -R -L /data/log/ # 这个工具存在 BUG,可能设置的时候正常,过一段时间,就出现问题了。 # 还是老的 chmod 工作稳定,rsync 需要读取+执行权限,才能同步文件, # 因此设置为 755 设置为 645的时候 mysql/tomcat8工作不正常 $ sudo chmod -R 755 /data/log |
-
客户端同步,测试是否正常工作
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ export RSH_RSYNC_USER=rsh_backup $ export RSH_RSYNC_USER_PASSWORD=rsh_password $ export RSH_RSYNC_PORT=22 $ export REMOTE_SERVER=www.mobibrw.com $ export SYNC_DIR=/var/www # 测试是否可以正常工作,另一个方面是许可ssh的登录key否则我们后续没办法使用sshpass # 可以使用 --exclude 参数忽略指定的目录,相对路径,不是绝对路径 $ sudo rsync -avzP --delete -e 'ssh -p $RSH_RSYNC_PORT' $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DIR $SYNC_DIR |
-
转化为定时任务,自动同步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# 安装密码自动填写软件 $ sudo apt-get install sshpass $ cd ~ $ touch backup_rsync.sh $ chmod +x backup_rsync.sh $ echo -e '#!'"/bin/bash\n" >> backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_USER=rsh_backup' backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_USER_PASSWORD=rsh_password' backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_PORT=22' backup_rsync.sh $ sed -i '$a\export REMOTE_SERVER=www.mobibrw.com' backup_rsync.sh # 此处注意最后的分隔符/如果没有这个分隔符,会导致目标目录多一个名为www的父目录 $ sed -i '$a\export SYNC_DIR=/var/www/' backup_rsync.sh # 可以使用 --exclude 参数忽略指定的目录,相对路径,不是绝对路径 $ sed -i '$a\sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e \"ssh -p $RSH_RSYNC_PORT\" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DIR $SYNC_DIR' backup_rsync.sh # 打开计划任务的日志,默认不开 $ sudo sed -i -r "s/#cron\.\*[ \t]*\/var\/log\/cron.log/cron.* \/var\/log\/cron.log/g" /etc/rsyslog.d/50-default.conf #write out current crontab $ sudo crontab -l > addcron #echo new cron into cron file ,每隔30分钟我们调度一次任务,前面是文件锁,防止并发冲突 #如果需要每小时执行一次,则修改为 "* */1 * * * flock ...." #如果需要凌晨2点执行,则修改为 "* 2 * * * flock ...." $ echo "30 * * * * flock -x -w 10 /dev/shm/backup_rsync_corn.lock -c \"bash `echo ~`/backup_rsync.sh\"" >> addcron #install new cron file $ sudo crontab addcron $ rm addcron $ sudo service cron restart |
目前我的阿里云,腾讯云服务器之间的同步脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash export RSH_RSYNC_USER=user export RSH_RSYNC_USER_PASSWORD=password export RSH_RSYNC_PORT=22 export REMOTE_SERVER=121.199.27.227 export SYNC_WWW_DIR=/var/www/ sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e "ssh -p $RSH_RSYNC_PORT" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_WWW_DIR $SYNC_WWW_DIR --exclude "wordpress/wp-content/cache/" --exclude "wordpress/wp-content/plugins/crayon-syntax-highlighter/log.txt" export SYNC_DATA_DIR=/data/ # 此处注意,如果使用 --exclude "/root/" 则忽略最顶部的root目录 # 如果使用 --exclude "root/" 则忽略所有路径中包含 root 的目录 # 主要 rsync 的 top-directroty 部分的规则 sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e "ssh -p $RSH_RSYNC_PORT" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DATA_DIR $RSYNC_DATA_DIR --exclude "/root/" |
参考链接
- CentOS:ssh限制ip和用户访问的设置
- Linux Restricted Shells: rssh and scponly
- rssh homepage
- 通过ssh执行rsync来完成同步文件的命令总结
- Linux使用笔记3-crontab添加定时任务
- 配置 rsync+ssh+密码登录
- setfacl命令基本用法
- Linux ACL权限设置(setfacl和getfacl)
- Linux中限制用户访问权限的3种方法
- Linux之setfacl权限配置
- setfacl to provide user access to /var/log does not work
- Linux的用户和用户组管理
- What is the "adm" group?
- Linux - 查看系统group
- 用rsync在copy时实现过滤
- rssh
- ubuntu 20.04配置rsync服务通过ssh同步
hosts.allow、hosts.deny配置不生效的解决方法
通过配置hosts.allow、hosts.deny,控制SSH限制固定IP登陆
按照以往的方法,分别在hosts.allow、hosts.deny加入以下配置
1 2 3 4 5 6 7 |
# more /etc/hosts.allow sshd:192.168.x.x # more /etc/hosts.deny sshd:all |
保存后测试,发现配置无效,其他IP还是可以登陆成功。
解决方法如下:
hosts.allow和hosts.deny属于tcp_Wrappers防火墙的配置文件,而用tcp_Wrappers防火墙控制某一服务访问策略的前提是,该服务支持tcp_Wrappers防火墙,即该服务应用了libwrapped库文件。
查看某服务(如ssh)是否应用了libwrapped库文件的方法是:
1 |
$ ldd /usr/sbin/sshd |grep libwrap.so.0 |
没有显示,表示此服务器上安装的SSH没有应用libwrapped库文件,也就不能用tcp_Wrappers防火墙控制访问策略。(一般情况下服务器默认安装的SSH都是支持libwrapped库文件,这台服务器不清楚为什么不支持)
最终解决方法是重新安装SSH。
1 2 3 4 5 |
$ yum -y remove openssh $ yum -y install openssh $ yum -y install openssh-server |
安装完成后再次查看是否应用了libwrapped库文件,显示支持。
1 2 |
$ ldd /usr/sbin/sshd |grep libwrap.so.0 libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f195feb4000) |
再测试SSH登陆,配置生效。
参考链接
ubuntu 16.04使用LimeSDR 1.4s估算信号到达角DOA
安装依赖的软件包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#安装预编译版本,为后续编译减少依赖,预编译版本太老了 $ sudo apt-get install libarmadillo-dev $ cd ~ #编译安装最新版本的armadillo,gr-doa需要这个库的支持 $ git clone https://github.com/conradsnicta/armadillo-code.git $ cd armadillo-code $ mkdir build $ cd build $ cmake .. $ make $ sudo make install #编译安装SoapySDR,为我们后续操作LimeSDR准备操作接口 $ 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 #编译安装GrOsmoSDR,后续为了支持GnuRadio,我们需要GrOsmoSDR帮我们完成一个中转 $ cd ~ $ git clone git://git.osmocom.org/gr-osmosdr $ cd gr-osmosdr #修正几处问题 $ sed -i '$a\from _osmosdr_swig import source_IQBalanceOff' ./python/__init__.py $ sed -i '$a\from _osmosdr_swig import source_IQBalanceManual' ./python/__init__.py $ sed -i '$a\from _osmosdr_swig import source_IQBalanceAutomatic' ./python/__init__.py $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig #编译安装LimeSDR的驱动 $ git clone https://github.com/myriadrf/LimeSuite.git $ cd LimeSuite #建议2018年4月以后的的主分支,早期版本存在相位随时间漂移的问题 $ git checkout master # 不可删除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 |
下载最新的gr-doa
源代码
1 2 3 4 |
#编译安装gr-doa $ cd ~ $ git clone https://github.com/EttusResearch/gr-doa.git |
增加limesdr
的调用代码:
1 2 3 4 5 |
$ sed -i "s/__init__.py/__init__.py\nlimesdr_soapysdr_source.py/g" ~/gr-doa/python/CMakeLists.txt $ sed -i "s/from twinrx_usrp_source import twinrx_usrp_source/from twinrx_usrp_source import twinrx_usrp_source\nfrom limesdr_soapysdr_source import limesdr_soapysdr_source/g" ~/gr-doa/python/__init__.py $ vim ~/gr-doa/python/limesdr_soapysdr_source.py |
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# -*- coding: utf-8 -*- # # Copyright 2018 # longsky <wangqiang1588@sina.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # from gnuradio import gr from gnuradio import blocks import SoapySDR from SoapySDR import * #SOAPY_SDR_ constants import osmosdr from osmosdr import * from gnuradio.filter import firdes def gen_sig_io(num_elements): # Dynamically create types for signature io = [] for i in range(num_elements): io.append(gr.sizeof_gr_complex*1) io.append(gr.sizeof_float*num_elements) return io class limesdr_soapysdr_source(gr.hier_block2): def __init__(self, samp_rate=1000000, center_freq=2400000000, gain=40, sources=2): gr.hier_block2.__init__( self, "LimeSDR SoapySDR", gr.io_signature(0, 0, 0), gr.io_signaturev(sources, sources, gen_sig_io(sources)), ) ################################################## # Parameters ################################################## self.samp_rate = samp_rate self.center_freq = center_freq self.gain = gain self.sources = sources args = dict(driver="lime") limesdr = SoapySDR.Device(args) # We need to detect the number of channels as the LimeSDR has two # and the LimeSDR-Mini has one chans = range(limesdr.getNumChannels(0)) if len(chans) < sources : raise Exception("limesdr device doesn't provide enough rx channels ") while len(chans) > sources : chans.pop() limesdr = None #warnning: args must be written like below args = 'soapy=0,driver=lime,nchan=' + str(sources) self.osmosdr_source_0 = osmosdr.source(args) self.osmosdr_source_0.set_clock_source('internal', 0) self.osmosdr_source_0.set_sample_rate(self.samp_rate) #self.osmosdr_source_0.set_time_now(osmosdr.time_spec_t()) for ch in chans: self.osmosdr_source_0.set_gain(self.gain, ch) # print(self.limesdr.listAntennas(SOAPY_SDR_RX, 0)) # ('NONE', 'LNAH', 'LNAL', 'LNAW', 'LB1', 'LB2') #RX_L : is lower then 2.5Ghz,RX_H : higher than 2.5GhZ self.osmosdr_source_0.set_antenna("LNAH", ch) #self.osmosdr_source_0.set_bandwidth(ch,20*1000*1000) self.osmosdr_source_0.set_dc_offset_mode(osmosdr.source_IQBalanceAutomatic,ch) # Use timed commands to set frequencies self.set_center_freq(center_freq,sources) ################################################## # Connections ################################################## for source in range(sources): self.connect((self.osmosdr_source_0, source), (self, source)) def __del__(self): self.disconnect_all() if hasattr(gr.hier_block2,"__del__") : gr.hier_block2.__del__(self) def get_samp_rate(self): return self.samp_rate def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate self.osmosdr_source_0.set_sample_rate(self.samp_rate) def set_center_freq(self, center_freq, sources): self.center_freq = center_freq for ch in range(self.sources): self.osmosdr_source_0.set_center_freq(self.center_freq, ch) def get_center_freq(self): return self.center_freq def get_gain(self): return self.gain def set_gain(self, gain): print "DO NOT TUNE GAINS DURING RUNTIME" def get_sources(self): return self.sources def set_sources(self, sources): print "DO NOT CHANGE SOURCES DURING RUNTIME" |
编译代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ cd ~ $ cd gr-doa $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig |
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
#!/usr/bin/env python2 # -*- coding: utf-8 -*- ################################################## # GNU Radio Python Flow Graph # Title: Run Rootmusic Lin Array LimeSDR # Generated: Tue Apr 3 20:14:45 2018 ################################################## if __name__ == '__main__': import ctypes import sys if sys.platform.startswith('linux'): try: x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: print "Warning: failed to XInitThreads()" def struct(data): return type('Struct', (object,), data)() from PyQt4 import Qt from gnuradio import eng_notation from gnuradio import gr from gnuradio.eng_option import eng_option from gnuradio.filter import firdes from optparse import OptionParser import doa import sys class run_RootMUSIC_lin_array_LimeSDR(gr.top_block, Qt.QWidget): def __init__(self): gr.top_block.__init__(self, "Run Rootmusic Lin Array LimeSDR") Qt.QWidget.__init__(self) self.setWindowTitle("Run Rootmusic Lin Array LimeSDR") try: self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) except: pass self.top_scroll_layout = Qt.QVBoxLayout() self.setLayout(self.top_scroll_layout) self.top_scroll = Qt.QScrollArea() self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) self.top_scroll_layout.addWidget(self.top_scroll) self.top_scroll.setWidgetResizable(True) self.top_widget = Qt.QWidget() self.top_scroll.setWidget(self.top_widget) self.top_layout = Qt.QVBoxLayout(self.top_widget) self.top_grid_layout = Qt.QGridLayout() self.top_layout.addLayout(self.top_grid_layout) self.settings = Qt.QSettings("GNU Radio", "run_RootMUSIC_lin_array_LimeSDR") self.restoreGeometry(self.settings.value("geometry").toByteArray()) ################################################## # Variables # NormSpacing 天线之间的实际距离,单位为米,类型为浮点类型 # NumTargets 发出信号的设备数量 ################################################## self.input_variables = input_variables = struct({"SampleRate": 1000000, "CenterFreq": 2550000000, "Gain": 60, "NumArrayElements": 2, "NormSpacing": 0.5, "SnapshotSize": 2**11, "OverlapSize": 2**9, "NumTargets": 1, }) ################################################## # Blocks ################################################## self.limesdr = doa.limesdr_soapysdr_source( samp_rate=input_variables.SampleRate, center_freq=input_variables.CenterFreq, gain=input_variables.Gain, sources=input_variables.NumArrayElements ) self.tab = Qt.QTabWidget() self.tab_widget_0 = Qt.QWidget() self.tab_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.tab_widget_0) self.tab_grid_layout_0 = Qt.QGridLayout() self.tab_layout_0.addLayout(self.tab_grid_layout_0) self.tab.addTab(self.tab_widget_0, "Angle of Arrival") self.top_layout.addWidget(self.tab) self.doa_rootMUSIC_linear_array_0 = doa.rootMUSIC_linear_array(input_variables.NormSpacing, input_variables.NumTargets, input_variables.NumArrayElements) self.doa_qt_compass_0 = doa.compass("", 0, 180, 10, 0) self.top_layout.addLayout(self.doa_qt_compass_0.this_layout) self.doa_autocorrelate_0 = doa.autocorrelate(input_variables.NumArrayElements, input_variables.SnapshotSize, input_variables.OverlapSize, 1) ################################################## # Connections ################################################## self.connect((self.doa_autocorrelate_0, 0), (self.doa_rootMUSIC_linear_array_0, 0)) self.connect((self.doa_rootMUSIC_linear_array_0, 0), (self.doa_qt_compass_0, 0)) for ch in range(input_variables.NumArrayElements) : self.connect((self.limesdr, ch), (self.doa_autocorrelate_0, ch)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "run_RootMUSIC_lin_array_LimeSDR") self.settings.setValue("geometry", self.saveGeometry()) event.accept() def main(top_block_cls=run_RootMUSIC_lin_array_LimeSDR, options=None): from distutils.version import StrictVersion if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): style = gr.prefs().get_string('qtgui', 'style', 'raster') Qt.QApplication.setGraphicsSystem(style) qapp = Qt.QApplication(sys.argv) tb = top_block_cls() tb.start() tb.show() def quitting(): tb.stop() tb.wait() qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting) qapp.exec_() if __name__ == '__main__': main() |
如果上面的代码下载困难,可从本站下载一份代码拷贝
gr-doa,armadillo-code,SoapySDR源代码下载,gr-osmosdr
至于测试的信号发送设备,任何能产生自相关信号的设备都可以,一般建议对讲机即可,注意频率要调整到一致才可以。
参考链接
- Direction Finding with the USRP™ X-Series and TwinRX™
- pothosware/SoapySDR
- LimeSDR setup with GnuRadio
- Parameter needed to switch RX input in gnuradio for limesdr
- osmocom Gnu Radio Blocks
- Latest (Aug 2017) LimeSDR and GnuRadio
- Python osmosdr.source() Examples
- Two RX channels in GNU Radio
- RX channels alignment
- Application for using the 2 RX channels simultaneously
- TDOA application
- Issues with using LimeSDR in MIMO2x2 Spatial Multiplexing Mode
ubuntu 16.04配置基于SSL的MySQL主从同步
首先参考 ubuntu 16.04配置MySQL主从同步 实现同步,接下来执行如下操作
主数据库master配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#生成加密证书,默认在/var/lib/mysql/下生成ca-key.pem,server-key.pem,client-key.pem $ sudo mysql_ssl_rsa_setup --uid=mysql #有时候需要手工修改一下证书所有者 $ sudo chown mysql:mysql /var/lib/mysql/*.pem $ sudo ls -l /var/lib/mysql/ | grep .pem -rw------- 1 mysql mysql 1679 Apr 2 22:53 ca-key.pem #CA私钥 -rw-r--r-- 1 mysql mysql 1107 Apr 2 22:53 ca.pem #自签的CA证书,客户端连接也需要提供 -rw-r--r-- 1 mysql mysql 1107 Apr 2 22:53 client-cert.pem #客户端连接服务器端需要提供的证书文件 -rw------- 1 mysql mysql 1679 Apr 2 22:53 client-key.pem #客户端连接服务器端需要提供的私钥文件 -rw------- 1 mysql mysql 1675 Apr 2 22:53 private_key.pem #私钥/公钥对的私有成员 -rw-r--r-- 1 mysql mysql 451 Apr 2 22:53 public_key.pem #私钥/公钥对的共有成员 -rw-r--r-- 1 mysql mysql 1107 Apr 2 22:53 server-cert.pem #服务器端证书文件 -rw------- 1 mysql mysql 1679 Apr 2 22:53 server-key.pem #服务器端私钥文件 #配置服务器 $ sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak $ sudo sed -i "s/# ssl-ca=\/etc\/mysql\/cacert.pem/ssl-ca=\/var\/lib\/mysql\/ca.pem/g" /etc/mysql/mysql.conf.d/mysqld.cnf $ sudo sed -i "s/# ssl-cert=\/etc\/mysql\/server-cert.pem/ssl-cert=\/var\/lib\/mysql\/server-cert.pem/g" /etc/mysql/mysql.conf.d/mysqld.cnf $ sudo sed -i "s/# ssl-key=\/etc\/mysql\/server-key.pem/ssl-key=\/var\/lib\/mysql\/server-key.pem/g" /etc/mysql/mysql.conf.d/mysqld.cnf #重启MySQL服务 $ sudo service mysql restart #查看服务器状态,是否已经启用SSL $ mysql -u root -p -e "show global variables like '%ssl%'" Enter password: +---------------+--------------------------------+ | Variable_name | Value | +---------------+--------------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /var/lib/mysql/ca.pem | | ssl_capath | | | ssl_cert | /var/lib/mysql/server-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | /var/lib/mysql/server-key.pem | +---------------+--------------------------------+ #修改已存在用户,要求必须通过SSL才能同步,完成主从同步之后,从库可能会无法正常同步这个修改,需要手工跳过一个错误 "stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;start slave;" $ mysql -u root -p -e "ALTER USER 'repl'@'182.254.149.39' REQUIRE SSL;" # 阻止数据库记录写入,避免后期我们备份数据库的时候数据发生变动 # 该命令对于普通账号的只读模式,root 账号无效,因此访问数据库的账号 # 尽量不要使用root账号,如果是root 账号,只能暂时停止所有访问数据库的服务了 $ mysql -u root -p -e "set global read_only=1;" #查询并记录主库的同步位置 $ mysql -u root -p -e "SHOW MASTER STATUS;" Enter password: +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000021 | 12144639 | | | | +------------------+----------+--------------+------------------+-------------------+ # 执行 ubuntu 16.04配置MySQL主从同步 http://www.mobibrw.com/?p=10541 里的备份脚本 $ sudo bash backup_wordpress.sh # 取消普通账号的只读模式 $ mysql -u root -p -e "set global read_only=0;" |
从服务器slave配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
$ sudo mkdir /etc/mysql/ssl #从服务端获取证书 $ sudo scp -P 22 -r root@www.mobibrw.com:/var/lib/mysql/ca.pem /etc/mysql/ssl/ $ sudo chown mysql:mysql /etc/mysql/ssl/ca.pem $ sudo scp -P 22 -r root@www.mobibrw.com:/var/lib/mysql/client-cert.pem /etc/mysql/ssl/ $ sudo chown mysql:mysql /etc/mysql/ssl/client-cert.pem $ sudo scp -P 22 -r root@www.mobibrw.com:/var/lib/mysql/client-key.pem /etc/mysql/ssl/ $ sudo chown mysql:mysql /etc/mysql/ssl/client-key.pem $ mysql -u root -p -e "stop slave;" #获取最后同步的位置,为后续恢复进行准备 $ mysql -u root -p -e "show slave status\G;" | grep Exec_Master_Log_Pos: Enter password: Exec_Master_Log_Pos: 12178842 $ mysql -u root -p -e "show slave status\G;" | grep Master_Log_File Enter password: Master_Log_File: mysql-bin.000021 Relay_Master_Log_File: mysql-bin.000021 #修改同步信息 $ mysql -u root -p -e "CHANGE MASTER TO MASTER_HOST='www.mobibrw.com', MASTER_USER='repl', MASTER_PASSWORD='slavepass', MASTER_LOG_FILE='mysql-bin.000021',MASTER_LOG_POS=12178842 ,master_ssl=1,master_ssl_ca='/etc/mysql/ssl/ca.pem', master_ssl_capath='/etc/mysql/ssl', master_ssl_cert='/etc/mysql/ssl/client-cert.pem', master_ssl_key='/etc/mysql/ssl/client-key.pem';" $ mysql -u root -p -e "start slave;" #查看从库状态 $ mysql -u root -p -e "show slave status\G;" Enter password: *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: www.mobibrw.com Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000021 Read_Master_Log_Pos: 12701244 Relay_Log_File: VM-xxx-xxx-xxxxx-relay-bin.000003 Relay_Log_Pos: 195033 Relay_Master_Log_File: mysql-bin.000021 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 12701244 Relay_Log_Space: 523107 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: Yes Master_SSL_CA_File: /etc/mysql/ssl/ca.pem Master_SSL_CA_Path: /etc/mysql/ssl Master_SSL_Cert: /etc/mysql/ssl/client-cert.pem Master_SSL_Cipher: Master_SSL_Key: /etc/mysql/ssl/client-key.pem Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: |
注意,偶尔在系统升级的时候,从库可能会丢失同步状态配置。这时候,我们需要重新同步,此时我们从从设备/var/lib/mysql/master.info
中找到被中断的同步点。
里面的内容一般如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
25 mysql-bin.000582 4765083 www.mobibrw.com xxxx xxxx 3306 60 1 /etc/mysql/ssl/ca.pem /etc/mysql/ssl /etc/mysql/ssl/client-cert.pem /etc/mysql/ssl/client-key.pem 0 30.000 0 0b674082-f01d-11e9-8f8c-00163e0a4ffe 86400 0 |
注意mysql-bin.000582
下面的4765083
就是同步位置,在恢复的时候,就是这两个关键数据。