2011年11月30日星期三

汪华:未来三年的移动互联网创业

汪华:未来三年的移动互联网创业

来源:雷锋网原作者:张涛2011-11-28 09:05:12

  汪华在移动开发者大会上谈到,当前的移动互联网正处在从核心用户向主流用户的普及爆发点上,发展阶段相当于2002–2003年的互联网,接下来的用户群的迁移会把现在的格局完全打破。如果现在要创业,或者是着眼之后二三年创业的话,其实并不一定需要盯着现在排名靠前、Top100的应用,而是更应该盯着接下来的二三亿人可能会用什么?然后汪华就方向选择、团队建立、平台选择这三个方面给移动互联网创业者提出了宝贵的建议。

汪华:未来三年的移动互联网创业

 创新工场合伙人汪华

  移动互联网:处在从核心用户向主流用户的普及爆发点上

  非常高兴有机会和所有的创业者交流移动互联网的事情。其实这个主题的演讲在最近两三年也做过好几回,但是今天跟以前的每次都不一样,我记得在09、10年做演讲的时候,还有点像布道或者是忽悠。今年可能已经不一样了,因为大家都已经看到,移动互联网安卓、iOS设备已经到了5千万用户。到外面去看,在大城市市场里面最热销的是iOS或者是安卓的手机。我们看这个东西变得好,就像刚才说的,现在大家创业不做移动互联网都已经很过时。

  那我们现在在哪个点?其实我们现在在非常好的点上,在移动互联网真正的爆发点,从去年到现在的5千万的移动互联网用户,其实到现在还没有真正到主流用户群,第一批的iOS、安卓用户还是重度互联网核心用户,还是科技圈子里的用户,还是玩家,而从今往后是移动互联网真正爆发的时候,移动互联网将增加到一亿,然后再扩展到4.83亿的互联网用户。所以说现在是一个真正的爆发点。

  我跟大家分享一些数据:因为我们有很多的移动互联网的业务,我们估计到今年年底真正在市场上的iOS、安卓会有6千万,过去6个月Top应用的流量增长了6倍。还有Top应用的活跃用户数过去半年也增长了4倍。

  还有一个更重要的趋势是终端价格,从去年到今年价格不断降低,厂商也在不断的开发新的方案,软件、硬件、系统,各方面都成熟之后最重要的是终端价格。现在所有的厂商都在做安卓设备,现在走到市场上,1500块钱上的手机全部的新款都已经是安卓,在所有国内的厂商明年的手机研发计划和市场都是转向了安卓。而市场上已经推出了1000元价格点的,主流配置的安卓手机: HVGA电容屏、600M以上的arm11;256MRAM+512M ROM,支持GPS,相对齐全的感应器。而刚刚推出的展讯和联发科的新方案,能把这个价格继续拉低到700。

  在中国市场上1000块钱以上的手机大概能占到中国手机销售量的40%,而七八百块钱到一千块钱的大概又占到另外的30%,也就是说现在智能手机以iOS、安卓为代表的,现在能下探的范围大概覆盖中国70%手机范围。诺基亚在中国和世界市场的衰退,比原先预想的快得多。其他的手机厂商在一千块钱左右的手机明年的出货计划都是在iOS、安卓,所以说在明年,新的硬件方案、价格点和能够保证安卓真正的普及,从一线城市到二三线城市普及,从核心的互联网用户,从专门买手机就是为了上移动互联网用户向普通手机用户普及,这是一个关键的引爆点。

  所以刚才卢刚提了一个问题,我们接下来做什么?其实真正的引爆点带来的机会:第一就是用户群的迁移。过去是用户是男性、IT科技圈、商务人士等核心用户,相对是比较年轻的用户。而手机达到800块钱的价格点,全面普及之后,其实未来三年新增加出来的用户实际上会是真正的普及的标准手机用户,标准的中国的互联网网民用户,他们需求的核心就不像现在的用户这么专业,他们需要的是更日常生活相关,更普通、更普及的应用。说白了,安卓和互联网真正向主流扩展。

  而这个给创业和开发者带来的机会是非常非常大的。创业者可能会想,“我们能想到的东西好像都有人在做。很多其他大公司已经做了,创新工场投的项目已经做得很好,或者是排名靠前的已经有很好的应用,那我们来做什么?”

  其实这个问题是非常简单,现在的移动互联网相当于2002–2003年的互联网,是非常非常早期的阶段,接下来的用户群的迁移会完全把现在的局给打破。我随便举一个例子:早期的互联网,像hao123、360安全卫士,美图秀秀这样的应用在2000年的时候不存在,也没有存在的土壤,因为2000年的时候互联网的网民都非常的高端,如果编辑图片都会用Photoshop。也就是说大量的接下来增加的三四亿的互联网用户其实是更普通的用户,他们的行为和现在的5千万是完全不一样的,他们所需要的入口级应用、装机必备应用和我们现在的应用是一样吗?说实话有50%都是不重合的。

  所以如果现在要创业,或者是着眼之后二三年创业的话,其实并不一定需要盯着现在排名靠前、Top100的应用。其实你更应该盯着接下来的二三亿人可能会用什么?接下来这二三亿人如果用手机、移动互联网,现在的哪些方案对他们是太过复杂,需要简化,他们可能有哪些新的需求是现在的用户没有的?你能不能挖掘出新的需求,满足新增的二三亿人。

  其实还有一些轨迹,你们去探索的时候,可以参照中国普通互联网发展的早期,从2000年初到2010年过渡的时期里面,或者是说从2003年、2004、2007、2008年从专业用户到普通大众迁移的过程中间出现了那些应用或服务,这也会是一个很好的参考方向。


创业机会:本地消费类、生活类、商务类的一些应用。

  其实刚才卢刚也提到一个挣钱的问题,或者是商业模式的问题。我可以跟大家说,现在做移动互联网谁在挣钱,我可以说没有一个人在挣钱,除了少数做海外市场的,做国内市场没有任何一个挣到一分钱,少数挣钱的是挣VC的钱,不是移动用户的钱。

  第一波真正能挣钱的是游戏公司,手机游戏、手机网游,从用户那边能够直接收费的,可能就是手机游戏、手机网游,因为安卓、iPhone是非常好的游戏平台。

  第二真正能挣钱、做成一个生意的领域其实就是本地消费、生活、商务类的应用。

  一个网络它真正的价值体现在哪几个方面:一是他能覆盖多少用户;二他能覆盖多少用户的时间;三它覆盖多少用户所做的重要决策、花钱的决策。所以移动互联网和传统互联网相比,这点优势是大的。移动互联网其实用不了几年就可以覆盖七八亿用户,互联网现在也只不过覆盖到四亿。更关键的是日常花出去的钱,比如说一个用户假设日常的花销五、六千(买房除外),传统互联网能控制百分之多少?其实以前传统互联网只有在网上买一些大件、做一些大的决策,或者是正儿八经追一个女孩子,策划一个很好的晚饭的时候,会上网上去查一下哪里比较好,实际上日常的花钱是不被互联网控制的。

  比如说大家看携程很厉害,但是你看互联网的电子订房只占到日常订房的5%,所以互联网对传统的经济、传统决策、传统的花钱的影响是相当低的,低到只有个位数的地步。而在移动互联网,这个比例是高很多。

  我们做的布丁生活、布丁优惠券,大概就是四五个月的时间其实就已经超过三百万的用户,而且用户的活跃率特别特别高,国内排名靠前的所有商家开始找布丁要签合作条款,要给他们收入,或者是商业合作。比如我们投另外一个项目叫酒店达人,我们在短短的三个月的时间已经有一百万的用户,而且不光有用户。我们原来以为很多手机上的东西还不完善,很多人只不过是用它来查查,实际上发生的情况是用户在手机上订房,而且这个订房量还不小,所以说他们已经挣钱了。从这个角度来讲,这个领域也是非常非常好的创业方向,而这个领域哪怕做出一二百万用户、二三百万用户比做一个通用的应用,一二千万用户的价值更高。

  这个领域怎么启动呢?其实也相对简单,从现在往后的不同阶段,大家需要思考不同的问题。生活服务消费类现在四五千万人已经可以做了,因为在特定的领域,虽然四五千万只占人口基数的5%,但是他们的消费能力非常强,在特定的区域就不是5%,有可能是20%、30%,比如说酒店商旅里面,iphone androind用户,虽然人数只有10%,但是他们买掉了百分之三四十的机票、可能预定了百分之三四十的酒店。

  如果大家想了解一些数据的话,像淘宝上,每天从手机上发起的移动购买订单已经是超过了10万笔。而像凡客这样的公司一天可以达到10%的订单是从手机上发起的,所以说所有的数据,或者是数字虽然离成熟还差得远,但是这个领域已经开始启动了。

  现在移动互联网的创业的确已经非常非常的热门,但是市场竞争比起两三年前已经激烈得多。其实我们创业工场投资和孵化了非常多的项目,在市场上表现得非常好。但是说实在的这里面有很大的一个原因是因为他们做得早,我们是从2009、2010年开始做,比如说豌豆荚等,其实在当时只有一家在做,而且相当长的时间都没有竞争就做起来了。而现在的互联网竞争态势和二三年前已经不一样了,在国内大概有二万的开发者在跻身移动互联网领域,而且在很多领域已经有不错的公司,已经获得了早期用户的优势。而且去年大概有2亿美金左右投入给了国内的移动创业团队,所以有部分的项目或团队手里有资金优势。

  接下来大家在创业上,或者是投资方向选择上要注意什么呢?因为我自己也创过业,而且不论是在google,还是创新工场,也带过很多创业公司,所以我提一些我切身的建议:我日常去看一个移动互联网项目关注哪几个方面呢?其实只关注三点:第一点是方向;第二点团队;第三点执行。


创业建议一:方向,要大、要处于市场萌芽阶段、要收敛、切入点要具体。

  第一点,方向,首先是大方向,首先要选择一个足够大的方向。足够大意味着,可能意味着两个方面:第一你做的这个应用不管现在用户量有多小,潜在用户量要大。这个领域是不是20%、30%、40%的潜在用户都会用,潜在有几千万的用户都会用?如果说你做的非常狭窄,比如说给军迷做收藏类的软件,说白了,可能只有几十万的用户,这是不行的。所以你要选择的是放在足够大的方向上。或者是另外一种大,绝对用户数、潜在用户数不是一千万、二千万、三千万,但是这个领域里面相对来说比较值钱。比如说有二三百万用户,或者是在某一个行业领域里面,这个领域的毛利特别高,总市场的盘子特别特别高,所以你潜在是可以有几个亿,甚至更大的盈利的盘子让你以后慢慢去挖掘、收钱的。比如说很多电子商务网站,可能只有一百万的活跃的真实的IP,但已经是上市公司。所以这是另外一个考虑的方向。

  第二来说,这个市场处于什么样的发展阶段,因为市场大没有用,经常会看到一个人说这个市场好大,我们要去做,但是这个市场是不是给创业公司准备的。创业公司各方面资源都不多,真正适合创业公司的领域是什么呢?真正适合的领域是这个市场还是,早期萌芽阶段,市场规则谁都搞不清楚,谁都不知道这个东西的游戏规则怎么玩?只有在这个阶段才是适合创业公司去玩儿的。如果这个市场大家都知道的,该怎么玩都知道的,说白了这个市场就是一个堆钱、堆人的问题。堆钱和堆人,创业公司比得过大公司吗?当然不行,所以像这种已经尘埃落定的事情,哪怕表面上看上去还比较早期,你也不要去钻那个热门了。

  最后还要考虑一点,就是这个市场能不能收敛,有很多市场无论你再怎么做,其特性天生就是分散的,可能因为这个市场的特点、用户的特点、推广的特点、运营的障碍等。像这样的市场正常情况也不要去做。除非你发现了一个创新的商业模式,或者是创新的运营模式能有突破性的一种做法。天生不收敛的、很分散的市场通过你这样的方法可以收敛到市场一半的份额。大家考虑大的方向选择,这几个点是要先想清楚的。

  我看过很多很多非常好的团队,最早的创业第一步就选错了方向。比如说有个团队做教育展示软件,这个团队的技术非常好,做的东西非常漂亮,结果做到最后只有几千所学校,最后这个团队转到社交游戏领域,同样的团队就获取了巨大的成功。

  大方向是一个方面,另外一个方面就是切入点,相反的一个早期团队容易犯的错误就是,想太大,比如说经常见我,第一句话“我要做一个平台,我要让无数的公司,或者是创业者都用我的插件,然后我再把这个东西卖给大的品牌厂商、广告主”,这种东西我一听一般是不接受的。因为很少有这种现象,一个平台是从一个创业公司做出来的,或者是一个创业公司直接做平台就把东西做出来,哪怕是腾讯,也是从做一个具体的应用去获取用户群的,哪怕是360安全卫士最早的雏形也是木马专杀。所以在最早期的时候找到一个大方向,同时要找到一个切入点。你要干一件非常非常具体的,可能一开始是非常小的明确的用户群,要解决他一个具体的问题,只要能把这两件事情想清楚。虽然最后可以扩展到这个大方向,但是最早必须是非常明确的。

  创业建议二:就是团队,团队的组建要稳。

  大家在创业选完大方向的时候想两点:凭什么是我,无论是互联网,或者是移动互联网里面竞争者非常多,大家都是聪明人,你选定方向之后,至少有十个团队已经和你做一模一样的事情,第一个想的是凭什么,“凭什么是我成功,而不是其他人成功?凭什么是我能把这个事情做出来,而不是其他人?凭什么我能成功,而别人会失败。”其实这个事情真的是要好好的拷问一下,因为有特别多的案例都是雄心勃勃,其实做的时候完全不是这样的。你做这件事情的基本要素、成功的要素是什么?你这个团队所需要的技能、所需要的资源是不是都有了,或者是至少有了百分之七八十,你的团队是不是有别的团队没有的优势和长处,做这件事情是不是能最大的发挥你团队的长处?还有这些项目在往后做的时候,可能遇到的最大的困难、逆境、问题是什么?因为反正十个创业里面说白了有八个都会失败,如果这些失败,造成失败的原因是什么,最大的困难是什么。你团队里面的人,无论是技能、精神准备、各方面是不是已经对这些有预想,或者是,对潜在想象不到的困难是不是有解决方案,或者是能对付这些事情。很多人往往创业的时候,在这方面准备的非常不完备。现在的创业已经非常激烈的,所以早期的创业团队一开始就必须是相对比较完整的团队,做这件早期头六个月需要的才能、技能这个团队已经有了。

  第二是这个团队已经磨合过一段时间,必须已经相互认识很久。如果两个人在CSDN上今天见面,然后情投意合,回去就搭了一个团队、一个班子,很快找我是不非常不靠谱的事。创业遇到的问题是非常非常多的,如果两个人认识二三个月,大家不了解就想搭伙创业,我不说百分之百吧,95%稍微遇到一点困难就散伙、散架了。所以大家真的要想清楚这个事。

  如果你去做一个相对非常早、市场上还没有人做过,相对来说比较创新性的产品创业,对团队的要求比较多是在产品能力、技术能力方面。在这种情况下,非常重要的是要有一个技术的合伙人,如果是纯商业背景的团队是做不好这种产品和创业的。

  而另一方面,如果一个团队已经进入到一个偏运营的领域,或者说这个产品不是你第一个做的,市场上已经有人做了,这个领域已经进展到一定进度了,这个时候对团队来说,产品、运营、商务、领导、各方面的能力都要强。说白了进入到这个领域,这个团队需要有人能够有能力成熟的去当一个CEO。


 创业建议三:执行力,要快。

  早期的创业团队一般的特点是人、钱、资源都有限,所以其实撑不了太长时间,撑一年已经是很大的数字,撑半年,无论是你的精神、心理等已经很不错了。就算你的团队有特别多的钱、特别的多人,你的经营团队特别的厉害,但是市场的时间窗口也不是很长的。因为任何一个机会,如果你超过半年不出东西的话,市场上已经有人弄出来的,所以市场就给你半年的准备时间。你能不能在半年时间把东西做出来,把市场做好?所以这里面有很多很多的错误,是很多团队犯的,比如说早期把产品目标定得太大,比如说早期就多平台,我看到一个团队早期就开发html5、iOS、安卓三个平台,所有这些就不能让你3-4个月把产品原形推出来,然后进行快速反馈。所以在早期创业明确目标之后就是精简、砍掉所有不必要的东西,包括你在4个月之内把第一个产品做出来,不要说什么难度,我见过所有的计划、方案什么的,还没有见到任何一个在三四个月做出产品原形的,如果做不出来一定是你的产品计划有问题。

  创业建议四:开发平台的首选,有很多人问我是先做iPhone,还是先做安卓。首先来看iPhone,你只要做好产品,APP store上就会有人下载。但是也有它的劣势,用户群比较小、开发人群比较贵,相对来说往往很多的应用iPhone出现的比安卓早,所以你做的时候,往往iPhone已经有很多竞争对手,而在安卓上往往是没有竞争对手的。再来看安卓,安卓往往是反过来的,其实开发人员相对比较好招,但是平台非常不统一,做一个应用如果涉及到硬件的话,测试工作量很大,基本上你开发的东西可以在市场上30%的手机上用,如果想做到80%兼容会是一个很大的挑战。如果在安卓上想获取下载量,对你的团队运营能力要求相对较高,因为市场上有几十个应用、几十个商店,如果在安卓上做应用想获取大量的用户和下载量,在市场发展早期是比较容易,在现在的阶段是需要做很多的商务合作和开发的。

  从这个角度来讲很明显,对你的团队来说,选择哪个平台就看你要干什么,还有团队本身已有的构成是什么。iPhone用户比较挑剔,而且是比较高端的用户群。如果做比较创新的东西,你的团队产品能力相对比较强,在这种情况下,iPhone是非常好的启动平台,虽然我很支持安卓平台,你先在iPhone上做,把什么都调通了再往安卓上移上。

  如果你做的东西相对进入比较晚、团队运营能力又比较强,实际上是想把iPhone的东西往安卓上移的话,当然是在安卓上去做。

  我简单的介绍一下我们的创新工场,可能大家也已经知道很多了,所以我就不花太多时间,把时间让给其他人。

  简单说我们投资的阶段非常非常早,任何有雄心、有壮志的开发人员,不需要你已经很有成就,我们就可以去投资、孵化和帮助你,我们投了非常非常多的项目,可能有很多我们投的时候只有二三个人、三四个人,不需要有收益,大部分我们投的时候产品还没有出来,我们主要看的是你的产品能力。我们既有许朝军这样的创业者来做的,也有很多创业者是你从来没有听说过的。

  我们的孵化和其他最大的不一样就是,我们从早期的人员招募、技术指导、各方面来说提供一些,不是说帮助吧,因为创业还是靠你自己,提供一些少走弯路的建议,或者是一些分享。我觉得这个实际上可能对早期的团队来说,是帮助最大的。

  如果大家对移动创业,或者是创业有兴趣的话可以去我们的网站,或者是联系我们的投资经理。

2011年11月24日星期四

你应该把公司当成什么

"如果你想让你的员工把公司当家,那你应该把公司当成什么"

"作为老板,要想让员工把公司当家,那自己就不能把公司当家,而要把自己当成一个开发商,要盖一个好房子,让员工当家"
"原因很简单,如果老板把公司当家的话,员工就会认为自己是客人"
"如果老板事事关心,都像爱护自己家的东西一样,关心公司的每一样东西,员工自然就把自己当成客人了"

2011年11月9日星期三

职场随笔之:中国手机行业掠影

发信人: Trakl (灰喜鹊), 信区: Essay 
标  题: 职场随笔之:中国手机行业掠影 
发信站: 水木社区 (Thu Nov  3 15:28:02 2011), 站内 
  
手机行业是一个很新的行业,但现在不得不说这个行业已经消失了,取而代之的是一个更大的移动互联网行业。而今叱咤风云的也不是传统的手机行业巨头,而是Apple和Google,微软目前还不能够挑战这两者。号称MSN的三家(Motorola, SonyEricsson, Nokia)都在亏损的边缘徘徊,他们在3G时代纷纷落伍了;其中的M和S已经分别被Google与Sony收购,坊间也有Microsoft收购Nokia的传闻。软硬件之间的整合还在继续着。 
  
很多人都还记得摩托罗拉大哥大的样子,那似乎是香港电影中黑老大的专用装备。我曾经在中电赛龙供职过,当时的一位CEO李晓波曾经如是在员工大会上说:“人类社会有很多古老的行业,比如食品、服装等等,而在座的各位很幸运,大家都亲眼看到了一个新兴行业-手机行业的诞生与发展……”他说的确实是实话。 
  
中电赛龙1999年成立,是中国的第一家手机设计公司。注册地是加勒比海的一个小岛,所以是一家假外企。一开始中国电子CEC也有股份,后来也撤出了。2002年该公司收购了飞利浦法国手机研发中心,当时飞利浦在香港还保留了几百人的运营中心。从2002年到2004年是该公司的黄金时期,员工待遇也很优厚。曾经给飞利浦设计一款手机的设计费是几百万美金(而现在在国内通常也就是三、四十万人民币的样子)。随后其他的设计公司也纷纷出现,伴之而起的是国产手机的红火,比如海尔手机、CECT手机等等。在国内手机设计公司兴起之前,国产手机企业纷纷向韩国手机设计公司购买设计方案,甚至直接买来韩国手机成品再贴上自己的LOGO。国内手机设计公司出现之后,凭着相对低廉的设计费用,很快抢走了韩国设计公司的生意;而韩国手机设计公司的数量也从鼎盛时期的100多家萎缩成了20多家。然而这种风潮到了2005年就已成颓势,国产手机在外资品牌以及山寨黑手机的两面夹击之下苟延残喘,也殃及了与之共生的手机设计公司。曾经的最大一家手机设计公司是北京的德信无线,在公司楼顶上有“Let’s try our best!让我们努力吧!”的标语,也曾经建起了自己的办公大楼;而今也精减到了一、两百人,办公楼租给了ABB,自己搬到了亦庄东区。而中电赛龙也随着飞利浦于2006至2007年间退出手机行业(将手机业务卖给了中国电子旗下的深圳桑菲公司)迅速衰落。不得不说飞利浦以及西门子这样的公司才是真正的巨头,他们在手机行业大赚特赚的时候也抢进门来捞钱,而在其他公司还脑子里一片浆糊的时候就看出这个行业不好玩,很快就要烧钱了;于是迅速甩掉包袱,将其下的手机部门给钱就卖(当然员工也同时一并卖掉,省掉了将来裁员的大笔遣散费用,其实是很划算的盘算),专注于更有前景、进入门槛更高的行业;现在飞利浦、西门子以及GE是核磁共振的三个巨头,其他公司想挤进来是很困难的。中电赛龙于2007年中关了门,拖欠员工工资数月,欠了物业费几百万,拖欠供应商货款几千万,大老板已经提前撤资跑到国外度假了;其时公司的固定资产已是空壳(对一家设计公司而言,真正的资产是已有的和在做的项目以及客户关系),储存有关键项目数据的硬盘已被提前摘走。被欠薪的员工有的抱着液晶显示器要带回家,结果与前来堵门的供应商们发生了冲突。我亲眼见在公司关门之前刚上任的人事总监两眼布满红血丝、手捧方便面盒被多位大着肚子的孕妇堵在办公室里,他可怜兮兮地说:你们看我已经几天没有睡好觉了,而且这也是我今天吃的第一顿饭…其时已经是下午四点多了。当然最可怜的是那些已经与公司签订了合同的应届毕业生们,他们在即将毕业之时被告知:公司要关门了,录用合同取消。 
  
当然有人愁就有人欢喜。山寨手机的兴盛是因为台湾联发科MTK提供了一站式手机应用解决方案,极大地降低了手机研发的门槛,进而降低了手机研发费用以及整机的成本。国产手机厂商也纷纷采用MTK方案。在上海有两家手机设计公司龙旗和SIMCOM也借MTK方案起家,现在都做得有声有色,并且涉足制造代工。他们利用现成的手机板子,再根据客户所喜好的外观可以很快地出货;一个同样的手机板子可以推出几十款不同样式的手机。龙旗现在已经在给摩托罗拉提供MTK设计方案并由富士康代工生产。而SIMCOM也在北京成立了一个智能手机研发部门,也在给一些日本客户比如TOSHIBA供货。另外一方面,手机的代工大厂比如富士康、美国捷普、贝尔罗斯以及比亚迪也不甘心仅仅做一个从事制造、组装、出货的代工厂只赚血汗钱,也希望能够涉足ODM;但实际成效却不好。富士康北京于2007年分别从诺基亚北京和诺基亚圣地亚哥挖了两个人组建一个手机ODM研发团队,但并没有维持多长时间。德信无线曾经经由爱科泰为诺基亚设计一款TD-SCDMA手机,最后项目死掉;于是就将这个团队几十号人卖给了比亚迪,比亚迪从诺基亚美国挖来一个人来做这家新公司的总经理;但在今年上半年我在新京报上读到该公司的一些员工集体起诉讨要薪水的消息,该公司的很多员工也跳槽到了索尼爱立信。工厂文化看来是与提倡创新以及自主性的研发机制不相容的。 
  
媒体关注的多是行业的前沿,然而行业的另一个不容忽视的重要趋势是低成本智能手机,毕竟舍得花几千块买高端智能手机的人是少数,大多数人的心理价位是千元以下,当然他们也希望使用智能手机(人不论贫富及学识多寡,其基本的思想与情感都是很类似的)。高端智能手机多采用TI以及高通的芯片,但是高通已经在向低成本3G芯片进军。高通已经在北京、上海成立了研发中心,并且在上海组建了一个手机设计团队提供整机的reference design,这意味着只要客户购买高通的芯片,高通将免费赠送整机的设计方案,以降低客户的成本,加快客户的产品上市时间。另据报道诺基亚将采用意法半导体的低成本3G芯片用于自己的低端Windows Phone。至于在2G时代大展拳脚的MTK以及展讯能否在3G芯片上有所作为,推出更为低廉的3G芯片,不得而知。 
  
再回头谈论一线的外资手机品牌公司。前面提到了软件与硬件之间的整合,其实现在的手机产品的核心已经是软件,或者说基于移动互联网的软件应用以及服务了。这其实与PC行业是蛮类似的。现在已经形成了几大联盟:苹果、Google+Motorola、Microsoft+Nokia。苹果已经是孤独求败,以一己之力打造出了一个包括终端产品(Ipod, Iphone, Ipad, 据说还有Icloud)+网上商店+与运营商利润分成机制的、完整的产业生态链,在产品的背后是苹果自家的封闭操作系统以及自家的手机芯片(苹果也设计芯片),苹果也号召了众多软件应用开发者汇集在它的周围。现在的苹果其实并不主要凭借卖硬件产品赚钱了。利用网上商店苹果进而与众多音乐人也结成了利益同盟,而我们还记得没有乔布斯就不会有《玩具总动员》。而其他竞争对手们虽然多如过江之鲫,纷纷采用Android,但也还是在靠卖硬件产品赚钱。苹果已经成了一个帝国,而乔布斯也成了新时代的传奇。而在十年前的硅谷,苹果公司的雇员都羞于在朋友面前承认自己是苹果的员工。 
  
这是一个激烈竞争、激烈动荡的行业,也是一个包容性极大的行业,无法统计全球有多少人依靠这个行业而生。摩托罗拉、诺基亚在行业里的地位都曾经象神一样,现在是苹果。但正如《红楼梦》中的“好了歌”中的感叹:“你方唱罢我登场”,没有人能够永远欢笑。《圣经》中的大卫王也在哀悼他的朋友时唱到:“大英雄竟也仆倒……”
  
惟一不会改变的,是江湖。 
  

2011年11月5日星期六

窄众需求

大市场,窄应用  

2011-10-24 09:22:55|  分类: 产品 |字号 订阅
有段时间我很迷FourSquare,它被墙之后,渐渐又冷了。再后来玩开开,因为陪我一起玩的人不多,渐渐又冷了。最近两年有几位业内人士(包括我眼中的业界精英)不解问我:签到有个屁的意思啊?解释许久,他们仍难以索解。从数据上来看,纯粹的签到在国内确实是个窄众应用,但并不影响它在业内的名声。

几个月前,一件小事令我印象深刻。有位同行来咨询我,问我对一款主打“图文并茂”的美食分享产品的看法。我看了看说,用户拍摄相片质量这么差,一看就没胃口吖,此产品前景堪忧。这位同行立刻反驳说,不对,我这个吃货一看图片就食指大动,反而是大众点评那种纯文本的用户评价索然无味。

由于他是以用户身份,而非业内人士的身份提出意见,我当时就羞愧了。老纸又主观了。同样一张美食相片,我看了大倒胃口,他看了口水横流,个体差异极其鲜明。既然鸡同鸭讲,我又有什么资格张口即喷呢?

另一个小小例子关于“讲笑话”这款应用,主打“语音笑话UGC”。我一开始极不看好,觉得需求弱,产品个性也不够强,尤其无法直观地辨识内容质量,大大降低了信息甄别获取的效率,恐不长久。结果又过了两三个月一看,嘿,它不仅活着,还涌现出来一大批讲笑话专业户,平均每人讲十几条笑话,质量也不低。虽然远远谈不上大红大紫,至少人家顽强地生长着,有了一定数量的优质内容沉淀。

这时我再去试图分析它的用户心态,很多人并没有原创笑话的本事,但配音效果佳,绘声绘色地讲出来,相当于二次创作,颇有成就感。这批在我预料之外的骨干用户,支撑起了“讲笑话”的血脉。

类似的情景还有很多很多。以前我经常说,老纸看好的项目未必成功,不看好的则一定失败。现在已经不敢再开这种黄腔。只能说,我不看好的项目很难成长为日访问百万级的大产品,不过能捕捉到目标受众的话,生存发展可能也不是问题。所以别人来咨询新产品,我会指出一些显而易见的硬伤,但不再轻言成败,因为他面向的用户群,很可能是我完全陌生,毫无了解的。

互联网的市场很大很大,已有十几亿的人口,其中显而易见的,共性强烈的的用户需求基本已被填满。这时再去追求百万访问级的大产品,难,真难,劝君莫作痴汉。还有什么共性强烈的需求是你能看见,别人看不见,你能满足,别人搞不定的呢?

在互联网蓬勃发展了15年之后,新产品主打的必然是个性,包括产品的个性,需求的个性,用户群的个性。在不断细分的领域内找到并谄媚你的用户。而四亿人口的国内市场,能容纳千百种奇奇怪怪的个性,异想天开的心态,将人类的多样性发挥得淋漓尽致。没有一个human敢说,自己一下子就能看懂市场上1/10的用户需求,恰恰是这参差多态,给予了新产品生存发展的机会。

近来,我越来越认同欧美投资领域流行的一个观点,那些老奸巨猾的投资商跟创业者说:“想清楚了就去做,别问东问西。”试想,当年克罗利如果“虚心听取意见”来判断是否创立FourSquare,哪里还有如今的签到市场。即便在签到发展近3年之后,用户群也不足大盘的10%,这意味着你现在去跟10个人谈地理位置签到,9个人会无情地笑话你,奚落你,打击你。然而FourSquare注册用户今年6月业已突破了1000万大关。

这个案例,也就是“少问,多做”这句创业箴言的本意。在数亿用户的大市场里面,即便是非常窄的应用也有百万级的用户基础。创业者作前期调研的时候,除非确保访谈的一定是目标用户,否则你鸡同鸭讲,所得到的回答便全是误导。即便访谈目标用户吧,如果没有真实的应用情景来启发,全凭脑补,他的回答也很难靠谱。不如快速拿出原型推向市场,让数据告诉你答案。

因此,主观与敏捷已经成为了当下新产品发布的不二法门。不过这条金科玉律完全不适合大中型公司,很容易被滥用,上一大堆烂到无法言说的臭作——反正他照领工资。只有自负其责,个人荣辱完全与项目绑定的创业小队,才有资格讲“主观”,讲“敏捷”。

至于一开始从窄众做起的个性化应用,是否有机会慢慢生长成大树,这很难讲。我们不能将“做大”作为赤裸裸的产品追求——就像同样是个性化应用起家,既有Twitter参天大树,也有消沉的Delicious昔日明星。未必两家产品创始人谁比谁更牛逼,只是Twitter恰恰具备了更强的感染力和流行性罢了。但创始人如果不能追随自己的产品灵感,非要计较天花板的高低,很可能一事无成,蹉跎终老。

说白了,这就是命。你的生活方式与知识结构决定你的灵感,灵感衍生出来的主题与个性又决定了产品的市场前景。创业最顺的路径不是嗅探市场流行风向,而是听从自己的心。当成百上千个项目组都具备强悍的研发能力,足以左右成败的,既不是你的点子多,技术强,资源丰厚;也不是你跑得快,肯加班,笨鸟先飞;比别人更了解某一个“窄众市场需求”(大路货也轮不到你来发现),这才是最关键的竞争因素。

“对窄需求的把握,产品灵感,研发能力”,三者所产生的化学反应决定了新产品的走势。行业里很多人只重视后两条,但我觉得,第一条才是新产品新项目的基石。这更多取决于“你是个什么样的人”——唯有从你的兴趣爱好、人生经历、生活习惯中,才能真正把握好需求。所谓仁者见仁,智者见智,淫者见淫。

叹口气,这就是命。
2人 |  分享到:         阅读(2967)| 评论(28)| 引用 (0) |举报

2011年11月4日星期五

Fwd: Weico :从产品到产品族

桌子好

通过 Google 阅读器发送给您的内容

Weico :从产品到产品族

<http://www.ifanr.com/wp-content/uploads/2011/11/PB032848.jpg>

eico design 的名字,正被越来越多的手机玩家所熟知,我们曾经在一年前就做过深入的访谈 ,而从 eico 延伸出来的 Weico 品牌,则是他们团队的一次战略突破。

今年 7 月我们对 Weico 的产品化探索作了思考和评论。时隔 4 个月,他们在产品化道路上走得更远,推出了 WeicoPro(收费版 Weico)、WeicoGIF(声控相机)、WeicoMe(“心情微博”)等新产品,设计系出身的 Weico 正在转变为一个平台品牌。

数据的变化

在上一次访谈中我们得知 Weico 已经独立运营,当时的团队规模是 8 个人,4 名开发人员 4 名设计师,现在 Weico 团队规模扩张到了 12 人,增加的人员配置全部是开发工程师。而 11 月 2 日,Weico 刚刚发布招聘 Windows Phone 工程师的通告,这显示出了一种坚定的决心。

根据 Weico 首席技术官孙俊峰的介绍,Weico 作为一个大品牌,旗下将开发多款 app 产品:

一部分可以称为“老 Weico 系”,即围绕 Weico 微博客户端衍生出更多品种,如 WeicoPro、Weico Android 版及将来的 Windows Phone 版。
一部分称为“泛微博系”,比如已经推出的 WeicoMe,与微博还有一丝关联,但不甚紧密。
还有一部分则是全新独立的产品,如 WeicoGIF,它作为一款声控相机,可以实现一键分享到新浪微博、腾讯微博、人人网。


Weico 将在 11 月 11 日成立一周年之际推出一款新产品,我们猜测它是属于第三阵营的“全新产品”。

“为什么用 Weico 品牌来做延伸产品?”eico 首席创新官张伟(Rokey)在回答这个问题时提到:“用户数据的积累,可以帮助 Weico 对用户行为进行分析,从而通过产品来满足用户的需求。”

下面是一组 Weico 的运营数据:

用户数 300 万,8 月数据是 150 万
日活跃用户数 50 万,8 月数据是 40 万
周活跃用户数 100 万,8 月数据是 60 万
用户分享照片 2500 万张,7 月数据是 1000 万张
用户每天分享照片 20 万张,7 月数据是 8 万张


 

风险与机会

这是一个风险与机会并存的领域。Weico 昨天公布的运营数据中,用户数达到 300 万,虽然在 App Store 社交类应用的排名仍然占据第一位,但由于 Weico 已经把自已定义为一个产品平台,其触角必然扩展到“微博系”之外,所以从绝对数值来看,这并不是一个特别高的量级,市场上不少应用的用户数是超过它的,他们有基数更大的用户行为数据。这对于 Weico 来说确实是风险。

Weico 的优势在哪里?“Made by eico。”

联想到 10 月 31 日 TC Disrupt 媒体见面会上,有媒体问李开复:“今天是 3Q 大战一周年,你认为一年来中国互联网最大的变化是什么?”李开复回答:“用户体验”和“开放平台”。

一年来,各家开放平台百花齐放,各地的开发人员和设计师瞬间变得稀缺起来。由于这样的市场需求,随便几人扛个“Android 产品开发”大旗就能受到投资者和媒体的追捧,这样的团队中不乏“大牛”,但考虑到教育系统及人才储备的滞后性,优秀的工程师和设计师只能占少数——如曾经的金融热、英语热,鱼龙混杂现象当然是普遍存在的。

Weico 天生流淌设计师的血液,我们从 eico 合作伙伴如 Google 音乐、HTC TouchFlo 3D、搜狗输入法、魅族中,可以感受一股“清新风”——这才是 Weico 的特点和优势。正如 CEO 许士彦(Ricky)所言,设计师做 app 产品,国内没有先例,国外也仅 iconfactory 一家。现在做产品言必称用户体验,但真正践行的公司并不多。Weico 产品如果能够提供优异的用户体验,把用户“伺候”好,在中国市场通过差异化竞争走出一条自已的路,是完全可能的。

<http://www.ifanr.com/wp-content/uploads/2011/11/IMG_0682.jpg>

最大的困难

当然,设计师做产品也有天然的不足。我问 Rokey 最大的困难来自哪里,他说“设计师身份”。相对于工程出身的产品公司,设计师往往会过于投入到细节中,过于追求产品的“漂亮”,而忽略(或重视不起来)功能性和稳定性。在昨天的媒体交流会上,Ricky 现场收到一名提问者关于 Weico Android 版不稳定的反馈,Ricky 承认存在不稳定的情况,正在优化中。据 Weico 商务拓展总监傅京南(Tt)介绍,Weico 正在通过人才招募来弥补产...



2011年11月2日星期三

2012年的机会

李开复:2012年Android、iOS用户将达1.2亿

ugmbbc发布于 2011-11-03 10:32:54|645 次阅读 字体:  打印预览   分享至新浪微博 转贴到开心网 分享到校内人人网 添加到Google书签

cnBeta 人物

2011移开发者大会今天在北京国家会议中心举行,创新工场董事长兼CEO李开复进行了主题演讲。他表示,移动互联网在未来1年内将已经蔓延式增长,Android及iOS用户规模将突破1.2亿。李开复表示,目前中国的移动互联网仍然没有普及,除去塞班平台上的用户,国内深度 移动互联网用户仅在5000万的规模,但是到2012年随着 Android智能手机价格下降、智能 手机普及率提升,将有数亿的新用户涌入,预计2012年国内Android及iOS用户规模将突 破1.2亿。

http://img.cnbeta.com/newsimg/111103/10325701025299121.jpg

李开复表示,除用户层面的蔓延之外,移动互联网还将迎来设备蔓延、娱乐蔓延、内容 蔓延、消费蔓延以及创业者的蔓延。

他认为,移动互联网时代创业者的创业成本极大的降低,由以前的上千万降至100万— 200万。但创业者创业时不要想太多、太固执,移动互联网时代的创业需要新的模式,更 瘦的创业做法更适合创业者,“他们只要看好大的趋势,找到好的突破点,先寻找小的用户群,再慢慢扩张”,贪大贪全并不可取。

李开复认为,移动互联网也会经过PC互联网的三个阶段:门户与工具,娱乐社交游戏, 消费与视频,在2010年移动互联网已经基本完成了门户与工具的布局,目前娱乐社交及 游戏类应用正在快速成长。

格调不高怎么办 -- 韩寒

格调不高怎么办

 (2011-11-02 18:42:22)
韩寒
标签: 

杂谈

自从《脱节的国度》不见了以后,一直都未写东西。因为我着实是一个写的不勤奋的人,每次写完,隔日不见,真的扫兴,而且国家部门繁多,就算宣传部门和新闻出版部门觉得没问题,所有配备了帕萨特以上公务车的部门也都可以一个电话把你文章删了。其中最仁慈的反而是某地方的公安部门,08年有一天我写了一篇文章,事隔一年多,他们删除了这篇文章。难怪大家都说公安出警慢。没错。删文章的地方太多了,就不知道该怎么下笔了。

 

从事了这个工作大概十三年,我发现文化工作者在地位上真是一个特别下三滥特别窝囊废的工种。这个工种所出产的作品由于受到诸多的限制,所以肯定没有那么奇特的经历更加精彩。我来说一些小故事。

 

在中国的出版行业,其实是没有官方的审查的。大家都应该觉得很奇怪,因为这违背了常识。但是可以告诉大家,出版行业的确没有审查。这是因为中国每年要出几十万本书,实在审查不过来。而且我相信管那些读书人的同志大部分都不爱读书,所以图书审查其实一直由出版社独立完成。

 

但是这样一来岂不是百花齐放了。当然不是。比较专业的说,这叫事后审查制。事后审查制其实要比事前审查制更加紧,杀伤力和副作用更大。这点用过事后避孕药的朋友肯定深有感触。

 

只有拥有书号才能出版,只有出版社才能发书号,只有官方才能有出版社,所以从源头上,自由的出版其实是不可能的。而由于大量的国有出版社能力不济,很多民营文化公司开始运营图书出版。出版的方式就是合作出版或者从出版社那里购买一些书号。但这依然不能改变出版现状,因为出版社依然是终审方。而一本书如果不让出版,在以往理由是反革命,后来反革命这个词不太出现了,因为反革命既然是不好的,那岂不成了鼓励革命。而官方认为,革命工作已经完成,所以既不能反革命,也不能革命,群众最好的生活方式就是呆着。于是现在不能出版的理由就是格调不高。我第一本书《三重门》就是因为格调不高,迟迟不能出版。格调不高是致命的,因为文笔太差可以改,逻辑不清可以理,唯独格调不高让人头疼,你也不知道怎么能让自己的格调提高一点。你问他什么是格调,他也不知道。一直到现在,我才明白了,格调其实就是割掉的意思,格调不高就是割掉的不够高,你以为象征性的把脚底板的老茧磨磨平就能从事文化行业了么,你要割掉的够高。凡是保留腰以下部分的,从事文化行业明显还是会显得雄性气息太浓厚。

 

我是一直饱受审查之苦的。但在格调稍微高了一点以后,我还是侥幸可以出版图书,并且因为图书的畅销,有的时候还稍微可以在小问题和出版方争取格调稍微降低一点。每次写作前,我都要进行一次自我审查。也许很多没有从事过这个行业的朋友会觉得我们这样做特别怂,不够MAN。比如当年《独唱团》出版前遇到很多的困难,一些朋友看不下去了,说你太娘们了,这要是我,不要书号了,直接拿到印刷厂去,印个几十万本,这就开卖了。我欣赏这位朋友的没有格调,但他们不知道印刷厂只有收到了出版社开具的委托印刷单以后才能开机印刷,否则你非但印不了一本,人家就报警了。其次就算你爹开了一个印刷厂,你印刷出了几十万本,你没有书号,就没有一家书店和报刊亭是会进你的货的。连卖盗版的都不敢帮你卖。也许这位朋友会说,那我就放到网上去,在淘宝卖。那我告诉你,在淘宝销售图书,首先你得拥有资质,其次你不能随手拍一个封面就上架了,你必须输入书号,当系统把你输入的书号和书名对应起来,你才能上架。

 

所以一直到今天,所有的文化人都在进行着痛苦的自我审查。那我们能否指望出版社突然格调降低呢,这当然也不可能,一旦出版社有格调降低的迹象,由于都是国有单位,官方再指派一个社长过去就是。而那些格调降低的同志就可以去妇联残联养养老。事后审查制最恐怖一环在于惩罚,就是我不管你,但你要是出版了什么幺蛾子,我罚死你。轻则撤职撤社,重则投进大牢,所以你看着办吧。

 

 至于我本人,虽然每一篇文章都经过了自我审查和阉割,但有的时候难免也会出现阉割的形状不符合认证的情况。这个和每个出版社的紧张程度有关系。比如我最新的小说就被枪毙了,因为新小说里的主人公姓胡,虽然我才写了五千字,但是出版社认为这必然是有政治隐喻的。当我明白了要避讳的时候再改姓已经晚了。但避讳要记住勿忘前朝,我还有一篇小说中,因为出现了“江河湖海”四个字,被更直接的枪毙了。如果说之前我犯了错误的话,那这一个就是两倍的错误。连我都不能原谅我自己,明知道惹不起,怎么连躲都没躲利索呢。

 

我不知道一个文化人提笔就哆嗦的国家怎么能建设成文化强国,一个因为要避讳常委所以在谷歌上搜索不到李白的国家怎么能建设成文化强国。我不知道该怎么一个文化体制改革法,反正我只有一个愿望,就是韩正老师别再升官了,要不然我就搜不到我了。

 

 

 

谨以此文纪念一期被停的《独唱团》以及两期被停的《大方》。

2011年11月1日星期二

Writing udev rules

Writing udev rules

by Daniel Drake (dsd)
Version 0.74

The most recent version of this document can always be found at: 
http://www.reactivated.net/writing_udev_rules.html

Contents

Introduction

About this document

udev is targeted at Linux kernels 2.6 and beyond to provide a userspace solution for a dynamic /dev directory, with persistent device naming. The previous /dev implementation, devfs, is now deprecated, and udev is seen as the successor. udev vs devfs is a sensitive area of conversation - you should read this document before making comparisons.

Over the years, the things that you might use udev rules for has changed, as well as the flexibility of rules themselves. On a modern system, udev provides persistent naming for some device types out-of-the-box, eliminating the need for custom rules for those devices. However, some users will still require the extra level of customisation.

This document assumes that you have udev installed and running OK with default configurations. This is usually handled by your Linux distribution.

This document does not cover every single detail of rule writing, but does aim to introduce all of the main concepts. The finer details can be found in the udev man page.

This document uses various examples (many of which are entirely fictional) to illustrate ideas and concepts. Not all syntax is explicitly described in the accompanying text, be sure to look at the example rules to get a complete understanding.

History

  • April 5th 2008 v0.74: Typo fixes.
  • December 3rd 2007 v0.73: Update for new udev versions, and some miscellaneous improvements.
  • October 2nd 2006 v0.72: Fixed a typo in one of the example rules.
  • June 10th 2006 v0.71: Misc changes based on recent feedback - thanks!
  • June 3rd 2006 v0.7: Complete rework, to be more suited for the modern-day udev.
  • May 9th 2005 v0.6: Misc updates, including information about udevinfo, groups and permissions, logging, and udevtest.
  • June 20th 2004 v0.55: Added info on multiple symlinks, and some minor changes/updates.
  • April 26th 2004 v0.54: Added some Debian info. Minor corrections. Re-reverted information about what to call your rule file. Added info about naming network interfaces.
  • April 15th 2004 v0.53: Minor corrections. Added info about NAME{all_partitions}. Added info about other udevinfo tricks.
  • April 14th 2004 v0.52: Reverted to suggesting using "udev.rules" until the udev defaults allow for other files. Minor work.
  • April 6th 2004 v0.51: I now write suggest users to use their own "local.rules" file rather than prepending "udev.rules".
  • April 3rd 2004 v0.5: Minor cleanups and preparations for possible inclusion in the udev distribution.
  • March 20th 2004 v0.4: General improvements, clarifications, and cleanups. Added more information about writing rules for usb-storage.
  • February 23rd 2004 v0.3: Rewrote some parts to emphasise how sysfs naming works, and how it can be matched. Updated rule-writing parts to represent udev 018s new SYSFS{filename} naming scheme. Improved sectioning, and clarified many points. Added info about KDE.
  • February 18th 2004 v0.2: Fixed a small omission in an example. Updated section on identifying mass-storage devices. Updated section on nvidia.
  • February 15th 2004 v0.1: Initial publication.

The concepts

Terminology: devfs, sysfs, nodes, etc.

A basic introduction only, might not be totally accurate.

On typical Linux-based systems, the /dev directory is used to store file-like device nodes which refer to certain devices in the system. Each node points to a part of the system (a device), which might or might not exist. Userspace applications can use these device nodes to interface with the systems hardware, for example, the X server will "listen to" /dev/input/mice so that it can relate the user's mouse movements to moving the visual mouse pointer.

The original /dev directories were just populated with every device that might possibly appear in the system. /dev directories were typically very large because of this. devfs came along to provide a more manageable approach (noticeably, it only populated /dev with hardware that is plugged into the system), as well as some other functionality, but the system proved to have problems which could not be easily fixed.

udev is the "new" way of managing /dev directories, designed to clear up some issues with previous /dev implementations, and provide a robust path forward. In order to create and name /dev device nodes corresponding to devices that are present in the system, udev relies on matching information provided by sysfs with rules provided by the user. This documentation aims to detail the process of rule-writing, one of the only udev-related tasks that must (optionally) be performed by the user.

sysfs is a new filesystem to the 2.6 kernels. It is managed by the kernel, and exports basic information about the devices currently plugged into your system. udev can use this information to create device nodes corresponding to your hardware. sysfs is mounted at /sys and is browseable. You may wish to investigate some of the files stored there before getting to grips with udev. Throughout this document, I will use the terms /sys and sysfs interchangeably.

Why?

udev rules are flexible and very powerful. Here are some of the things you can use rules to achieve:

  • Rename a device node from the default name to something else
  • Provide an alternative/persistent name for a device node by creating a symbolic link to the default device node
  • Name a device node based on the output of a program
  • Change permissions and ownership of a device node
  • Launch a script when a device node is created or deleted (typically when a device is attached or unplugged)
  • Rename network interfaces

Writing rules is not a workaround for the problem where no device nodes for your particular device exist. Even if there are no matching rules, udev will create the device node with the default name supplied by the kernel.

Having persistently named device nodes has several advantages. Assume you own two USB storage devices: a digital camera and a USB flash disk. These devices are typically assigned device nodes /dev/sda and/dev/sdb but the exact assignment depends on the order which they were originally connected. This may cause problems to some users, who would benefit greatly if each device could be named persistently every time, e.g. /dev/camera and /dev/flashdisk.

Built-in persistent naming schemes

udev provides persistent naming for some device types out of the box. This is a very useful feature, and in many circumstances means that your journey ends here: you do not have to write any rules.

udev provides out-of-the-box persistent naming for storage devices in the /dev/disk directory. To view the persistent names which have been created for your storage hardware, you can use the following command:

# ls -lR /dev/disk

This works for all storage types. As an example, udev has created /dev/disk/by-id/scsi-SATA_ST3120827AS_4MS1NDXZ-part3 which is a persistent-named symbolic link to my root partition. udev creates/dev/disk/by-id/usb-Prolific_Technology_Inc._USB_Mass_Storage_Device-part1 when I plug my USB flash disk in, which is also a persistent name.

Rule writing

Rule files and semantics

When deciding how to name a device and which additional actions to perform, udev reads a series of rules files. These files are kept in the /etc/udev/rules.d directory, and they all must have the .rules suffix.

Default udev rules are stored in /etc/udev/rules.d/50-udev.rules. You may find it interesting to look over this file - it includes a few examples, and then some default rules proving a devfs-style /dev layout. However, you should not write rules into this file directly.

Files in /etc/udev/rules.d/ are parsed in lexical order, and in some circumstances, the order in which rules are parsed is important. In general, you want your own rules to be parsed before the defaults, so I suggest you create a file at /etc/udev/rules.d/10-local.rules and write all your rules into this file.

In a rules file, lines starting with "#" are treated as comments. Every other non-blank line is a rule. Rules cannot span multiple lines.

One device can be matched by more than one rule. This has it's practical advantages, for example, we can write two rules which match the same device, where each one provides its own alternate name for the device. Both alternate names will be created, even if the rules are in separate files. It is important to understand that udev will not stop processing when it finds a matching rule, it will continue searching and attempt to apply every rule that it knows about.

Rule syntax

Each rule is constructed from a series of key-value pairs, which are separated by commas. match keys are conditions used to identify the device which the rule is acting upon. When all match keys in a rule correspond to the device being handled, then the rule is applied and the actions of the assignment keys are invoked. Every rule should consist of at least one match key and at least one assignment key.

Here is an example rule to illustrate the above:

KERNEL=="hdb", NAME="my_spare_disk"

The above rule includes one match key (KERNEL) and one assignment key (NAME). The semantics of these keys and their properties will be detailed later. It is important to note that the match key is related to its value through the equality operator (==), whereas the assignment key is related to its value through the assignment operator (=).

Be aware that udev does not support any form of line continuation. Do not insert any line breaks in your rules, as this will cause udev to see your one rule as multiple rules and will not work as expected.

Basic Rules

udev provides several different match keys which can be used to write rules which match devices very precisely. Some of the most common keys are introduced below, others will be introduced later in this document. For a complete list, see the udev man page.

  • KERNEL - match against the kernel name for the device
  • SUBSYSTEM - match against the subsystem of the device
  • DRIVER - match against the name of the driver backing the device

After you have used a series of match keys to precisely match a device, udev gives you fine control over what happens next, through a range of assignment keys. For a complete list of possible assignment keys, see the udev man page. The most basic assignment keys are introduced below. Others will be introduced later in this document.

  • NAME - the name that shall be used for the device node
  • SYMLINK - a list of symbolic links which act as alternative names for the device node

As hinted above, udev only creates one true device node for one device. If you wish to provide alternate names for this device node, you use the symbolic link functionality. With the SYMLINK assignment, you are actually maintaining a list of symbolic links, all of which will be pointed at the real device node. To manipulate these links, we introduce a new operator for appending to lists: +=. You can append multiple symlinks to the list from any one rule by separating each one with a space.

KERNEL=="hdb", NAME="my_spare_disk"

The above rule says: match a device which was named by the kernel as hdb, and instead of calling it hdb, name the device node as my_spare_disk. The device node appears at /dev/my_spare_disk.

KERNEL=="hdb", DRIVER=="ide-disk", SYMLINK+="sparedisk"

The above rule says: match a device which was named by the kernel as hdb AND where the driver is ide-disk. Name the device node with the default name and create a symbolic link to it named sparedisk. Note that we did not specify a device node name, so udev uses the default. In order to preserve the standard /dev layout, your own rules will typically leave the NAME alone but create some SYMLINKs and/or perform other assignments.

KERNEL=="hdc", SYMLINK+="cdrom cdrom0"

The above rule is probably more typical of the types of rules you might be writing. It creates two symbolic links at /dev/cdrom and /dev/cdrom0, both of which point at /dev/hdc. Again, no NAME assignment was specified, so the default kernel name (hdc) is used.

Matching sysfs attributes

The match keys introduced so far only provide limited matching capabilities. Realistically we require much finer control: we want to identify devices based on advanced properties such as vendor codes, exact product numbers, serial numbers, storage capacities, number of partitions, etc.

Many drivers export information like this into sysfs, and udev allows us to incorporate sysfs-matching into our rules, using the ATTR key with a slightly different syntax.

Here is an example rule which matches a single attribute from sysfs. Further detail will be provided later in this document which will aid you in writing rules based on sysfs attributes.

SUBSYSTEM=="block", ATTR{size}=="234441648", SYMLINK+="my_disk" 

Device hierarchy

The Linux kernel actually represents devices in a tree-like structure, and this information is exposed through sysfs and useful when writing rules. For example, the device representation of my hard disk device is a child of the SCSI disk device, which is in turn a child of the Serial ATA controller device, which is in turn a child of the PCI bus device. It is likely that you will find yourself needing to refer to information from a parent of the device in question, for example the serial number of my hard disk device is not exposed at the device level, it is exposed by its direct parent at the SCSI disk level.

The four main match keys introduced so far (KERNEL/SUBSYSTEM/DRIVER/ATTR) only match against values corresponding to the device in question, and do not match values from parent devices. udev provides variants of the match keys that will search upwards through the tree:

  • KERNELS - match against the kernel name for the device, or the kernel name for any of the parent devices
  • SUBSYSTEMS - match against the subsystem of the device, or the subsystem of any of the parent devices
  • DRIVERS - match against the name of the driver backing the device, or the name of the driver backing any of the parent devices
  • ATTRS - match a sysfs attribute of the device, or a sysfs attribute of any of the parent devices

With hierarchy considerations in mind, you may feel that rule writing is becoming a little complicated. Rest assured that there are tools that help out here, which will be introduced later.

String substitutions

When writing rules which will potentially handle multiple similar devices, udev's printf-like string substitution operators are very useful. You can simply include these operators in any assignments your rule makes, and udev will evaluate them when they are executed.

The most common operators are %k and %n. %k evaluates to the kernel name for the device, e.g. "sda3" for a device that would (by default) appear at /dev/sda3%n evaluates to the kernel number for the device (the partition number for storage devices), e.g. "3" for /dev/sda3.

udev also provides several other substitution operators for more advanced functionality. Consult the udev man page after reading the rest of this document. There is also an alternative syntax for these operators -$kernel and $number for the examples above. For this reason, if you wish to match a literal % in a rule then you must write %%, and if you wish to match a literal $ then you must write $$.

To illustrate the concept of string substitution, some example rules are shown below.

KERNEL=="mice", NAME="input/%k" KERNEL=="loop0", NAME="loop/%n", SYMLINK+="%k" 

The first rule ensures that the mice device node appears exclusively in the /dev/input directory (by default it would be at /dev/mice). The second rule ensures that the device node named loop0 is created at/dev/loop/0 but also creates a symbolic link at /dev/loop0 as usual.

The use of the above rules is questionable, as they all could be rewritten without using any substitution operators. The true power of these substitutions will become apparent in the next section.

String matching

As well as matching strings exactly, udev allows you to use shell-style pattern matching. There are 3 patterns supported:

  • * - match any character, zero or more times
  • ? - match any character exactly once
  • [] - match any single character specified in the brackets, ranges are also permitted

Here are some examples which incorporate the above patterns. Note the use of the string substitution operators.

KERNEL=="fd[0-9]*", NAME="floppy/%n", SYMLINK+="%k" KERNEL=="hiddev*", NAME="usb/%k" 

The first rule matches all floppy disk drives, and ensures that the device nodes are placed in the /dev/floppy directory, as well as creating a symbolic link from the default name. The second rule ensures that hiddev devices are only present in the /dev/usb directory.

Finding information from sysfs

The sysfs tree

The concept of using interesting information from sysfs was briefly touched upon above. In order to write rules based on this information, you first need to know the names of the attributes and their current values.

sysfs is actually a very simple structure. It is logically divided into directories. Each directory contains a number of files (attributes) which typically contain just one value. Some symbolic links are present, which link devices to their parents. The hierarchical structure was touched upon above.

Some directories are referred to as top-level device paths. These directories represent actual devices that have corresponding device nodes. Top-level device paths can be classified as sysfs directories which contain a dev file, the following command will list these for you:

# find /sys -name dev

For example, on my system, the /sys/block/sda directory is the device path for my hard disk. It is linked to it's parent, the SCSI disk device, through the /sys/block/sda/device symbolic link.

When you write rules based on sysfs information, you are simply matching attribute contents of some files in one part of the chain. For example, I can read the size of my hard disk as follows:

# cat /sys/block/sda/size 234441648 

In a udev rule, I could use ATTR{size}=="234441648" to identify this disk. As udev iterates through the entire device chain, I could alternatively opt to match attributes in another part of the chain (e.g. attributes in /sys/class/block/sda/device/) using ATTRS, however there are some caveats when dealing with different parts of the chain which are described later.

Although this serves as a useful introduction as to the structure of sysfs and exactly how udev matches values, manually trawling through sysfs is both time consuming and unnecessary.

udevinfo

Enter udevinfo, which is probably the most straightforward tool you can use to construct rules. All you need to know is the sysfs device path of the device in question. A trimmed example is shown below:

# udevinfo -a -p /sys/block/sda    looking at device '/block/sda':     KERNEL=="sda"     SUBSYSTEM=="block"     ATTR{stat}=="  128535     2246  2788977   766188    73998   317300  3132216  5735004        0   516516  6503316"     ATTR{size}=="234441648"     ATTR{removable}=="0"     ATTR{range}=="16"     ATTR{dev}=="8:0"    looking at parent device '/devices/pci0000:00/0000:00:07.0/host0/target0:0:0/0:0:0:0':     KERNELS=="0:0:0:0"     SUBSYSTEMS=="scsi"     DRIVERS=="sd"     ATTRS{ioerr_cnt}=="0x0"     ATTRS{iodone_cnt}=="0x31737"     ATTRS{iorequest_cnt}=="0x31737"     ATTRS{iocounterbits}=="32"     ATTRS{timeout}=="30"     ATTRS{state}=="running"     ATTRS{rev}=="3.42"     ATTRS{model}=="ST3120827AS     "     ATTRS{vendor}=="ATA     "     ATTRS{scsi_level}=="6"     ATTRS{type}=="0"     ATTRS{queue_type}=="none"     ATTRS{queue_depth}=="1"     ATTRS{device_blocked}=="0"    looking at parent device '/devices/pci0000:00/0000:00:07.0':     KERNELS=="0000:00:07.0"     SUBSYSTEMS=="pci"     DRIVERS=="sata_nv"     ATTRS{vendor}=="0x10de"     ATTRS{device}=="0x037f" 

As you can see, udevinfo simply produces a list of attributes you can use as-is as match keys in your udev rules. From the above example, I could produce (e.g.) either of the following two rules for this device:

SUBSYSTEM=="block", ATTR{size}=="234441648", NAME="my_hard_disk" SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}=="ST3120827AS", NAME="my_hard_disk"

You may have noted the use of colour in the above examples. This is to demonstrate that while it is legal to combine the attributes from the device in question and a single parent device, you cannot mix-and-match attributes from multiple parent devices - your rule will not work. For example, the following rule is invalid as it attempts to match attributes from two parent devices:

SUBSYSTEM=="block", ATTRS{model}=="ST3120827AS", DRIVERS=="sata_nv", NAME="my_hard_disk"

You are usually provided with a large number of attributes, and you must pick a number of them to construct your rule. In general, you want to choose attributes which identify your device in a persistent and human-recognisable way. In the examples above, I chose the size of my disk and its model number. I did not use meaningless numbers such as ATTRS{iodone_cnt}=="0x31737".

Observe the effects of hierarchy in the udevinfo output. The green section corresponding to the device in question uses the standard match keys such as KERNEL and ATTR. The blue and maroon sections corresponding to parent devices use the parent-traversing variants such as SUBSYSTEMS and ATTRS. This is why the complexity introduced by the hierarchical structure is actually quite easy to deal with, just be sure to use the exact values that udevinfo suggests.

Another point to note is that it is common for text attributes to appear in the udevinfo output to be padded with spaces (e.g. see ST3120827AS above). In your rules, you can either specify the extra spaces, or you can cut them off as I have done.

The only complication with using udevinfo is that you are required to know the top-level device path (/sys/block/sda in the example above). This is not always obvious. However, as you are generally writing rules for device nodes which already exist, you can use udevinfo to look up the device path for you:

# udevinfo -a -p $(udevinfo -q path -n /dev/sda)

Alternative methods

Although udevinfo is almost certainly the most straightforward way of listing the exact attributes you can build rules from, some users are happier with other tools. Utilities such as usbview display a similar set of information, most of which can be used in rules.

Advanced topics

Controlling permissions and ownership

udev allows you to use additional assignments in rules to control ownership and permission attributes on each device.

The GROUP assignment allows you to define which Unix group should own the device node. Here is an example rule which defines that the video group will own the framebuffer devices:

KERNEL=="fb[0-9]*", NAME="fb/%n", SYMLINK+="%k", GROUP="video"

The OWNER key, perhaps less useful, allows you to define which Unix user should have ownership permissions on the device node. Assuming the slightly odd situation where you would want john to own your floppy devices, you could use:

KERNEL=="fd[0-9]*", OWNER="john"

udev defaults to creating nodes with Unix permissions of 0660 (read/write to owner and group). If you need to, you can override these defaults on certain devices using rules including the MODE assignment. As an example, the following rule defines that the inotify node shall be readable and writable to everyone:

KERNEL=="inotify", NAME="misc/%k", SYMLINK+="%k", MODE="0666"

Using external programs to name devices

Under some circumstances, you may require more flexibility than standard udev rules can provide. In this case, you can ask udev to run a program and use the standard output from that program to provide device naming.

To use this functionality, you simply specify the absolute path of the program to run (and any parameters) in the PROGRAM assignment, and you then use some variant of the %c substitution in the NAME/SYMLINK assignments.

The following examples refer to a fictional program found at /bin/device_namer. device_namer takes one command line argument which is the kernel name for the device. Based upon this kernel name, device_namer does its magic and produces some output to the usual stdout pipe, split into several parts. Each part is just a single word, and parts are separated by a single space.

In our first example, we assume that device_namer outputs a number of parts, each one to form a symbolic link (alternative name) for the device in question.

KERNEL=="hda", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"

The next example assumes that device_namer outputs two parts, the first being the device name, and the second being the name for an additional symbolic link. We now introduce the %c{N} substitution, which refers to part N of the output:

KERNEL=="hda", PROGRAM="/bin/device_namer %k", NAME="%c{1}", SYMLINK+="%c{2}"

The next example assumes that device_namer outputs one part for the device name, followed by any number of parts which will form additional symbolic links. We now introduce the %c{N+} substitution, which evaluates to part N, N+1, N+2, ... until the end of the output.

KERNEL=="hda", PROGRAM="/bin/device_namer %k", NAME="%c{1}", SYMLINK+="%c{2+}"

Output parts can be used in any assignment key, not only NAME and SYMLINK. The example below uses a fictional program to determine the Unix group which should own the device:

KERNEL=="hda", PROGRAM="/bin/who_owns_device %k", GROUP="%c"

Running external programs upon certain events

Yet another reason for writing udev rules is to run a particular program when a device is connected or disconnected. For example, you might want to execute a script to automatically download all of your photos from your digital camera when it is connected.

Do not confuse this with the PROGRAM functionality described above. PROGRAM is used for running programs which produce device names (and they shouldn't do anything other than that). When those programs are being executed, the device node has not yet been created, so acting upon the device in any way is not possible.

The functionality introduced here allows you to run a program after the device node is put in place. This program can act on the device, however it must not run for any extended period of time, because udev is effectively paused while these programs are running. One workaround for this limitation is to make sure your program immediately detaches itself.

Here is an example rule which demonstrates the use of the RUN list assignment:

KERNEL=="sdb", RUN+="/usr/bin/my_program"

When /usr/bin/my_program is executed, various parts of the udev environment are available as environment variables, including key values such as SUBSYSTEM. You can also use the ACTION environment variable to detect whether the device is being connected or disconnected - ACTION will be either "add" or "remove" respectively.

udev does not run these programs on any active terminal, and it does not execute them under the context of a shell. Be sure to ensure your program is marked executable, if it is a shell script ensure it starts with an appropriate shebang (e.g. #!/bin/sh), and do not expect any standard output to appear on your terminal.

Environment interaction

udev provides an ENV key for environment variables which can be used for both matching and assignment.

In the assignment case, you can set environment variables which you can then match against later. You can also set environment variables which can be used by any external programs invoked using the techniques mentioned above. A fictional example rule which sets an environment variable is shown below.

KERNEL=="fd0", SYMLINK+="floppy", ENV{some_var}="value"

In the matching case, you can ensure that rules only run depending on the value of an environment variable. Note that the environment that udev sees will not be the same user environment as you get on the console. A fictional rule involving an environment match is shown below.

KERNEL=="fd0", ENV{an_env_var}=="yes", SYMLINK+="floppy"

The above rule only creates the /dev/floppy link if $an_env_var is set to "yes" in udev's environment.

Additional options

Another assignment which can prove useful is the OPTIONS list. A few options are available:

  • all_partitions - create all possible partitions for a block device, rather than only those that were initially detected
  • ignore_device - ignore the event completely
  • last_rule - ensure that no later rules have any effect

For example, the rule below sets the group ownership on my hard disk node, and ensures that no later rule can have any effect:

KERNEL=="sda", GROUP="disk", OPTIONS+="last_rule"

Examples

USB Printer

I power on my printer, and it is assigned device node /dev/lp0. Not satisfied with such a bland name, I decide to use udevinfo to aid me in writing a rule which will provide an alternative name:

# udevinfo -a -p $(udevinfo -q path -n /dev/lp0)   looking at device '/class/usb/lp0':     KERNEL=="lp0"     SUBSYSTEM=="usb"     DRIVER==""     ATTR{dev}=="180:0"    looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1':     SUBSYSTEMS=="usb"     ATTRS{manufacturer}=="EPSON"     ATTRS{product}=="USB Printer"     ATTRS{serial}=="L72010011070626380" 

My rule becomes:

SUBSYSTEM=="usb", ATTRS{serial}=="L72010011070626380", SYMLINK+="epson_680"

USB Camera

Like most, my camera identifies itself as an external hard disk connected over the USB bus, using the SCSI transport. To access my photos, I mount the drive and copy the image files onto my hard disk.

Not all cameras work in this way: some of them use a non-storage protocol such as cameras supported by gphoto2. In the gphoto case, you do not want to be writing rules for your device, as is it controlled purely through userspace (rather than a specific kernel driver).

A common complication with USB camera devices is that they usually identify themselves as a disk with a single partition, in this case /dev/sdb with /dev/sdb1. The sdb node is useless to me, but sdb1 is interesting - this is the one I want to mount. There is a problem here that because sysfs is chained, the useful attributes which udevinfo produces for /dev/sdb1 are identical to the ones for /dev/sdb. This results in your rule potentially matching both the raw disk and the partition, which is not what you want, your rule should be specific.

To get around this, you simply need to think about what differs between sdb and sdb1. It is surprisingly simple: the name itself differs, so we can use a simple pattern match on the NAME field.

# udevinfo -a -p $(udevinfo -q path -n /dev/sdb1)   looking at device '/block/sdb/sdb1':     KERNEL=="sdb1"     SUBSYSTEM=="block"    looking at parent device '/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0':     KERNELS=="6:0:0:0"     SUBSYSTEMS=="scsi"     DRIVERS=="sd"     ATTRS{rev}=="1.00"     ATTRS{model}=="X250,D560Z,C350Z"     ATTRS{vendor}=="OLYMPUS "     ATTRS{scsi_level}=="3"     ATTRS{type}=="0" 

My rule:

KERNEL=="sd?1", SUBSYSTEMS=="scsi", ATTRS{model}=="X250,D560Z,C350Z", SYMLINK+="camera"

USB Hard Disk

A USB hard disk is comparable to the USB camera I described above, however typical usage patterns are different. In the camera example, I explained that I am not interested in the sdb node - it's only real use is for partitioning (e.g. with fdisk), but why would I want to partition my camera!?

Of course, if you have a 100GB USB hard disk, it is perfectly understandable that you might want to partition it, in which case we can take advantage of udev's string substitutions:

KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB 2.0 Storage Device", SYMLINK+="usbhd%n"

This rule creates symlinks such as:

  • /dev/usbhd - The fdiskable node
  • /dev/usbhd1 - The first partition (mountable)
  • /dev/usbhd2 - The second partition (mountable)

USB Card Reader

USB card readers (CompactFlash, SmartMedia, etc) are yet another range of USB storage devices which have different usage requirements.

These devices typically do not inform the host computer upon media change. So, if you plug in the device with no media, and then insert a card, the computer does not realise, and you do not have your mountable sdb1 partition node for the media.

One possible solution is to take advantage of the all_partitions option, which will create 16 partition nodes for every block device that the rule matches:

KERNEL="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB 2.0 CompactFlash Reader", SYMLINK+="cfrdr%n", OPTIONS+="all_partitions"
You will now have nodes named: cfrdr, cfrdr1, cfrdr2, cfrdr3, ..., cfrdr15.

USB Palm Pilot

These devices work as USB-serial devices, so by default, you only get the ttyUSB1 device node. The palm utilities rely on /dev/pilot, so many users will want to use a rule to provide this.

Carsten Clasohm's blog post appears to be the definitive source for this. Carsten's rule is shown below:

SUBSYSTEMS=="usb", ATTRS{product}=="Palm Handheld", KERNEL=="ttyUSB*", SYMLINK+="pilot"

Note that the product string seems to vary from product to product, so make sure that you check (using udevinfo) which one applies to you.

CD/DVD drives

I have two optical drives in this computer: a DVD reader (hdc), and a DVD rewriter (hdd). I do not expect these device nodes to change, unless I physically rewire my system. However, many users like to have device nodes such as /dev/dvd for convenience.

As we know the KERNEL names for these devices, rule writing is simple. Here are some examples for my system:

SUBSYSTEM=="block", KERNEL=="hdc", SYMLINK+="dvd", GROUP="cdrom" SUBSYSTEM=="block", KERNEL=="hdd", SYMLINK+="dvdrw", GROUP="cdrom" 

Network interfaces

Even though they are referenced by names, network interfaces typically do not have device nodes associated with them. Despite that, the rule writing process is almost identical.

It makes sense to simply match the MAC address of your interface in the rule, as this is unique. However, make sure that you use the exact MAC address as shown as udevinfo, because if you do not match the case exactly, your rule will not work.

# udevinfo -a -p /sys/class/net/eth0   looking at class device '/sys/class/net/eth0':     KERNEL=="eth0"     ATTR{address}=="00:52:8b:d5:04:48" 

Here is my rule:

KERNEL=="eth*", ATTR{address}=="00:52:8b:d5:04:48", NAME="lan"

You will need to reload the net driver for this rule to take effect. You can either unload and reload the module, or simply reboot the system. You will also need to reconfigure your system to use "lan" rather than "eth0". I had some troubles getting this going (the interface wasn't being renamed) until I had completely dropped all references to eth0. After that, you should be able to use "lan" instead of "eth0" in any calls to ifconfig or similar utilities.

Testing and debugging

Putting your rules into action

Assuming you are on a recent kernel with inotify support, udev will automatically monitor your rules directory and automatically pick up any modifications you make to the rule files.

Despite this, udev will not automatically reprocess all devices and attempt to apply the new rule(s). For example, if you write a rule to add an extra symbolic link for your camera while your camera is plugged in, you cannot expect the extra symbolic link to show up right away.

To make the symbolic link show up, you can either disconnect and reconnect your camera, or alternatively in the case of non-removable devices, you can run udevtrigger.

If your kernel does not have inotify support, new rules will not be detected automatically. In this situation, you must run udevcontrol reload_rules after making any rule file modifications for those modifications to take effect.

udevtest

If you know the top-level device path in sysfs, you can use udevtest to show the actions which udev would take. This may help you debug your rules. For example, assuming you want to debug a rule which acts on /sys/class/sound/dsp:

# udevtest /class/sound/dsp main: looking at device '/class/sound/dsp' from subsystem 'sound' udev_rules_get_name: add symlink 'dsp' udev_rules_get_name: rule applied, 'dsp' becomes 'sound/dsp' udev_device_event: device '/class/sound/dsp' already known, remove possible symlinks udev_node_add: creating device node '/dev/sound/dsp', major = '14', minor = '3', mode = '0660', uid = '0', gid = '18' udev_node_add: creating symlink '/dev/dsp' to 'sound/dsp' 

Note the /sys prefix was removed from the udevtest command line argument, this is because udevtest operates on device paths. Also note that udevtest is purely a testing/debugging tool, it does not create any device nodes, despite what the output suggests!

Author and contact

This document is written by Daniel Drake <dan@reactivated.net>. Feedback is appreciated.

For support, you should mail the linux-hotplug mailing list: linux-hotplug-devel@lists.sourceforge.net.

Copyright (C) 2003-2006 Daniel Drake.
This document is licensed under the GNU General Public License, Version 2.