Browsed by
Tag: debian

webRTC调试方法小结

webRTC调试方法小结

前段时间完成了miniWebPhone V1版本的开发,基于Chrome浏览器,采用了webRTC技术。在开发过程中,发现其实webRTC技术使用起来还是不太方便,有很多让人感觉很困扰的地方。基本上只有VoIP领域专家才能明白诸多操作以及参数的意义,即便是这样,仍然需要根据Chrome的输出信息来了解Chrome中webRTC的各项细节。

有几种方法可以了解webRTC过程中的细节信息。

方法1:chrome://webrtc-internals/

这个方法是最简单的。在Chrome地址栏中输入上述命令,即可了解webRTC的过程。不过这种方法输出的信息非常粗略。如果您对webRTC很熟悉,那么可以从中了解一些有用的信息。如果您对webRTC不熟悉,那TA的信息您肯定看不明白。

方法2:chrome日志

这种方法我经常使用,而且推荐在linux环境(例如Debian)中使用。实际上,我不知道windows系统下如何看Chrome的日志。Chrome的日志很详细,基本上会输出每个步骤详细的信息。

在linux终端窗口用以下命令启动Chrome即可:

google-chrome --enable-logging=stderr --log-level=4 --vmodule=*libjingle/*=3,*=0

方法3:Chrome源代码

日志可以帮助我们了解大部分webRTC的细节,但是webRTC某些实现仍然是有问题或者说让人困扰的(例如对ICE的处理主、被叫流程不一致,错误处理没有输出日志等),此时直接看代码就是比较好的解决方法。完全、彻底地阅读Chrome是个不可能完成的任务,只能结合Chrome日志去追踪相应的代码。

VPS升级Debian的几点小事项

VPS升级Debian的几点小事项

数据中心升级,要求所有节点最好是64位系统。而我们的节点不幸是32bit系统,因此不得不大动干戈地重新构造系统。

原来的系统是采用Ubuntu 10.04,年代比较久了。这次升级打算全部换成Debian7,真是no zuo no die。虽说两个系统相差不大,但是其中的一些细节还是会坑死人的。

1、bash问题

Debian7中root用户采用bash,如果新创建一个用户,默认居然采用sh,无法理解。因此需要修改/etc/passwd文件,将用户对应的shell修改为bash即可。

2、sudoer问题

这个不是大问题,无非就是修改/etc/sudoers文件,手工将用户加入sudo用户列表中即可。(升级完成后,最好将用户剔出sudoer列表,只保留root用户)。

3、postfix与dovecot

这些配置折腾了几乎一天。在Ubuntu环境中,很容易搞定,ubuntu非常体贴的提供了一个安装包dovecot-postfix,几乎不需要配置就可以转起来。而Debian7则需要手工进行配置。首先dovecot必须安装以下几个包:

apt-get install dovecot-common dovecot-core dovecot-pop3d

在配置之前,首先要弄明白一些关键概念:

  • Postfix是发送邮件服务器,提供SMTP服务;
  • Dovecot是接收邮件服务器,提供IMAP/POP服务。
  • Postfix自身不鉴权,通过SASL与其他应用(例如SASL服务、POP3服务等)交互来实现鉴权。

通常网上的文章都会采用SASL服务器或者连接MySQL数据库等来实现一个非常复杂的邮件服务系统。而我们的需求没有这么夸张,debian系统的用户就是email用户,不需要进行区分。因此我们采用dovecot来鉴权。

跑个题先,网上居然有文档配置postfix时不进行鉴权,简直是纯找死的节奏,这种情况下,任何人都可以利用他的服务器发送邮件,过不了多久,相信全世界的邮件服务器都会视其为垃圾邮件服务器,直接屏蔽掉。

因此配置的关键点在于以下几点:

  • 告诉postfix,通过dovecot鉴权。
  • dovecot创建与postfix之间的管道,接受postfix的鉴权请求。
  • dovecot采用系统用户的信息直接鉴权。

3.1 配置dovecot

这里臭骂一下Debian。把dovecot的配置拆成N多文件,乱七八糟,有必要么?网上的参考文档多半是基于RHEL或者CentOS,基本都是在一个文件中进行配置(Ubuntu 10.04也基本是一个文件),Debian这种方式貌似很合理,实际操作起来更让人纠结。

首先修改/etc/dovecot/conf.d/10-auth.conf文件,设定以下参数:

disable_plaintext_auth = no
auth_mechanisms = plain login

接着修改/etc/dovecot/conf.d/auth-system.conf.ext文件,在文件尾添加以下配置:

service auth {
    unix_listener /var/spool/postfix/private/auth-dovecot {
        mode = 0660
        user = postfix
        group = postfix
    }
}

简要说明:在这个文件中,可以看到以下信息,默认就是采用系统用户鉴权。其中的passwd就是指/etc/passwd文件。

userdb {
  driver = passwd
}

而我们添加的信息,其实就是为postfix创建一个管道,准备接受postfix的鉴权请求。管道名称就是auth-dovecot,创建在/var/spool/postfix/private目录下。这个信息在postfix配置中需要用到。

3.2 配置postfix

debian系统中的postfix基本配置与其他linux版本没有太大差别,无非就是修改一些hostname信息等。鉴权配置需要修改,修改/etc/postfix/main.cf文件,在文件尾添加以下信息:

home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth-dovecot
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sender_restrictions = reject_unknown_sender_domain

其中关键部分就是蓝色字体标识的部分。”smtpd_sasl_path”项就是在dovecot中配置的管道路径(在这些配置项上,我几乎摔得满头是包)。

完成上述配置后,重启dovecot和postfix服务即可:

service dovecot restart
service postfix restart

4、SSH

处于安全因素的考虑,修改默认的SSH登录端口以及禁止root用户远程登录。修改/etc/ssh/sshd_config文件:

Port 1234
PermitRootLogin no
linux环境中getnameinfo的问题

linux环境中getnameinfo的问题

在linux环境下获取本地IP地址的方法,通常都是先getifaddrs获取当前计算机中所有的接口信息,然后循环调用getnameinfo获取各接口的IP地址。

这是网络上常见的描述方式。在IPv4组网时,没有任何问题。但是在IPv6组网(获取IPv6地址)时,出现了问题。由该函数返回的IP地址字符串中包含了当前接口的名称,例如以下返回值:

fe80::5a94:6bff:fe48:4cec%wlan1

如果想获得纯粹的IPv6地址,应当通过接口地址信息,调用inet_ntop来转换IP地址为字符串,如下处理:

char ipstr[512]={0};
sockaddr_in6* sockaddr_ipv6=reinterpret_cast<sockaddr_in6*>(ifa->ifa_addr);
inet_ntop(AF_INET6,&sockaddr_ipv6->sin6_addr,ipstr,sizeof(ipstr));

此时获取的IP地址字符串信息就不再包含当前接口的名称:

fe80::5a94:6bff:fe48:4cec

IPv6地址带接口名称实际是“zone identifier (区域标识)”,在RFC6874规范中有相应的定义。

2014-06-08 updated:

在Linux系统中,要使用ping6命令来ping IPv6的地址,并且要求带上接口索引。例如如果只是ping IPv6地址,会返回以下错误:

ping6 fe80::a00:27ff:fe37:a9d0
connect: Invalid argument

正确的使用方法如下所示:

ping6 fe80::a00:27ff:fe37:a9d0%eth0
简单判断当前linux的发行版本

简单判断当前linux的发行版本

初步用了一下最新发布的Ubuntu 14.04版本,大体上来说还是很不错。不过Unity7还是一如既往的奇葩,在与Qt程序的配合中更是如此。很不幸,我们的软件就是采用Qt,因此在Unity中有些莫名奇妙的小冲突,例如systemTray等问题,虽然不影响使用,但是给人的感觉很不爽、很不专业。

简单的处理方式就是程序自动判断当前是不是Ubuntu版本,然后再针对性地做一些处理就好了。目前还没有统一的API可以说明当前linux的发行版本信息,网上有各种各样的方式进行判断。对deb系的发行版本而言,以下方式经验证还比较靠谱:

直接读取/etc/issue文件,这个文件的内容目前包含发行版本信息。

这种方式有一些不确定之处:

(1)首先这个文件名就很奇葩。’issue’为什么是用来存储版本信息的? 为什么不直接用version或者别的更好、更直接的文件名?linux开发人员的思维总是让人搞不懂啊。

(2)既然没有人解释为什么会使用这个文件,同样也就没有人保证以后还会这么做。

Debian 7与PyCharm3.1

Debian 7与PyCharm3.1

PyCharm无疑是相当杰出的Python IDE(而且提供免费的社区版本),可以运行在Debian7系统中。安装、运行都非常简单,下面简要说明步骤。需要说明的是,全部采用root用户进行操作。

step1:下载PyCharm

目前最新的版本是V3.1,直接从官网下载即可:

cd /opt
wget http://download-ln.jetbrains.com/python/pycharm-community-3.1.tar.gz

step2: 解压缩PyCharm

tar -xzf pycharm-community-3.1.tar.gz

step3: 创建软链接

ln -s /opt/pycharm-community-3.1/bin/pycharm.sh /usr/bin/pycharm

完成上述命令后,在console中直接输入pycharm即可启动。当然,也可以创建图形快捷方式: 右键点击“kickoff应用程序启动器”,选择“编辑应用程序”,选择一个菜单栏(例如“开发”)创建新的菜单项,指向pycharm即可。

2014-03-12 更新:

Kubuntu系统默认没有安装jdk,因此无法运行pycharm,需要先使用以下命令安装jdk:

sudo apt-get install default-jdk
Debian XFCE的面板不见了

Debian XFCE的面板不见了

在虚拟机中安装了Debian 7.1的XFCE版本,一切都比较顺利,只是重启后,上下两个面板居然都不见了。

简单搜索了一下,发现可以用一个让人哭笑不得的方式还原回来:

在桌面上点击鼠标右键,弹出菜单后,选择“在此打开终端”。在终端中运行以下命令:

xfce4-panel

面板回来了。注意,不要关闭终端,选择“注销”后,重新登录。以后面板都会出现。

这实在是个很无厘头的bug。

Debian6中文乱码问题

Debian6中文乱码问题

最近安装最新的Debian6.06 Gnome版本,遇到一个奇怪的问题:选择中文安装,完成安装后重新进入系统,界面全是小方块,中文显示乱码。

经研究后发现,居然是没有安装中文字体,这是个多么奇怪的bug,选择了中文界面安装居然不安装中文字体!

解决方法也简单,安装中文字体即可:

apt-get install ttf-wqy-zenhei ttf-wqy-microhei

 

dpkg-deb常用命令

dpkg-deb常用命令

这个命令主要用于进行deb包的安装和查询等。

build deb包,示例:将/tmp/debian_packages目录下的文件打包成demo.deb文件

dpkg-deb -b /tmp/debian_packages ./demo.deb

查询deb包中的文件内容:

dpkg-deb -c demo.deb

安装deb包

dpkg -i demo.deb
Ubuntu/Debian系统包管理常用命令

Ubuntu/Debian系统包管理常用命令

sudo apt-get update 同步软件源中的软件索引文件,并更新本地的cache

sudo apt-get upgrade 根据软件源的要求,安装(升级)最新的软件包。注意,所谓“最新”是指当前系统版本所能支持的最新软件包,而不是最新系统版本所能支持的软件包。

sudo apt-get autoremove 自动删除某些不再需要的软件包。

sudo apt-get install 安装具体某个软件,例如sudo apt-get install qtcreator就是安装qtcreator软件。

sudo apt-get remove 卸载某个软件包

下面是两个常用的软件包查询命令:

sudo apt-cache search 搜索某个软件。最好和grep配合起来用,很方便。例如sudo apt-cache search python | grep mysql 就是所有python软件包中,与mysql相关的包。

sudo apt-cache show 显示某个软件包的具体信息,包括依赖关系等。

kubuntu与xp的时间问题

kubuntu与xp的时间问题

我的计算机系统稍微有点特殊:主机是XP系统,平常可以通过U盘启动Kubuntu系统。也就是说,我日常工作在双系统环境中,经常在这些系统之间进行切换。

由此发现了一个问题:在Kubuntu工作后,重启计算机切换到XP系统。发现XP的时间被修改为GMT+0时区的时间,即时间整整晚了8小时(中国是GMT+8时区)。

检查XP中的时区和时间设置,发现完全正常,XP并没有修改时区。

这个问题只发生在从Kubuntu切回XP时。反过来从XP切回Kubuntu则没有这个问题,Kubuntu中的时间和时区设置正常。

怀疑问题出在Kubuntu上,Kubuntu可能重新设置了Bios或者主板的时区设置。问题可以这样解决:

修改/etc/default/rcS文件,将UTC设置为no即可。

这个问题可能是我当初安装Kubuntu时,忽略了某项设置导致的?

关于UTC参数,系统帮助中的说明如下:

UTC This  is  used  to govern how the hardware real time clock is interpreted when it is read (e.g., at  boottime,  for  the purpose of setting the system clock) and when it is written (e.g., at shutdown).  If this option is set to no then the system clock is assumed
to be set to local time. If the option  is  set  to yes  then  the  system clock is assumed to be set to something approximating Coordinated  Universal  Time(UTC).   (POSIX systems keep a variant of UTC, without leap seconds.)

2014-01-07 updated: 在Debian系统中,该参数被调整到/etc/adjtime文件中,将UTC修改为LOCAL即可。也可以使用以下命令直接修改:

hwclock -w --localtime