From 6f0edc30046d4fbe42552f88b485aafa4def41f4 Mon Sep 17 00:00:00 2001 From: dthaluru Date: Fri, 10 Jun 2016 12:07:52 -0700 Subject: [PATCH] Updated photon-admin-guide doc Change-Id: Ia3722affa7dc9548738a0553c59fc9ad99f3f10c Reviewed-on: http://photon-jenkins.eng.vmware.com/1071 Reviewed-by: Divya Thaluru Tested-by: Divya Thaluru --- docs/images/ova-firefox.png | Bin 0 -> 12577 bytes docs/images/ova-import.png | Bin 0 -> 9079 bytes docs/images/photon-installer-sm.png | Bin 0 -> 23999 bytes docs/images/ws-new-vm.png | Bin 0 -> 11446 bytes docs/photon-admin-guide.md | 1540 +++++++++++++++++++++++++++ 5 files changed, 1540 insertions(+) create mode 100755 docs/images/ova-firefox.png create mode 100755 docs/images/ova-import.png create mode 100755 docs/images/photon-installer-sm.png create mode 100755 docs/images/ws-new-vm.png create mode 100755 docs/photon-admin-guide.md diff --git a/docs/images/ova-firefox.png b/docs/images/ova-firefox.png new file mode 100755 index 0000000000000000000000000000000000000000..64cd8c49dd8638fe4e04afc032a1f4d83a093c17 GIT binary patch literal 12577 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 JWd@Ef{uh>#-Esf` literal 0 HcmV?d00001 diff --git a/docs/images/ova-import.png b/docs/images/ova-import.png new file mode 100755 index 0000000000000000000000000000000000000000..3d2b0db69f7aafdc48c5c5b1221512e0080b1d4e GIT binary patch literal 9079 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 MH-o$7ckCkn2g95*{{R30 literal 0 HcmV?d00001 diff --git a/docs/images/photon-installer-sm.png b/docs/images/photon-installer-sm.png new file mode 100755 index 0000000000000000000000000000000000000000..2a2b02c74e818682cc0a98f040f023227c03a58c GIT binary patch literal 23999 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ⅅB zDkQ~cNv3M!6M{>6p$PE)1P_c0zIj$rsxq)?;w++ElCs+spcZ14wP`xSl-5#+s>q&Wfb{6guA^FN7AYoq+?kuZJZcQW%RT5z5ILgRFO-VH2T?%}zOJFQ8}} ze)xjH_t@QbpPy^nx`KgRfHqOQ>2kqCcji*^3 z1dl7+f}Ah#aR*vWX)n6i6y?c$AiDCB=oRR1haV}8r)@Uccn(8*YM2AA+M1km+ip>P zZm=WEx(zXF>M$D5)L!JW5HkrWODJ|Tk7KxSpqgySOB_-VLR-E{$HW8Mm6a>;tJfx! zWyhsQmXWY5b6Wp)g``~kPIxmPYR{Rp5aUZirh3XOoeNp4(4|epF!3%y+Bj1V%@I^d zI+%RMwe~JY`(H2fq=8bDsf~nHt(wQIHTQ&-uSL6E?pb}UKH~w;eBc3cfb#V1)a;i= z*nW+?bO%8Lvn9d*GP#FU9sWfj0rx0UUI<{@6HGBx7d2-!u077r1d%UV_Bev%B*1qT z$LP)hhZP67n5+^n4V|SykYV$_w`b@RBUk_|U%btSJXJK({(>QJBRjpqxVnib9Tt90 zcH|E9J_=2#LlQQ^w_Coi1(Os4GeOLYr_o5AXVe~n>TpaW$Grq=01ra?h6huj2Q1@~ zqF`p^VQ?l3#5~azGM}%CPFl!C0N15&(`gv=6S9zU5Dj@ICk7HAuJAh6I`BM}x_nYB z7eUkjmIGB{$7=r9_BkHrr=R_I@)R3j0t9Rb1ZQ}MXEIeNJz=HS(c(tR(L$6stcLDq z%8+7lc~K&NZ>OJee9&?0NXZI082_RJhJ(|h6^#LKWF5V%*DH2R$UO(26t zsPI0kg;fK#1ikzraR3AxPzgiW6{MXw+o3a@f(9AMc_8_0owqv;2|y5EdZuvUC*g_IhPop^_6%b@-ehOPra^tBP$$gWt|9 z$706Bj7x67(L}D0dW21J%fz4|RE5~p$>KVpyl+uDCU8k(B1Yk>48S8evpj6Zw+8p(wQO#a#O0- zT5P-}DK1RteTMnPOazFA1OD-VcFIWVt);7Gcj33g72Yd@E~3a)r}#F@NE-NZpca7h zCtH1081Tn7&Zim9N{phs@)oIB8G@&luTeS@(jkDTv7k|FX~0yl^x!%7F^Byi!a!u; zz8dTgTw5T-DUd!rNL)JOP>RwC4*4*iLu~Q!)NT@;G@4{h)5;oxj)zx2=s+*G_8zGU z?^NLDAgxt>u1f9=h*}^0JYDKR@BWv&apBPP+;Uw(mYI$s6%6B*zSA(O>?&)Vl&!?UmHEsw8oZj1rmu?*XVsJ_sORdJGx2ot^PJc8#>y%Uo5||>%_3AO&TLH4@vNhNe0MWOD2s{Y z!ig{GE8M+8Myl#o6U22#;ftb}_g5MCK8NtXMk$z7)3)(VWu1 zP}IR$9ZMVNQAeqD7!KHdE@p{*+H&ENE{Q{J>LU)28&@S(QYnnG;u{>t#=uwhDVM_H zvMwu_N&}W$M#5>+#7m7-1>`e=3;B!`KarxB$>AgHN|e83c!sB6gwSJXCZ-RL!f|T^ zL8Fd%L*RsHz#jQsb5CYe@tfk!c)&cttl(Qzz$AR* znufcd&{P&{LkoPP>~hA@I9zQ+EI|G>n)RoYY04iaJBFRRi%&kP;|l3Ai+QeE=OGmB@nC=l74>#N*Z7VB@8Hr0jzM~ zCzc?%1(Rdk`bI-RPABFXCnJsVnb2bC3=Mo?)OY5_Tics4mzpK-9lP<~$VO@R!^4Q; zgN|ryzE%E& z2iE8u+F`#68){G{ZYG*&8)9eiM9g3e834knG~mZy=ot+6p>S`((8Zj`$pOq)Y2_JC zK!Q!`J6Noc2?GaX3L&&~d!xz?SOiQK*Ad%(VOyn#_8BJuH{Z1B?xuyaMs){b<`gBz zaljb|Bgg^BF$9fXLu^(Ux3LVjmu%cWEqg8@%J5CAm!u#Q_p||+j3wZ6A7l(UAS{M} z>)m^J7~^V@g99b2EHRU|l^ekD;+8X=WiM!t1E#YY>PR786z$g3Wuz4Hk@1I0-7^6T29Wh__D?M1REoY0d^mv|wI|bJ=^%&M60c)WM3IeEzShj{pnk|$HHi`$Tq69A!)-#mfA)-=>aP2+;ze1e|0{C&vdZ01Qe1^{Pe<%PgN&NCeF_Y9DXE7;5$ zGAn_ugV_76^k%lpUP!;RNiZ7Dv0(nph5lEKT_Hkf=T90;R)_(OunZctDN-C(tCz6P ztV_2k!!#RqlgvZAhc5N7j73Fb%`Y+A-ZWuvaoLEMG>Lj^2zOVA)yiG6@rd>!^% zNGY?0=Y24IK#T-{?em~w*m!D7LeN4FZfXY3&);#SO>}EP+85gA7bSuFHc&_F5_rW& z$xu+1Lf84QNuXL;jEiIg9gn)L#s%nMPG=n10ph=bX;a`%m33&(C0DT>LgFE?8DlNS z`A;2Su_!XLg0CdRO~Cg2mLi^t&x{Abm<|Sm_OzeLcyW*WL1iZuSmT`U3yz2?R_r6$yd5$IFGK7KU zc-7UoGf@2hOtANm_6N;TpTHl0xyF?m$=W-gek>>xq5`}70(!ZO$EVuA-BVLZg}WO6E+mR}=X~rWRu?YO6qlZu_okz4V^T%H3~^O~ zYnBp^@uw|q{om5-j(w8_e>s?~WIA|8lkqVK7kNEp@L^m)1vgF32`zt-%sW*KZ}qj5 zWj#T=5p#n>>%YzcFfG93NoA|Zc#3qQ=A}-N^(yJ6r4X zxvEi*&~al>;n*KrV;*ZuJUp{G%u)W&1Y1H5y=V;+M5+jXr$LRpb|-f@I&WP*6&bM9 z8=@a>H79U?Vg11ZL~csgdRuj)R-Yb)vy1=zcx3}4y6W>TQ-iMTp`HWZ-^T2j6HTqr zdZ!sLM^DOa&gLmM6nPt@Z9bm*V7Fqma|G;N4Ld zV!GENC0;cLLCW5iL2y^^8~Mkh7m35!ZBo1vn!3plU0${I;Fj`Z#$BD6i{2@-yYnHl zVDGmZicL-fFI>Q6;b7s!=0n84k|pR{?>G7u}AXy+B#H@uhPbYR~0Y#;)< zmELMj{xtUlTl#rx^ryNRRC1HDGxT_DFep4jrEovdsuw&_)2fm*(FOv zaDmw2l)rEHNF?6XneosGP(YY7nj=Vf0e6pynXRm7AW*$^SkVLAPZ~(=kOb3vj!PMO z6WMV8p40k#*U#qU?DF(PQ<0wDqQg{77$F=SN1@>fx~WW((YfxO(hRF(oVrj4spVhB z7-Rd51^lhet;Lpo^LnI$xGeZ35dsY_wsu2H)(6o$b%Hu1!e|C1dyFraD}RZb?YM?m z+tLS?7)gxI~e*IhCFMEPX&qQz|Od)ei{BL!yeoy15w|^fn>riw8kB^5+(D0LiUFJJu_>qEI?Mi4vg&B z`TP48_%npJNh2{`yWK5S!%2*cV?(+=oO;X0UGK z?)hWKPd8c-y;sJ63iahNAn_4@6==AFGm8uAkW9BOOm`V?p)_?C8y>LlBn&fd z<|)R~Hb5V#QtgCY)w|-o(+rTk2Kvny&Zor7%|3fGFD*FuxXWM5{YmD0;~R2jzY^74 zlNqf)j%@fhP)aN14$-f}nLW&%GPn>)t}#yG%dZAhr$IkQ&n_Iw=%2D$CN|uT(dEG` zb4)e!szJU-WFUqId>`*iX}rO&4nH{1L?>|{B}p6X6F@t#~AsQ1^CLWmyxKYZ_B6Y*2dqV8H@muncQ zxWWgTGew$wrz703@x{%>dL*I3`o^RqsvW{hsUvOo13%npCqBLbi>dW7#PzGHp)i8K zxtnO(fM4kCLT99>+{ZgBiYbp!cq3dAn5)gO4TX2c^$4GwD6`y~W20)@2MM=cN(`G~ zC3D%`knY2{j(m(b9|~Hyaw(m|aTt=ORU(KMHSVWHPWn=o<&T`>EwIcmVh2MWTO1eB zfpqTr>l3F;Uuzpyex*`0%m0%YJ=hW81G3n4?ml(cYqy4mj3^%mT76_je%|4{Y^wnU zMC}n2{IUbtUxVI8h&Zvf6*r2e#j^3+ePe5O)()0pVc`9Aj=M~F&5a!OWVS~~BYLoN z`9OBmHidXBcPGOWUjl&$;$){su78u+`WHQvKbOJOi zAN=7&d0V}MH^E1yGETbuB)~nlE>J$`cx&60jP2?l(ecx=G`m~<`cDXAmfK!K;P?KB zotYOefs)5{;Bb*p$DjI{y8DvCCxOE6iQKgpAha7)J%O!Qu2~Y6r)wrncKlH`Vcs`V-mld6AucK>lVY|Q0p}73n6B7Y0PAq zEnIT|vFv6_F{?FLbogR^GNunKb_Win7D1=i!B%EN?+zh&_rcz19TkA>aakC4c?JK-PJsBpOJ{^jz;&MceT1;;b zBbtYqk^1#;H5ZUZBGo+bWP?@Z^?BP<@$0?}+~2WG7z0!`4uT? z#Q+^YbM{@h{j*JYXmC3+_8d5nS%N37Z;yoIMY!Yj-|_jsu0&|C8CP})MrvLO9-FiW zi(k9~@wERs63yp_b;6oG8TkIMgSfq4D~w;gA7$2>2S&K?MgfUeBE(F%nJyfxLd+O` z`gu*|yO}Iz^H#8%nFGD-G+QTdy%k^VcbCMA z_1A9cEUc@C$-OJFIq*GMKtAMx+Q}bWx$QXi#bydij^Xt^F&Q{sU={1-WVLN4VZ4W| zG-Hqn7qt$;%^&=YyGVf8nt$fTPMEsx5J35Exvo9djvs;Fz8sF}|GN%4Dn|tU#(JF= z>k@OYb!Qq7>4$r+XbBsg`^iy#@f^9o58vJ$`Q(m1NaX{$#cY|KPj!tHv_^&yGaZnX zLuNmTSyh%!{?co+P?q@cC)d9rwa3&cxyH3%W^!R!Eaio&a z+;(vko*mhXL`;is|2PPC6Zzg?;WL`(h7pzU%6?kMlpGY10Cn#fiGL1mgAbPP$IaJwz{E%U;^7I~a38s!|DL@MIhJy6YY^w!N}|Ze zRep4(v5jB0Iug4e620-iAHcNrhXK?1_dk?^)`(y+V>dICTQd(=?Pi_{7B!P84EqmE zBTMZq_?RL^s=KB3Lf}JiIfR(4JQ+4yQn!fuC$fUxUK9@FyYZl@YyQbpWN7wR_w>muM9+7ngs<1$%4D06~0`PjKlkL zkV7Jxb|fDW0Y*4Q1E>ZzZq4K}*_>FHkOQmLf$=}=#Fz8-k&C(;lm0k>dHU)8h?T%X36pb%m0}jNkqoHG^9-qhqq9o9RJB$5)$OSZpjP{9D?&gDd^jQyTxQ zEPQ-J>CK8eD%QzZ)0>qJwA|^H2hzAZ*fK0kTnEP19{=WcI~|id?eY=0zKrr~C_ndI zKIaVRZI z7dPd(PT|fI;HSe}F`P-x0U)U#E=&$39>wiu)`gfcd^{f?ZYcN>+xGn%KBfpER4iC$ zg0~6F%ukP*OOg>6FU3q!e@H=VptvowgIs5(4ri(xSkxksbZ{1S#d4R95LMJpS2ZDK zbVqU2jCm_KY<8ZUYEDwGNI`3W=yfh+=P8!i**eYE7Q#|9g=2rp6zq=s048CnDRm}p z_%oM-=gnNO=Aek0p_i7Kq@Iz2*1%vf%gS*fS-6>XFJ^97z<5N#{*)iEQ*`Nw6z66k zb6aNqBxXDZKuk=Q=$cVaMQhTqrOcJ<{FfIVl+LjR-RmNa|EhUUtgFk}IMepij-#fz zw_OOzvDKCHpjM)7csm?`lH;@StWk`6`n%eIe*pKf-N$!7$PSmCK5NBa4r1xv&hgy% zGu;wmfA>0zMpdq(vY$o>nCLVsx@Md%X3FeTwlf~5DtI5hC99L4jtZUL51Cn;MOThC zEk?lMC=p`DA%JErPr?4^EYZ)1>(RLJ%HdEV(egtlTD3Tl5JPh+!P|Iib<186@jKAD z_^;C9rmXY1`FOm}r>^R}-UeSME@gGD1AoU5A3aLAyMs;(Un56<<_1mW`|@YAUMD)W za_3q*T?Z5898q*Lha?0 zm&(j}-N(|>xwz$1th>*{zlF#{f9Y7_8Q?thne&Ja!F;zVr>hZ-UeNe~4K#%y(!VuY zM|41OSs`rBGP+zBE^6Z8A#rRQ+#Qi2%@OPq0hi8!5^FJ?*MXLS9bs|hp@n~Y1Q>CcF(SR^>3$zYz552|&Umt%FR=ibs2V@nciXTzAofP;u9PrX)){>Cek$l(%V-=Pe ze@{Q7A38^NMS(4!Zd64e&j#4-$FR_XAi`#}Ey_gNV zyq}K&4vhgWG0(=C%gS9Qy3==lVt5xZbSSULirf0PM(0*Rhz#<Z#0)0d`jh=0T zk(qBrIi>&O+71ZxH{zztTOlR22>rT*Bbe4((Q)n^&`Rt-phpBkY2PF1Md(5Mwxi$Q z*Q7^BI=+j(Q`eS(hzj))&kw&0ySEM!-~F+nov{00t`ORq+yibJz01irJJ0&`$&IUU zaE1YsZ`q36?0i^k1t_KmztEaXZ>@4z=;17J7K(X2dG62>My(GA!) z?pj1~wAtr3&yH-e#fgWy)U`Gtk3!@1TxYcDEkL%>n;R3m@$OXW}n#Sb(wj z_Qk`^VkrIedObeAt&A2r79YDJ;#>t~w5=SrLaUOu!nrw2kJwh`P}WHx#AmW>Y}QlD z&2WD(TL~?tv>)fChhKbG{+_hWRqVjAuZF@F_bVJ)x(hpuTagtJ$>VB9;fEs0%Q4DH(z{~FO150NN#ArZT} zR|E!hkHFJ6cEYnacZG@0>1WjQ?JSm>(j@w!WtXJl=TZ6SG*XY`1$O-7x!du`>mw0d z(iSb7x5nEmAHoBj-#~6|J`M-32Z#TT%DEJw0pZw$ndlOH8A=j-(5*u+EHC&NNvW~W zYn2D1uq+4f-?R`rS0*DidnFj9dFQ#@{>{2NDjz z(Yzc#Y@39SuKgTG4x)<@@h>wt7n1(Bw55U*Ie}>jdCXeZjb|WXi(C-dXGJ0U?;eUB(6h0kuC049jjaw%j z!fOu=MR&syv}+lK2j*rYH7lPiRi3|s-4hq4J$^BA59~p!P8Z>U=?5`;Ob3MOOJK`L z#7*DkVDPoQ@zw2-==t4Y>UcVo^a&};(&qFv^kbeOVfgje;KLWYDhDLtXN#;fiC!2%kwCLvWd0}?CWnXqY*q{kOC5Ol-D&ie(BQ+n zyI{<7A7R}g2j1yUb z{hl=R>DG~~wK%N#I~A*A^6}kFdhsNd3Sm5f&57%KHHR}N84q965uwL_g;S%BXy6}# zu4&6)4MJ1b;&{RqjJ=3Nv3~?6{St%wuId6u>@wVXMN7Q%@fUdFhOX#Y@;6#r6VN>qs)w`UtRrRy7;#4mL^T4J zgQMLZ%2dviM^kWmtrDxg$9jd2~*Gp`3@u*)&{ErBWSuWAYQ& z9613!hBO!JzCBCey7(~KUJ;6%tURn=vl;Jx^9Ia;CVap5RXjcTJ>2!uwaBxlVs`9@ zczyVH82VCAdb{$_4&~Uqga(J=A1~d8O9u8r7uz+^x^(omy+-8W`8XY9h70Hi;x|5X z?SEQg{KJcpaWofMIR#kz_s{4vxI2P67{qh#9%!Cd7AW?+^5Xt5hnvN|hys1~A@{?6 zqN3J~iT;^`&17X5V56H?r`N;WQORQ~w3B!k5ZEz5tTVx(!D!R04Z8HEhm(h`RKgr) zhHsQF?BpgHjYb^HJql~5LS#`H@(w!bcyw$%m9bzAnZgsnt1JS3Mh({ey$S#Rdbe^Q z)$-eT*dNWCw*bF#q2C|#exU<8mmb7{ABWbJiQl7pK=AJz^oYoW5PBI;IXm&}84 zc=12)BPqQIMuP!5{wfkwH--5%@1cyf=)Zc^-S6&6Xy+XAC{gzW7?ui%1 zuNJFzODe=%MBNV077IFOo) z((r*e(1BiLcKTl3JHbd_Gc_ZN&Z8A##lpeEhWImELALwIz2}Ev51{@K&h)>^+OGAdEN87&m zYu#UHKOh(b4G-c-aylmeZvh64xCEVxugBs2X_)lxJhZxwEHApTxRoftHwdkB2O<#7 za8c{av0(Z#*lac=y4Imfcwa1Dwh%*Zxf<5p;m9t?M6XM_A$PM0JzMmHrr3swDiilSJN^nMwG)p%}MsYftm$$-}_|0$z*l};$`%yys{cp-xgkMS) zpQ=MVt5!2z6b3fC8cP;0#h2SY#qC3G!?nIc@xymNU|z;dJaqjiTxlGH5669o>=vnr zD~!fcud(BLpT-`GS?|(23@jiW_3kak0 zDFW}Ln|Rw13kJ6=Cvo3}L`QSHFwlTju2lT-ITsz0==KUq&Y zj9VCozE=){_0SghHfxU++Y>P8ii^>)WEWW^#YnWb#Kxp-{G)$!%$heJu81DcR5xN7`$^!dS9o zrrwV$uNsWR;NdU?1fRHuo`i+#d@Av4nUw05Ew$PBfSm_vr2_E7918x<~Y5L)vHFgDf062guro& zpric7g3xLmQC$pd5mO*sPf`UT0 z%3So;)WJW(ABDNJPT$kuV?aPi0LraaloXaCAUJ@;;?!f6+DlPZP)6r+(y@Y2T2_q1 z+wE|b2Eb@OH7{dxkUNr-Mpnl4K%4&n#RtfE3xz!|pL^U=;pi_3G$|nrL1c+kn&sX` zZWAnd(1%3QZ$Va6ajtMnHKEOfW#PW)?2_BbEkY?Bj~*gzXcU~q7B)fY_-aBHnyPoTzays=mls92oc9+*u8QT6hPzeN7sS& zE9Z02cPZh<8?rFMqTnbb%Zkne5_0;%$+e_&*{M8~Pj4nG#o$XvQp(QVB~V;I+pVCR zh4RxSfLFJg3-qp2R^+4!-idteWCZm(6Tcf z=k&&$rcBcroKE*A-=prA89%%HV7P_p#CCUDrFC(CSKM9^H7_H!ix28wPUp{R9zK6X z-QfK0bbg*P$uc{5#2wE}Jt*To4&zRCuUDq>_Uf#k<5&hV-VW|^pfJq=J-L%-#X)XY z;4nDDo`A+dqT}Yo_o0)WxKNd;P#BS)mMSkg;l7Zk{iqE6J+Z&Ky*gi1WT~8|;(qGq z%I7|jr^5D%WjO`PBYt#FuegspjgxqPKDLsV=Z)3sjWDGA0*kpl3@y4Uq9{298EwN0 z;2*#p0*L3$tdHSLH9=2ec6g5+`N!2dvvWe<$WEdbd@GzGqoHx0S_dXMKSX`7)<{M! z30=i5JCYNquNjG_U@_CtufTO?Ja49AnJL@60j?iDw5uj!#!x<85HtlVpw0OXF3m}o mOLG2*3U(K{;!@1c0Pz1%!Kp;!H%$Tn0000mPnb1IUAC6#H@OmWDeSKP)O|11RkNe zXLWJ`CLT6qQ+E@V4XH4DfBDpla$M8(<tBRs0ZP#ivuw{Kfpfb^% z2`OGQlv@%6@`+Q>yWc_*Yyo!VFv-*X>L=rF83(A@CM+gU@t;4x@Cu`a_?N!~zJ1o6 zKDEZ>TK|SQQ;60=H&BS?iX+1u1Z^94A?(S>oYpxt^_4Y z^&&${Y(tXb&DRoQYw*!7J|n$`6WBCCI-hU2iDyR&*IetaxR@x>UH&nWdoi+(ez5up z=Y%pA&OZY@w?nKS`Fx|3W~k0ha9!c_Zcm~QW1Eh#5#v?GGZE4F$J$w$0WZ`G$cYP76p_zz-*E1X zTdvpTb3}X6;GIyklk*89RL)oS>4gu83ybBnS2*n^XF7PlSyM}R|N0(#WB@YgLTfe7 zdq2bF>*G1;^>_une{lfbC6%kd@j*)+zq-wyO4&g!)yvL{Y7{LWCk}q+yHAtAqah)f`o9vrNYQqiHLc$*Qi%mA3n=qfm+h3|{b(x)t`*9F# zKJKiu@hUrx_I$%N9QlF9941av2W6MUt!@`wbjUD@`|Xny&P<`7_d(BhtDDMRkK&n1 zefBII#xltq^IFmksyI5^nDZIx5R|1_|F&C-L~)@YC?~C{DfU z?$4SKtA|aYPTzvb{d-QSH&E#-17P`k-*X!T_jfSEaAT6DIQf`YwVkNej5C3KYa;u#uEU_$ZeW~_>bX$~E zIXzz^Z2BnX1-EIUCgp;J2eE_E<9toUKiqURu)N`k8s1m{R5lb0M|xCx=WZ(6mlzj4R*r{$#rx) zb*}iThh@?LyafJmqc!jFLD?^`E_uZuFP(`hjsnq=E5@JNIVE`X$lYxs#{|(%nY#PS zb}89^_J3=&C4rzuNpusK-h2+`^Jg-2#4vQ7)H_v1>+OdiBA9t7!b!TSCq#jJ=pNbpg%$;nG5w)_;)A=%qdvx9=_~yW&*21!mk$Ke``Q*8Jq6wYNB} z3XQx?BA7EuKib^f874sx`f_*vCU(_{@#NuSh-va2Y?Wu6oQRHL?#*9V+Sv#=mD_`O zR6NnvdLzSw+rnZJnD1I`W}}*Tg5}n$J;fc1}-ri zj+gQEMtP4#K3Rw1ljc+xY8Z<364O_GM|zqX>9VVy>%-1%rIjJ^m`?3zSNtm${HLWU5iQ{4raHQcF*j%qYyw zG}6CkaaFji*XU+)nPJD<+gM4gNL>t}ed;0dJzCCp#tYum$Uf}VT{|~-Y{pApU(m?6 zUL26m{4u$c1DjT>^-@)ZTjcfj7fRWJ zR;vx{J+oR5h-6~m%xeGonIz3uJS+?no};~{IfKBR2+9fw&#!YjuFwl3Ws`O9xk9Sf zcpTLE74PXBSdDJ!sEqdhik5Pmi}Q6{eq6Q|-JNH_xln{8!p{hem6Q!NbkMtFYVF~P zV!RGZZ^@xXyF)KD(!D*;rLSKNs>eFI`-yiw+%P@u-Ou{0?sE-e?W*Y!(^hZy^4vF` zFF7#%+6#QK;JnW*bJf{Z`ohhH4CxD<$DHD>E!NnkU{2yk*fX=Itrv5GvB=?ernI*kkdHc45qdegLCr&D?EW??!NN$3pckx%ZXJ zfz96`m7&aDv*Lf66lKyMZEa z=JVabj~L-_dAukid%dKM`)g2Bo6oo=xUdl^&~~2ocA)?q7^t;a*yu5|W^Ur*(fzus zG=J#eof)5{FcGN3eRwLyb?rb)2###S?SP$D zCO`FD8hogC&lRWfKLb$D3@-2*Yjz~~tIK`u#aeK4&9F4N>N=KlgqYm@OHvuVBQPUueM&1XVDrEybj`n-_ViS0)~M*;c?*& zOt&?QfPq{^W`3w4nQlU+D@-(T$OjC}Cw?9_GsH6tIH48qwX*9lwgSOpeo@ti*^ z&+UT0$=XY4|9O-(w$&e<4_l;X#G40w!xQR)cR6gbL)+b`ZHLtg z>PY59`5adoU?&T)TM9SGa)X)R_FZZlRFe1`r?3F+9s63Ts>|^WA3*6ILtDVUlfM|c# zQ*brc=aP-t`4+38yxthl)j@{Ppf^qhDKEoI>xZy#(NaDuk zv(GWURd+`Atr1J^fAh)CKfWkJ&DM}4jr)&wgf(E08eN@9ZPdW(hOy^T%2nk-3DpI` z)%uUdw}<_XLLEhx!v(}B8W~#mx`whvFlD!IB+q->=2eufYBTU{`9!++HvyYtB35_d zMip;Ou@!iN?ofRSlo^Mcq}PZo9!F;QBi8iPpy@JJ5K@fWHV*0EDjCFWy9?%kmLeeE zqbSqTlKt6X+%Kox(B)|zFt;HWct(~tw1I6>qwx`TTDQ596Lo7hjRj*-eXVXx__^h*LqI`BtK^d$%Dj zav86rMr6T~djpz2eU5%FQl;0VQBwI0M@p4)P@?Z+wpv;Y3&2;B_BDRCmq(G~L(&R6 z>LPrllzu>tK{N%&w3Qpr){IeudU|LppXZ;6Rxacpe^W6XeEd0EqX=h_a(=DKqn{e- z;CD;LEkHeUPP&s6ytua$L8Q6`+&UgQ*5Dc#!WCz+p3L;r;f#!VC0^RTrHui0Y3Y zYzHP=Z9scd%@&4#Mz-W7l%0IjAy@h6eHFKFxbhn?cs{*-Ixf@Bx*KbD|3gZXAFZJQ z+}lF@*{iU9-HAp8C)FZEFa5y87EALdX5=C-q;Qp0_>U`?WlFj&=#^`g38JK`3f!r< z2?>ins?n$74uf**Mi#vSejEMjT8)%xQ&d5ww=UyOoV|6(*}SQu>R$W!1;h*N(!dD~ zF-B_1MqbXqQe@ml`Jg{TQ$NW`JA0_ArQ9K%@hRxlCc6jbw*J=eGOi3;p`DAI4)~a~cx<0uYZ5=2`E>S>=$=-;;r}52`P<~^KeiDyni=5 zHPNz8UAXfrISXX2=95BIoQ-@FlX7*`8XL~IZB?WpOT3UE(E6uSaVih&_u9gAtaKrJ zs=P%p)lp>}&C(MuTQK@3{Bp2CRBDuW&us1ZB>!w`HteUb3DuUBmF;5PQ=pHlnzpFa znAIWXpnP=KNedot4~<6O+OEL*=!}M?P^FO(DkqR8QxT{KBdW1(Tg^Xxud|z>Q++o>~C1T=jiX&$jFS_?~g{-cTPzukDfLw9q5sSI#}1ZZNn-Lo>DgPS!RS9@K2`nSLi=Uxas z=0YhMG@`(t>PO9U#Lg{h#Pk=w2vV~e4vwkEC>&<#!0Ab*4C=Z;WUltW555~#@Nb7+ zIh=q7x+zQV1dYhP7r|UDA9PWXD}-{}#n4&>KvDLm@CCNXWkcDpia^Jxr_zW#ZqUV} ze^+|^ZJ|>lzn zhT_8ADBt0gAfs~fcT1x&TU}6de9^7;g442)$H@}-YnT0OqGk*@H!WpT3a^PH_~3AY zj#ZoHgG5Tkz0u1s?3LxKeQx03LJ4E@zEmT<>0O}OUBzednC(QB-TorArXQVP7IkBu ziv~Ot`3Wm}_m51WP%ARU8*k@p-}|s$VWpRvAC69u*^&skMI1i6?^6GL0ZsvspZI%W z9pU#SNKvo5HOF}=aY=Hi6;85XPLEB+fPR#&{Mr}4!U-iKcw>OkL4k^h6mY^S6q&p{ zIMc2+Trf!dA=#a;c82~v-KcTIl>RXRbMX2xu-Uy6hyAt2N`XMvt~}r>f}x{)iu6nj zG@eYC?Od2gxum3%5LX@t5&M$4yT9lbc&;tB=OOG`WsNmd1__VK2Gel>VQyjY>02cy z*A~i4FM%~Rq_F6I1C{BG{UDbFfH!Js+&~Mn^Ifb(@ACH3U{#_9SlF9-Cjq>HnKzC11 zCJu&bq<<7d3OUa@UZ4h>dUg^+=|3q5zl#jlVy z{R9G?v`r}M5Hy~t*U}hzWq0ZFVW;2Gu13L6k>)>U(GyFd%ar8jV|*!+Ab=snY!3OX zpL#=Gd86QyqH2Tu{`6S|`-&P0_ zXkFCA{NN^ZH@Ok4@vFk>0D&}C7LHXR@|3J=~T*H5uEM#{3GqzS3UgR4Q-!i0CZR0fypwdSngQUpRnVS-J6i6^#`U zl!Fl`qK@@ruED(Wv}`*IHIg_b+_xm~h1+}z+;*N+xppiA^A;frg&$5V2(E9Wb;&*^ zW@6NQ5iHg3QUr(SSr#b=qN^cb#szx&90&}A3?a+HFp1p2zqD}IxIY5A`_hA{{;l)U zjf(DIx|bpS{hUMYI^KW0NDb=8Q(q1)Y=W~l(7 zDqM2cAgOB$3IiH=y8uEPO@3x&a^MvsmX z{ZJwh%Wm2&7%~md*iw*(RIi?GKJ|39Ts=o|!OiEj#QKKkmF*`++&9A{-lhS2xq7iH zvBdO~*)COaby4|DnZDPGyvJPNb+=`fhhf9gJ3!3|0HYArA((x_FE2F5%3hZ@%z_bz zJh-Jm&GrChAKLoT-hZJy>|bdRfBhm!PV?g;c>m?SnDyZP?O|&f>szQY0Ic3F0Q7xm z+xVPOU9iGjeVLIVrR?!-m2iw5suWT^4_$)+&$K4a+Wyt@X=6&(p_lY?)Igwt&SP;v zx;*jWFa6M8=I>52{S)HQ4X%GcTzclz8^H7`|7v>APK8k3UV>A0dwn9F;9DJApKzGX zC0n;M{<=)6TVJcRMN3x}xlwVNrRJLr0;&JvhVfT_0=Lfp&Daj52EU9h#bu;?EZ4~` zt*;^K@rf*H~Hf=zrJcrHWA6~ilNL7h85CjsgAC2%FI3-b6T-3{xY z6o{uP%7o_>*0{GM-t4DPT1wwqY{cfR%Jw;C83;de-<|C9(1?}ryfW!RoTaVwD?nM& zZ-w~Wt=&_vqNILIrf9+}T;af^7e1x5C0{O;FXgG`tW$23@QJl@cY~!f)~Q-R3F30} zy)eeN$xS5YTt|C|&C@FvVm2S|LT^#dhu*xj&p~5h*Z27Nw8}M)H80p%8q8+yR6`&W6A|c3ddbfMptcM5BCxT+Xb$v6*~U=@yxy^1#lf@@Rn9%2?ZOmG#+aM>Q7u^B)gAbFY8H-a@BM-95L<>=81$ zju}-&cxaO`$RO5NT^xH1#D=5I5uXt_uvv`z)s}+!(3{kq$@P)wFF~QY6Li3g?SG9R zKzb8?BliQKx0_cF|0&+aB-tJ}8XJ57Xu5v{m?`wekxQ3TBS(8@gM)PU$RNeW$H}m= z>-PX9ztZ_HdJu`Ke{WP$-*r{Z@0aLh|B8I5Q1Wu$AIQ!%D%R}dvkfO4Yt**cFsM$P zVW()6G&No=R)DjCxr$Q&*~9=dhq}y-CDRkT;_Xnd&n=Defha)zRDLYsfr@evDxyBx z7F;#^$KW4M%491BOyP6VIg6hP{J{c%*mj}i#93jV2#rUGPA_^*6MrqK#Pt^#x3=-r z+%4jc{2m)p?)w6`O>GQFAegh<7$7k}{(rBs>yY9d&ijG-H0dfY@Gzn|_|*TfWc^El z8-Mrr4G#VcIydwJFd?XzJ3kv(T+SWQ z9atF9cqanbSyD+vXUI!h*Q&=M`XQv|HGZGT7w#-Z*pA;})v*|>5-Ek}?f>a?jiGTp z>CkyemZc@?($O9JBjt_ae|hTNbwtY`O3JIx_;!n`vfPyB-h-n>!Li^R+uXcFTa#{1#N&^DeezJlQ=A3!KO-{jYroL?~pr0g%8l2`h6Tr^-wR0`5tmcPzP6 ztqH*1^IgCD8MWFi>uutI@`1knk?)QiaNT0kdi{k)_>WO?+`oLG|=WG3E z6=qJ-g=!aGU@ZwXA8Wv#6y2-n$+n_?+&O6B8?5Q+56sDzzIn93g*9#TPS8ZggD9Rr zuNJ@(Rz~z26UC$Otem)MO<{DU4w-r$wtQg^CG5voWT)SUMA0nb?7YzVJ|nreF2bi}0_7cPpHlXixtjP07Mv>Ax` zS)^zyT>cR%IFe)4%2rN4ciO#MZ!i# z%-w;RVnwypV824I*A$#@0Of%^OeL-`r!Gle0c(rbMT^1+nA2a_tO4*$fd|I9;mss$alg)lpWApR0K6*^3nG5D% znwwh)UsyLN(iG()UlTgg?eaG-xXg=u`urY|YgVin?|^Lxd;!8h5Xuw+ zfn3rY4*7s1e*z@gto%FW`~{YcaTFN1_DBD4YVg;1v$cVWFrd2t;OasDQAhFL(d(}p z{;%ozZ~K>jneG4o`akRd|36wVUWt$3;NJ+m4_0>m6Oc{-EprKsM}0*ZoL~fWCw_H_ z|8FlHKtwU2V{k5ypL6_!txc@)-N3i5sgj6uE5PAd^gjQwr`ddfE=YgtVc6}hT|RCe z*JXY`@d&L|%2HDo3K7SsH8J<{mf7NxIQ<%($61t6;Ej+LYuC#tiORzQ>i7Gv)1kk-bekutC0|fY`2%|d8^ml+->4-X*n5vgztc#7|+O9_1(n$mbqtfiAU~4 z>1TQP2`t|$V=ed3ZEkwenw-Zt>?&SPdR%hd>JG(fen7tWOd>fFce)aCj@)?}uRk&! zo|V~}%|{^SqOdSFgAh`IBrtc{!b^-Y5n2_Ifj)tPPKN)MHA{n>L)Asb1EpqQ7Ob(5~Iy4Fo+>1 z1-tk1Y01I_j`v3HSm~@nfxyw+P0GDr_H8_VLcv4TW1MuyGBMXtfPK)4h<(#z^?>Gu zZk4g!%M~JN?!GizJyD9*>#?%DuP=Gs9YZ-hS}(S4PkvsfKT=nQpmr#1%>r`PbKw@C zLS3^8p5)kE9nZmQePmK^qB@r*2ktF9rP`IEQj2i6>4z*Yl>bO!S;kOvBg%r z7;XKbtJ3T80>tHyWgu32k#%7MmVQoSWaw&D3>N(&0ly@>CCL_|TuOX!Nd; zRLwBmFrKi?Ai|x!d_5M#lk9tWiB3)(_PW>}hl7n9^Vh!+gaNQCMYvP-A1*KZG2=GE zmlXn)(Hj}2;u=niv^i}1;PUM9z25<>Rh;Rw)MGVF>tlQ+VxggfP7C&rOUEhCf8+5! z7+DKrGtWZo{IyW3`5ooTmL`4L&>l#537jxk>G@AXeb&Wld_dMuljpSk`Naq42x$I= z4d;lG+Cf;vp;Fq#Qr|Po@lD$I&tmg`BJ2AG@cebFnqpW&_h34O>r!xII_z%8MB;2u zm*j?kh+x{MXvC*JXj3o3fIu5292|9m(MJfh$k7hR2%H?+?f$plV7n`5WUIE_Z?U=^ z2Iq3=h`E<(vZE%H{1WgA-2IiCnUsq_;fu^OvE-=VfPY(t0G@4tothB++trzqbeRL$ zNoV*nb;0pOlq7&48?d?mA4qB3W^Y~m#|@p)Xaw22A>*2BQCSi6@jrM_$Q2^{+c`FP zmpv^QL-Q$6pkCLA6vYwma=?Gg#qiw3J+B6MWf)1u`q#l-wk=cFz3_L7wEr(%l)t=e z*7odIzr}?dc3|#zx#s&vV*l?SRK{;E&u#DAITuY7@N-ZGk`R!YiKTJrX_uJ)0-AN- A@c;k- literal 0 HcmV?d00001 diff --git a/docs/photon-admin-guide.md b/docs/photon-admin-guide.md new file mode 100755 index 0000000000..5adb852606 --- /dev/null +++ b/docs/photon-admin-guide.md @@ -0,0 +1,1540 @@ +# Photon Administration Guide + +- [Introduction](#introduction) + - [Examining the Packages in the SPECS Directory on + Github](#examining-the-packages-in-the-specs-directory-on-github) + - [Looking at the Differences Between the Minimal and the Full + Version](#looking-at-the-differences-between-the-minimal-and-the-full-version) + - [The Root Account and the sudo and su + Commands](#the-root-account-and-the-sudo-and-su-commands) +- [Quick Start](#quick-start) + - [Obtaining the ISO from Bintray and Creating a Photon OS VM in + VMware + Workstation](#obtaining-the-iso-from-bintray-and-creating-a-photon-os-vm-in-vmware-workstation) + - [Installing the OVA for the Minimal Version in + vSphere](#installing-the-ova-for-the-minimal-version-in-vsphere) + - [Rapidly Deploying the Photon OS OVA in VMware Workstation 12 + Pro](#rapidly-deploying-the-photon-os-ova-in-vmware-workstation-12-pro) + - [Root Password Rules](#root-password-rules) + - [Permitting Root Login with + SSH](#permitting-root-login-with-ssh) + - [Deploying Photon OS on a Mac with + AppCatalyst](#deploying-photon-os-on-a-mac-with-appcatalyst) + - [PXE Boot](#pxe-boot) + - [Kickstart](#kickstart) + - [Checking the Version and Build + Number](#checking-the-version-and-build-number) +- [Tiny DNF for Package Management](#tiny-dnf-for-package-management) + - [Configuration Files and + Repositories](#configuration-files-and-repositories) + - [Options for Commands](#options-for-commands) + - [Commands](#commands) + - [Adding a New Repository](#adding-a-new-repository) +- [Managing Services with systemd](#managing-services-with-systemd) + - [Viewing Services](#viewing-services) + - [Controlling Services](#controlling-services) + - [Creating a Startup Service](#creating-a-startup-service) + - [Disabling the Photon OS + httpd.service](#disabling-the-photon-os-httpd.service) + - [Auditing System Events with + auditd](#auditing-system-events-with-auditd) + - [Analyzing systemd Logs with + journalctl](#analyzing-systemd-logs-with-journalctl) + - [Migrating Scripts to systemd](#migrating-scripts-to-systemd) +- [Managing the Network + Configuration](#managing-the-network-configuration) + - [Use `ip` and `ss` Commands Instead of `ifconfig` and + `netstat`](#use-ip-and-ss-commands-instead-of-ifconfig-and-netstat) + - [Configuring Network + Interfaces](#configuring-network-interfaces) + - [Setting a Static IP Address](#setting-a-static-ip-address) + - [Turning Off DHCP](#turning-off-dhcp) + - [Adding a DNS Server](#adding-a-dns-server) + - [Setting Up Networking for Multiple + NICs](#setting-up-networking-for-multiple-nics) + - [Combining DHCP and Static IP Addresses with IPv4 and + IPv6](#combining-dhcp-and-static-ip-addresses-with-ipv4-and-ipv6) + - [Inspecting the Status of Network Links with + `networkctl`](#inspecting-the-status-of-network-links-with-networkctl) + - [Turning on Network Debugging](#turning-on-network-debugging) + - [Mounting a Network File + System](#mounting-a-network-file-system) + - [Installing the Packages for tcpdump and netcat with + tdnf](#installing-the-packages-for-tcpdump-and-netcat-with-tdnf) +- [Cloud-Init on Photon OS](#cloud-init-on-photon-os) + - [Creating a Stand-Alone Photon Machine with + cloud-init](#creating-a-stand-alone-photon-machine-with-cloud-init) + - [Customizing a Photon OS Machine on + EC2](#customizing-a-photon-os-machine-on-ec2) + - [Running a Photon OS Machine on + GCE](#running-a-photon-os-machine-on-gce) +- [Docker Containers](#docker-containers) +- [Kubernetes](#kubernetes) +- [RPM-OSTree](#rpm-ostree) +- [Disabling TLS 1.0 to Improve Transport Layer + Security](#disabling-tls-1.0-to-improve-transport-layer-security) +- [Building a Package from a Source + RPM](#building-a-package-from-a-source-rpm) +- [References](#references) + + +## Introduction + +This guide covers managing packages, controlling services with systemd, setting up networking, initializing Photon OS with cloud-init, running Docker containers, and working with other technologies, such as Kubernetes. + +Photon OS is a Linux container host optimized for vSphere and cloud-computing platforms such as Amazon Elastic Compute and Google Compute Engine. Photon OS is lightweight and extensible. It supports the most common container formats, including Docker, Rocket, and Garden. Photon OS includes a yum-compatible, package-based lifecycle management system called tdnf and optionally works with RPM-OSTree for image-based system versioning. + +When used with development tools and environments such as VMware Fusion, VMware Workstation, HashiCorp (Vagrant and Atlas), and production runtime environments (vSphere, vCloud Air), Photon OS lets you seamlessly migrate container-based applications from development to production. With a small footprint and fast boot and run times, Photon OS is optimized for cloud computing and cloud applications. + +There are two versions of Photon OS: a minimal version and a full version. + +The minimal version of Photon OS is lightweight container host runtime environment best suited to managing and hosting containers. The minimal version contains just enough packaging and functionality to manage and modify containers while remaining a fast runtime environment. The minimal version is ready to work with appliances. + +The full version of Photon OS includes additional packages to help you customize the system and create containerized applications. For running containers, the full version is excessive. The full version is targeted at helping you create, develop, test, and package an application that runs a container. + +Two characteristics of Photon OS stand out: It manages services with systemd and it manages packages with an open source, yum-compatible package manager called tdnf, for Tiny DNF. + +By using systemd, Photon OS adopts a contemporary Linux standard to manage system services. Photon OS bootstraps the user space and concurrently starts services with systemd. The systemctl utility controls services on Photon OS. For example, instead of running the /etc/init.d/ssh script to stop and start the OpenSSH server on a init.d-based Linux system, you run the following systemctl commands on Photon OS: + + systemctl stop sshd + systemctl start sshd + +Tdnf keeps the operating system as small as possible while preserving yum's robust package-management capabilities. On Photon OS, tdnf is the default package manager for installing new packages. It is a C implementation of DNF package manager. + +### Examining the Packages in the SPECS Directory on Github + +The SPECS directory of the GitHub website for Photon OS contains all the packages that can appear in Photon OS repositories: + +https://github.com/vmware/photon/tree/master/SPECS + +To see the version of a package, in the SPECS directory, click the name of the subdirectory of the package that you want to examine, and then click the `.spec` filename in the subdirectory. For example, the version of OpenJDK, which contains the openjre package that installs the Java class library and the javac Java compiler, looks like this: + +
+%define _use_internal_dependency_generator 0
+Summary:	OpenJDK 
+Name:		openjdk
+Version:	1.8.0.72
+Release:	1%{?dist}
+License:	GNU GPL
+URL:		https://openjdk.java.net
+Group:		Development/Tools
+Vendor:		VMware, Inc.
+Distribution:   Photon
+AutoReqProv: 	no
+Source0:	http://anduin.linuxfromscratch.org/files/BLFS/OpenJDK-%{version}/OpenJDK-%{version}-x86_64-bin.tar.xz
+%define sha1 OpenJDK=0c705d7b13f4e22611d2da654209f469a6297f26
+%description
+The OpenJDK package installs java class library and javac java compiler. 
+
+%package	-n openjre
+Summary:	Jave runtime environment
+AutoReqProv: 	no
+%description	-n openjre
+It contains the libraries files for Java runtime environment
+#%global __requires_exclude ^libgif.*$
+#%filter_from_requires ^libgif.*$...
+...
+
+ +### Looking at the Differences Between the Minimal and the Full Version + +The minimal version of Photon OS contains about 50 packages. The full version of Photon OS adds several hundred packages to those in the minimal version to create a more fully featured operating system. + +You can view a list of the packages that appear in the minimal version by examining the following file: + +[https://github.com/vmware/photon/blob/master/common/data/packages_minimal.json](https://github.com/vmware/photon/blob/master/common/data/packages_minimal.json) + +You can view a list of the packages that appear in the minimal version by examining the following file: + +[https://github.com/vmware/photon/blob/master/common/data/packages_full.json](https://github.com/vmware/photon/blob/master/common/data/packages_full.json) + +If the minimal or the full version of Photon OS does not contain a package that you want, you can of course install it with tdnf, which appears in both the minimal and full versions of Photon OS by default. In the full version of Photon OS, you can also install packages by using yum. + +One notable difference between the two versions of Photon OS pertains to OpenJDK, the package that contains not only the Java runtime environment (openjre) but also the Java compiler (javac). The OpenJDK package appears in the full but not the minimal version of Photon OS. To add support for Java programs to the minimal version of Photon OS, install the Java packages and their dependencies: + + tdnf install openjdk + Installing: + openjre x86_64 1.8.0.92-1.ph1 95.09 M + openjdk x86_64 1.8.0.92-1.ph1 37.63 M + +A later section covers tdnf. + +### The Root Account and the sudo and su Commands + +This guide assumes that you are logged in to Photon OS with the root account and running commands as root. The sudo program comes with the full version of Photon OS. On the minimal version, you must install sudo with tdnf if you want to use it. As an alternative to installing sudo on the minimal version, you can switch users as needed with the `su` command to run commands that require root privileges. + +## Quick Start + +This section helps you get Photon OS up and running quickly and easily. There are several ways to deploy Photon OS for free within a matter of minutes: + +* Obtain the ISO from Bintray and use it to create a virtual machine running Photon OS. +* Install the OVA for the minimal version of Photon OS in VMware vSphere. +* Rapidly deploy the OVA for the minimal version of Photon OS in VMware Workstation 12 Pro. +* Install VMware AppCatalyst for free on a Mac and launch a virtual machine running Photon OS, which is included with AppCatalyst. + +### Obtaining the ISO from Bintray and Creating a Photon OS VM in VMware Workstation + +The full version of Photon OS installs from an ISO in VMware Workstation and other hypervisors in a matter of minutes. Photon OS is a free download from the Bintray web site. + +This section demonstrates how to create a virtual machine running Photon OS in VMware Workstation 12 Pro. If you are using a different hypervisor, the example set by this section should help you install it in your system. If you work on a Mac, see the section on deploying Photon OS on a Mac with VMware AppCatalyst below. For instructions on how to install Photon OS from an ISO in VMware vSphere, see [Installing Photon OS on VMware vSphere from an ISO Image](https://github.com/vmware/photon/wiki/Running-Project-Photon-on-vSphere). + +1. Go to the following Bintray URL and download the ISO for the general availability release of Photon OS: + + https://bintray.com/vmware/photon/iso/view + +1. In VMware Workstation, type Ctrl+N to create a new virtual machine. + +1. In the New Virtual Machine Wizard, select `Typical`, and then click `Next`. + +1. Select `Installer disk image file (iso)`, click `Browse` to locate the Photon OS ISO that you downloaded from Bintray, and then click `Next`. + +1. For the guest operating system, select `Linux`. From the `Version` drop-down menu, select `VMware Photon 64-bit`. If you have an older version of VMware Workstation and Photon does not appear in the list, select `Other Linux 3.x kernel 64-bit`. +![Alt text](images/ws-new-vm.png) + +1. Click `Next` through the remaining dialog boxes of the wizard, either accepting the default settings, which is recommended, or making the changes that you want, and then click `Finish`. + +1. Power on the virtual machine and, in the Workstation window containing Photon, press Enter to start the installation. +![installer](images/photon-installer-sm.png) + +1. During disk setup, the installer might ask you to confirm that this will erase the disk. If so, accept the default value of `yes` by hitting your Enter key. + +1. Select the installation that you want. For this example, choose `Photon Full` by using the tab key to move to Photon Full and then hitting the space bar to select it. Press Enter to install it. + +1. Either accept the default hostname that Photon provides or type the name that you want. Press Enter to continue. + +1. Type the root password. Photon OS requires the root password to be a complex string containing no common words or names. + +The installation typically completes in about 150 seconds for the full version and in less than 30 seconds for the minimal version. After the installation finishes, boot the system and log in as root with your root password. + +To connect to Photon OS by SSH, see the section on permitting root login with SSH below. + +You can also build an ISO containing Photon OS from its source code on GitHub by following the instructions in the document on [building Photon OS](https://github.com/vmware/photon/blob/master/docs/build-photon.md). + +### Installing the OVA for the Minimal Version in vSphere + +You can download the OVA for the minimal version of Photon OS from Bintray and deploy it in vSphere in a matter of seconds. + +Download the OVA for the minimal version of Photon OS from the following URL: + + https://bintray.com/vmware/photon/ova + +To install the OVA in vSphere, on the File menu, click Deploy OVF Template, and then click Browse to locate the image that you downloaded. Move through the Deploy OVF Template dialog boxes by clicking Next to accept the default settings, and then click Finish. + +In vSphere Client, turn on the power of the Photon OS virtual machine and open a console to it. + +The default password for the root account is `changeme`, and you must change it when you first login. For security, Photon OS forbids common dictionary words for the root password. + +There are other options for installing Photon OS in vSphere, such as building an ISO from the source code. For more information about the versions of Photon and their installation options, see [Running Photon OS on vSphere](https://github.com/vmware/photon/wiki/Running-Project-Photon-on-vSphere). + +### Rapidly Deploying the Photon OS OVA in VMware Workstation 12 Pro + +Here's how to rapidly deploy the OVA for Photon in VMware Workstation 12 Pro by using an up-to-date version of Firefox. The procedure in other browsers or another version of Workstation might be different. + +In Firefox, download the OVA for the minimal version of Photon OS from this URL: + + https://bintray.com/vmware/photon/ova + +In the download dialog box, select `Open with VMware Workstation (default)`, like this: + +![Alt text](images/ova-firefox.png) + +In the Workstation Import dialog box, click Import. + +![Alt text](images/ova-import.png) + +Workstation creates a virtual machine from the Photon OS OVA template in a few seconds. In Workstation, power on the virtual machine and log in as root with the initial password of `changeme`. + +Photon OS then prompts you to change the root password. + +### Root Password Rules + +When you first log on a new Photon OS machine, you must set the root password to a complex string containing no common words or names. Photon OS rejects a root password that contains simplistic patterns, common words, or words derived from the name of your account. The rules apply only to the root password, not other user and group accounts. + +### Permitting Root Login with SSH + +The full version of Photon OS prevents root login with SSH by default. To permit root login over SSH, open `/etc/ssh/sshd_config` with the vim text editor and set `PermitRootLogin` to `yes`. + +Vim is the default text editor available in both the full and minimal versions of Photon OS. (Nano is also in the full version.) After you modify the SSH daemon's configuration file, you must restart the sshd daemon for the changes to take effect. Example: + + vim /etc/ssh/sshd_config + + # override default of no subsystems + Subsystem sftp /usr/libexec/sftp-server + + # Example of overriding settings on a per-user basis + #Match User anoncvs + # X11Forwarding no + # AllowTcpForwarding no + # PermitTTY no + # ForceCommand cvs server + PermitRootLogin yes + UsePAM yes + +Save your changes in vim and then restart the sshd daemon: + + systemctl restart sshd + +You can then connect to the Photon OS machine with the root account over SSH: + + steve@ubuntu:~$ ssh root@192.168.137.131 + +### Deploying Photon OS on a Mac with AppCatalyst + +VMware AppCatalyst brings the data center to your Mac desktop. AppCatalyst furnishes a Mac computer with a free hypervisor for creating virtual machines that run Photon OS, which is bundled with AppCatalyst. + +Driven by an API and a command-line interface, AppCatalyst empowers you to replicate a cluster of virtual machines on a Mac to build containerized applications with microservices on Photon OS. AppCatalyst also integrates with Vagrant. AppCatalyst is a technology preview. + +AppCatalyst is optimized for cloud-native application workloads. A common use case of developers is to run a desktop hypervisor so they can install a Linux machine, and for many developers, this setup takes place on a Mac. For these developers, a common use case for the desktop hypervisor is running Docker to accelerate the development and testing of their code. + +By bundling Photon OS with AppCatalyst, VMware streamlines the workflow of getting a Docker engine running on a Linux machine inside a hypervisor on a Mac. + +Here's how to install AppCatalyst, create a VM running Photon OS, and run a Docker container---all in a matter of minutes. The technology preview version of AppCatalyst requires Mac OS X 10.9 or later. + +First, turn off Fusion if you are running it on your Mac. + +Second, download AppCatalyst from the following URL and then install the `.dmg` file by following the instructions in the installation wizard: + + https://www.vmware.com/cloudnative/appcatalyst-download + +After the wizard finishes installing AppCatalyst, you're ready to run the application. AppCatalyst does not appear in the Applications directory. Instead, in Terminal, run the following command: + + /opt/vmware/appcatalyst/bin/appcatalyst + +The following command creates a VM named `photonos1` by taking advantage of the template for Photon OS that is built into AppCatalyst: + + /opt/vmware/appcatalyst/bin/appcatalyst vm create photonos1 + +By default, the VMs that you create reside in the `AppCatalyst` subdirectory of the user's `/Documents` directory. + +Next, make sure that there are no machines running in VMware Fusion and that it is shut down, and then turn on the VM by running this command. + + /opt/vmware/appcatalyst/bin/appcatalyst vmpower on photonos1 + +Obtain the IP address of the VM so you can establish an SSH connection to it: + + /opt/vmware/appcatalyst/bin/appcatalyst guest getip photonos1 + +You can then connect to the VM with the SSH keys included with AppCatalyst by running the following command and replacing the example IP address with the IP address of your VM: + + ssh -i /opt/vmware/appcatalyst/etc/appcatalyst_insecure_ssh_key photon@192.168.137.131 + +Photon OS includes Docker. From your SSH terminal connection to the Photon OS virtual machine, you can launch a Docker container that, for example, downloads Ubuntu from the Docker repository and runs it in the Photon OS VM in AppCatalyst on your Mac: + + systemctl start docker + docker run -i -t ubuntu:14.04 /bin/bash + +When you are done, exit the Ubuntu machine to stop the Docker container to conserve system resources. + +Photon OS also gives you the option of running a Docker container that, in turn, runs an instance of Photon OS: + + docker run -i -t photon /bin/bash + +If you need to troubleshoot, the log files for AppCatalyst reside here: + + /Users//Library/Logs/VMware + +Virtual machines in AppCatalyst can be managed through its API. For more information, see the [AppCatalyst documentation](http://getappcatalyst.com/docs/Tech_Preview_August/) and the [AppCatalyst community site](https://communities.vmware.com/community/vmtn/devops/vmware-appcatalyst). + +### PXE Boot + +Photon OS works with the Preboot Execution Environment, or PXE, to boot by retrieving software from a PXE server over a network connection. For instructions on how to set Photon OS to boot from a PXE server, see [Network PXE Boot](https://github.com/vmware/photon/blob/master/docs/PXE-boot.md). + +### Kickstart + +Photon OS supports kickstart for unattended installations through a CD-ROM or an HTTP server. On Photon OS, kickstart can set the hostname, password, run post-installation scripts, and add public keys for SSH. See [Kickstart Support](https://github.com/vmware/photon/blob/master/docs/kickstart.md). + +### Checking the Version and Build Number + +To check the version and build number of Photon OS, concatenate `/etc/photon-release`. Example: + + cat /etc/photon-release + VMware Photon Linux 1.0 + PHOTON_BUILD_NUMBER=a6f0f63 + +The build number in the results maps to the commit number on the VMware Photon OS GitHub [commits page](https://github.com/vmware/photon/commits/master). + +## Tiny DNF for Package Management + +On Photon OS, Tiny DNF is the default package manager for installing new packages. Tdnf is a C implementation of DNF package manager. The standard syntax for tdnf commands is the same as that for DNF: + + tdnf [options] [...] + +You can view its help information like this: + + tdnf --help + tdnf -h + +In the minimal version of Photon OS, tdnf serves as the sole package manager to streamline the operating system. The full version of Photon OS includes yum, a common utility that checks for, downloads, and automatically installs RPM packages. On the minimal version of Photon OS, you can install yum by using tdnf if you are unconcerned with the size of the operating system: + + tdnf install yum + +### Configuration Files and Repositories + +The main configuration files reside in /etc/tdnf/tdnf.conf. The configuration file looks like this: + + cat /etc/tdnf/tdnf.conf + [main] + gpgcheck=1 + installonly_limit=3 + clean_requirements_on_remove=true + repodir=/etc/yum.repos.d + cachedir=/var/cache/tdnf + +The cache files for data and metadata reside in /var/cache/tdnf. + +The repositories appear in /etc/yum.repos.d/ with `.repo` file extensions: + + ls /etc/yum.repos.d/ + lightwave.repo + photon-extras.repo + photon-iso.repo + photon-updates.repo + photon.repo + +You can list the the repositories by using the tdnf repolist command. Tdnf filters the results with `enabled`, `disabled`, and `all`. Running the command without specifying an argument returns the enabled repositories: + + tdnf repolist + repo id repo name status + lightwave VMware Lightwave 1.0(x86_64) enabled + photon-updates VMware Photon Linux 1.0(x86_64)Updates enabled + photon-extras VMware Photon Extras 1.0(x86_64) enabled + photon VMware Photon Linux 1.0(x86_64) enabled + +The photon-iso.repo, however, does not appear in the list of repositories because it is unavailable on the virtual machine from which these examples are taken. Photon-iso.repo is the default repository; it points to /media/cdrom. The contents of photon-iso.repo look like this: + + cat /etc/yum.repos.d/photon-iso.repo + [photon-iso] + name=VMWare Photon Linux 1.0(x86_64) + baseurl=file:///mnt/cdrom/RPMS + gpgkey=file:///etc/pki/rpm-gpg/VMWARE-RPM-GPG-KEY + gpgcheck=1 + enabled=0 + skip_if_unavailable=True + +The local cache is populated with data from the repository: + + ls -l /var/cache/tdnf/photon + total 8 + drwxr-xr-x 2 root root 4096 May 18 22:52 repodata + d-wxr----t 3 root root 4096 May 3 22:51 rpms + +You can clear the cache to help troubleshoot a problem, but keep in mind that doing so might slow the performance of tdnf until the cache becomes repopulated with data. Here is how to clear the cache: + + tdnf clean all + Cleaning repos: photon photon-extras photon-updates lightwave + Cleaning up everything + +The command purges the repository data from the cache: + + ls -l /var/cache/tdnf/photon + total 4 + d-wxr----t 3 root root 4096 May 3 22:51 rpms + +### Options for Commands + +You can add the following options to tdnf commands. If the option to override a configuration is unavailable in a command, consider adding it to the configuration file, /etc/tdnf/tdnf.conf. + + OPTION DESCRIPTION + --allowerasing Allow erasing of installed packages to resolve dependencies + --assumeno Answer no for all questions + --best Try the best available package versions in transactions + --debugsolver Dump data aiding in dependency solver debugging info. + --disablerepo= Disable specific repositories by an id or a glob. + --enablerepo= Enable specific repositories + -h, --help Display help + --refresh Set metadata as expired before running command + --nogpgcheck Skip gpg check on packages + --rpmverbosity= Debug level for rpm + --version Print version and exit + -y, --assumeyes Answer yes to all questions + +Here is an example that adds the short form of the `assumeyes` option to the install command: + + tdnf -y install gcc + Upgrading: + gcc x86_64 5.3.0-1.ph1 91.35 M + + +### Commands + +**check-local**: This command resolves dependencies by using the local RPMs to help check RPMs for quality assurance before publishing them. To check RPMs with this command, you must create a local directory and place your RPMs in it. The command, which includes no options, takes the path to the local directory containing the RPMs as its argument. The command does not, however, recursively parse directories; it checks the RPMs only in the directory that you specify. For example, after creating a directory named `/tmp/myrpms` and placing your RPMs in it, you can run the following command to check them: + + tdnf check-local /tmp/myrpms + Checking all packages from: /tmp/myrpms + Found 10 packages + Check completed without issues + +**check-update**: This command checks for updates to packages. It takes no arguments. The `tdnf list updates` command performs the same function. Here is an example of the `check update` command: + + tdnf check-update + rpm-devel.x86_64 4.11.2-8.ph1 photon + yum.noarch 3.4.3-3.ph1 photon + +**clean**: This command cleans up temporary files, data, and metadata. It takes the argument `all`. Example: + + tdnf clean all + Cleaning repos: photon photon-extras photon-updates lightwave + Cleaning up everything + +**distro-sync**: This command synchronizes the machine's RPMs with the latest version of all the packages in the repository. Abridged example: + + tdnf distro-sync + + Upgrading: + zookeeper x86_64 3.4.8-2.ph1 3.38 M + yum noarch 3.4.3-3.ph1 4.18 M + + Total installed size: 113.01 M + + Reinstalling: + zlib-devel x86_64 1.2.8-2.ph1 244.25 k + zlib x86_64 1.2.8-2.ph1 103.93 k + yum-metadata-parser x86_64 1.1.4-1.ph1 57.10 k + + Total installed size: 1.75 G + + Obsoleting: + tftp x86_64 5.2-3.ph1 32.99 k + + Total installed size: 32.99 k + Is this ok [y/N]: + +**downgrade**: This command downgrades the package that you specify as an argument to the next lower package version. Example: + + tdnf downgrade boost + Downgrading: + boost x86_64 1.56.0-2.ph1 8.20 M + Total installed size: 8.20 M + Is this ok [y/N]:y + Downloading: + boost 2591470 100% + Testing transaction + Running transaction + Complete! + +To downgrade to a version lower than the next one, you must specify it by name, epoch, version, and release, all properly hyphenated. Example: + + tdnf downgrade boost-1.56.0-2.ph1 + +**erase**: This command removes the package that you specify as an argument. Example: + + tdnf erase vim + Removing: + vim x86_64 7.4-4.ph1 1.94 M + Total installed size: 1.94 M + Is this ok [y/N]: + +You can also erase multiple packages: + + tdnf erase docker cloud-init + +**info**: This command displays information about packages. It can take the name of a package. Or it can take one of the following arguments: all, available, installed, extras, obsoletes, recent, upgrades. Examples: + + tdnf info ruby + tdnf info obsoletes + tdnf info upgrades + +**install**: This command takes the name of a package as its argument. It then installs the package and its dependencies. Examples: + + tdnf install kubernetes + +You can also install multiple packages: + + tdnf install python-curses lsof audit gettext chkconfig ntsysv bindutils + wget gawk irqbalance lvm2 cifs-utils c-ares distrib-compat + + +**list**: This command lists the packages of the package that you specify as the argument. The command can take one of the following arguments: all, available, installed, extras, obsoletes, recent, upgrades. + + tdnf list updates + +The list of packages might be long. To more easily view it, you can concatenate it into a text file, and then open the text file in a text editor: + + tdnf list all > pkgs.txt + vi pkgs.txt + +**makecache**: This command updates the cached binary metadata for all known repositories. Example: + + tdnf makecache + Refreshing metadata for: 'VMware Lightwave 1.0(x86_64)' + Refreshing metadata for: 'VMware Photon Linux 1.0(x86_64)Updates' + Refreshing metadata for: 'VMware Photon Extras 1.0(x86_64)' + Refreshing metadata for: 'VMware Photon Linux 1.0(x86_64)' + Metadata cache created. + +**provides**: This command finds the packages that provide the package that you supply as an argument. Examples: + + tdnf provides docker + docker-1.11.0-1.ph1.x86_64 : Docker + Repo : photon + docker-1.11.0-1.ph1.x86_64 : Docker + Repo : @System + +**reinstall**: This command reinstalls the packages that you specify. If some packages are unavailable or not installed, the command fails. Example: + + tdnf reinstall docker kubernetes + + Reinstalling: + kubernetes x86_64 1.1.8-1.ph1 152.95 M + docker x86_64 1.11.0-1.ph1 57.20 M + + Total installed size: 210.15 M + +**remove**: This command removes a package. When removing a package, tdnf by default also removes dependencies that are no longer used if they were was installed by tdnf as a dependency without being explicitly requested by a user. You can modify the dependency removal by changing the `clean_requirements_on_remove` option in /etc/tdnf/tdnf.conf to `false`. + + tdnf remove packagename + +**search**: This command searches for the attributes of packages. The argument can be the names of packages, as this example testifies: + + tdnf search docker kubernetes + docker : Docker + docker : Docker + docker-debuginfo : Debug information for package docker + docker : Docker + kubernetes : Kubernetes cluster management + kubernetes : Kubernetes cluster management + kubernetes-debuginfo : Debug information for package kubernetes + kubernetes : Kubernetes cluster management + +The argument of the search command can also be a keyword or a combination of keywords and packages: + + tdnf search terminal bash + rubygem-terminal-table : Simple, feature rich ascii table generation library + ncurses : Libraries for terminal handling of character screens + mingetty : A minimal getty program for virtual terminals + ncurses : Libraries for terminal handling of character screens + ncurses : Libraries for terminal handling of character screens + bash : Bourne-Again SHell + bash-lang : Additional language files for bash + bash-lang : Additional language files for bash + bash : Bourne-Again SHell + bash-debuginfo : Debug information for package bash + bash : Bourne-Again SHell + bash-lang : Additional language files for bash + +**upgrade**: This command upgrades the package or packages that you specify to an available higher version that tdnf can resolve. If the package is already the latest version, the command returns `Nothing to do`. Example: + + tdnf upgrade boost + + Upgrading: + boost x86_64 1.60.0-1.ph1 8.11 M + + Total installed size: 8.11 M + Is this ok [y/N]:y + + Downloading: + boost 2785950 100% + Testing transaction + Running transaction + + Complete! + +You can also run the `upgrade` command with the `refresh` option to update the cached metadata with the latest information from the repositories. The following example refreshes the metadata and then checks for a new version of tdnf but does not find one, so tdnf takes no action: + + tdnf upgrade tdnf --refresh + Refreshing metadata for: 'VMware Lightwave 1.0(x86_64)' + Refreshing metadata for: 'VMware Photon Linux 1.0(x86_64)Updates' + Refreshing metadata for: 'VMware Photon Extras 1.0(x86_64)' + Refreshing metadata for: 'VMware Photon Linux 1.0(x86_64)' + Nothing to do. + +**upgrade-to**: This command upgrades to the version of the package that you specify. Example: + + tdnf upgrade-to ruby2.3 + +The commands and options of tdnf are, at present, a subset of those of dnf. For more help with tdnf commands, see the [DNF documentation](https://media.readthedocs.org/pdf/dnf/latest/dnf.pdf). + +### Adding a New Repository + +With Photon OS, you can add a new repository from which tdnf installs packages. To do so, you create a repository configuration file with a `.repo` extension and place it in /etc/yum.repos.d. The repository can be on either the Internet or a local server containing your in-house applications. + +Be careful if you add a repository that's on the Internet: Installing packages from untrusted or unverified sources might put the security, stability, or compatibility of your system at risk. It might also make your system harder to maintain. + +On Photon OS, the existing repositories appear in /etc/yum.repos.d: + + ls /etc/yum.repos.d/ + lightwave.repo + photon-extras.repo + photon-iso.repo + photon-updates.repo + photon.repo + +Looking at one of the `.repo` files reveals the format and information that a new repository configuration file should contain: + + cat /etc/yum.repos.d/lightwave.repo + [lightwave] + name=VMware Lightwave 1.0(x86_64) + baseurl=https://dl.bintray.com/vmware/lightwave + gpgkey=file:///etc/pki/rpm-gpg/VMWARE-RPM-GPG-KEY + gpgcheck=1 + enabled=1 + skip_if_unavailable=True + +The minimal information needed to establish a repository is an ID and human-readable name of the repository and its base URL. The ID, which appears in square brackets, must be one word that is unique amoung the system's repositories; in the example above, it is `[lightwave]`. + +The `baseurl` is a URL for the repository's repodata directory. For a repository on a local server that can be accessed directly or mounted as a file system, the base URL can be a file referenced by `file://`. Example: + + baseurl=file:///server/repo/ + +The `gpgcheck` setting specifies whether to check the GPG signature. The `gpgkey` setting furnishes the URL for the repository's ASCII-armored GPG key file. Tdnf uses the GPG key to verify a package if its key has not been imported into the RPM database. + +The `enabled` setting tells tdnf whether to poll the repository. If `enabled` is set to `1`, tdnf polls it; if it is set to `0`, tdnf ignores it. + +The `skip_if_unavailable` setting instructs tdnf to continue running if the repository goes offline. + +Other options and variables can appear in the repository file. The variables that go with some of the options can reduce future changes to the repository configuration files. There are variables to replace the value of the version of the package and to replace the base architecture. For more information, see the man page for yum.conf on the full version of Photon OS: `man yum.conf` + +Here is an example of how to add a new repository for a local server that tdnf polls for packages: + + cat > /etc/yum.repos.d/apps.repo << "EOF" + [localapps] + name=Local In-House Applications(x86_64) + baseurl=file:///appserver/apps + enabled=1 + skip_if_unavailable=True + EOF + +Because this new repository resides on a local server, make sure the Photon OS machine can connect to it by, for instance, mounting it. + +After establishing a new repository, you must run the following command to update the cached binary metadata for the repositories that tdnf polls. Example: + + tdnf makecache + Refreshing metadata for: 'VMware Lightwave 1.0(x86_64)' + Refreshing metadata for: 'VMware Photon Linux 1.0(x86_64)Updates' + Refreshing metadata for: 'VMware Photon Extras 1.0(x86_64)' + Refreshing metadata for: 'Local In-House Applications(x86_64)' + Refreshing metadata for: 'VMware Photon Linux 1.0(x86_64)' + Metadata cache created. + +## Managing Services with systemd + +Photon OS manages services with systemd. By using systemd, Photon OS adopts a contemporary Linux standard to bootstrap the user space and concurrently start services---an architecture that differs from traditional Linux systems such as SUSE Linux Enterprise Server. + +A traditional Linux system contains an initialization system called SysVinit. With SLES 11, for instance, SysVinit-style init programs control how the system starts up and shuts down. Init implements system runlevels. A SysVinit runlevel defines a state in which a process or service runs. + +In contrast to a SysVinit system, systemd defines no such runlevels. Instead, systemd uses a dependency tree of targets to determine which services to start when. Combined with the declarative nature of systemd commands, systemd targets reduce the amount of code needed to run a command, leaving you with code that is easier to maintain and probably faster to execute. For an overview of systemd, see [systemd System and Service Manager](https://www.freedesktop.org/wiki/Software/systemd/) and the [man page for systemd](https://www.freedesktop.org/software/systemd/man/systemd.html). + +On Photon OS, you should manage services with systemd and its command-line utility for inspecting and controlling the system, `systemctl`, not the deprecated commands of init.d. + +The following sections present a brief overview of useful systemctl commands and options for examining and managing the state of systemd services. For more information, see the index of all the systemd man pages, including systemctl, at the following URL: + +[https://www.freedesktop.org/software/systemd/man/](https://www.freedesktop.org/software/systemd/man/) + +### Viewing Services + +To view a description of all the active, loaded units, execute the systemctl command without any options or arguments: + + systemctl + +To see all the loaded, active, and inactive units and their description, run this command: + + systemctl --all + +To see all the unit files and their current status but no description, run this command: + + systemctl list-unit-files + +The `grep` command filters the services by a search term, a helpful tactic to recall the exact name of a unit file without looking through a long list of names. Example: + + systemctl list-unit-files | grep network + org.freedesktop.network1.busname static + dbus-org.freedesktop.network1.service enabled + systemd-networkd-wait-online.service enabled + systemd-networkd.service enabled + systemd-networkd.socket enabled + network-online.target static + network-pre.target static + network.target static + +### Controlling Services + +To control services on Photon OS, you use systemctl. For example, instead of running the /etc/init.d/ssh script to stop and start the OpenSSH server on a init.d-based Linux system, you run the following systemctl commands on Photon OS: + + systemctl stop sshd + systemctl start sshd + +The systemctl tool includes a range of commands and options for inspecting and controlling the state of systemd and the service manager; for more information, see the [systemctl man page](https://www.freedesktop.org/software/systemd/man/systemctl.html). + +### Creating a Startup Service + +This section shows you how to create a systemd startup service that changes the maximum transmission unit, or MTU, of the default Ethernet connection, eth0. + +First, concatenate the following block of code into a file: + + cat << EOF >> /lib/systemd/system/eth0.service + [Unit] + Description=Network interface initialization + After=local-fs.target network-online.target network.target + Wants=local-fs.target network-online.target network.target + + [Service] + ExecStart=/bin/ifconfig eth0 mtu 1460 up + Type=oneshot + + [Install] + WantedBy=multi-user.target + EOF + +Second, set the service to auto-start when the system boots: + + cd /lib/systemd/system/multi-user.target.wants/ + ln -s ../eth0.service eth0.service + +### Disabling the Photon OS httpd.service + +If your application or appliance includes its own HTTP server, you should turn off and disable the HTTP server that comes with Photon OS so that it does not conflict with your own HTTP server. + +To support the option to run RPM-OSTree, the full version of Photon OS runs the httpd.service by default. To stop it and disable it, run the following commands as root: + + systemctl stop httpd.service + systemctl disable httpd.service + +### Auditing System Events with auditd + +Because Photon OS emphasizes security, the Linux auditing service, auditd, is enabled and active by default on the full version of Photon OS: + + systemctl status auditd + * auditd.service - Security Auditing Service + Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled; vendor preset: enabled) + Active: active (running) since Fri 2016-04-29 15:08:50 UTC; 1 months 9 days ago + Main PID: 250 (auditd) + CGroup: /system.slice/auditd.service + `-250 /sbin/auditd -n + +To help improve security, the auditd service can monitor file changes, system calls, executed commands, authentication events, and network access. After you implement an audit rule to monitor an event, the `aureport` tool generates reports to display information about the events. + +You can, for instance, use the auditctl utility to set a rule that monitors the sudoers file for changes: + + auditctl -w /etc/sudoers -p wa -k sudoers_changes + +This rule specifies that the auditd service watch (`-w`) the /etc/sudoers file to log permissions changes (`p`) to the write access (`w`) or attributes (`a`) of the file and to identify them in logs as `sudoers_changes`. The auditing logs appear in /var/log/audit/audit.log. You can list the auditing rules like this: + + auditctl -l + -w /etc/sudoers -p wa -k sudoers_changes + +For more information on the Linux Audit Daemon, see its man page on Photon OS: + + man auditd + +For more information on setting auditing rules and options with auditctl, see its man page: + + man auditctl + +For more information on viewing reports on audited events, see the aureport man page: + + man aureport + +### Analyzing systemd Logs with journalctl + +The journalctl tool queries the contents of the systemd journal. For help troubleshooting systemd, two journalctl queries are particularly useful: showing the log entries for the last boot and showing the log entries for a systemd service unit. + +This command displays the messages that systemd generated during the last time the machine started: + + journalctl -b + +This command reveals the messages for only the systemd service unit specified by the `-u` option, which is auditd in the following example: + + journalctl -u auditd + +For more information, see the journalctl man page: `man journalctl` + +### Migrating Scripts to systemd + +Although systemd maintains compatibility with init.d scripts, you should, as a best practice, adapt the scripts that you want to run on Photon OS to systemd to avoid potential problems. Such a conversion standardizes the scripts, reduces the footprint of your code, makes the scripts easier to read and maintain, and improves their robustness on a systemd system. + +## Managing the Network Configuration + +The network service, which is enabled by default, starts when the system boots. You manage the network service by using systemd commands, such as systemd-networkd, systemd-resolvd, and networkctl. You can check its status of the network service by running the following command: + + systemctl status systemd-networkd + +Here is a healthy result of the command: + + * systemd-networkd.service - Network Service + Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled) + Active: active (running) since Fri 2016-04-29 15:08:51 UTC; 6 days ago + Docs: man:systemd-networkd.service(8) + Main PID: 291 (systemd-network) + Status: "Processing requests..." + CGroup: /system.slice/systemd-networkd.service + `-291 /lib/systemd/systemd-networkd + +Because Photon OS relies on systemd to manage services, you should employ the systemd suite of commands, not deprecated init.d commands or other deprecated commands, to manage networking. + +### Use `ip` and `ss` Commands Instead of `ifconfig` and `netstat` + +Although the `ifconfig` command and the `netstat` command work on Photon OS, VMware recommends that you use the `ip` or `ss` commands. The `ipconfig` and `netstat` commands are deprecated. + +For example, instead of running `netstat` to display a list of network interfaces, run the `ss` command. Similarly, to display information for IP addresses, instead of running `ifconfig -a`, run the `ip addr` command. Examples: + + USE THIS IPROUTE COMMAND INSTEAD OF THIS NET-TOOL COMMAND + ip addr ifconfig -a + ss netstat + ip route route + ip maddr netstat -g + ip link set eth0 up ifconfig eth0 up + ip -s neigh arp -v + ip link set eth0 mtu 9000 ifconfig eth0 mtu 9000 + +Using the `ip route` version of a command instead of the net-tools version often provides more complete, accurate information on Photon OS, as the following example demonstrates: + + ip neigh + 192.168.137.2 dev eth0 lladdr 00:50:56:e2:02:0f STALE + 192.168.137.254 dev eth0 lladdr 00:50:56:e7:13:d9 STALE + 192.168.137.1 dev eth0 lladdr 00:50:56:c0:00:08 DELAY + + arp -a + ? (192.168.137.2) at 00:50:56:e2:02:0f [ether] on eth0 + ? (192.168.137.254) at 00:50:56:e7:13:d9 [ether] on eth0 + ? (192.168.137.1) at 00:50:56:c0:00:08 [ether] on eth0 + +### Configuring Network Interfaces + +Network configuration files for systemd-networkd reside in /etc/systemd/network and /usr/lib/systemd/network. Example: + + root@photon-rc [ ~ ]# ls /etc/systemd/network/ + 10-dhcp-en.network + +By default, when Photon OS starts, it creates a DHCP network configuration file, or rule, which appears in /etc/systemd/network, the highest priority directory for network configuration files: + + cat /etc/systemd/network/10-dhcp-en.network + [Match] + Name=e* + + [Network] + DHCP=yes + +Network configuration files can also appear in the system network directory, /usr/lib/systemd/network, as the results of the following search illustrate: + + root@photon-rc [ ~ ]# updatedb + root@photon-rc [ ~ ]# locate systemd/network + /etc/systemd/network + /etc/systemd/network/10-dhcp-en.network + /usr/lib/systemd/network + /usr/lib/systemd/network/80-container-host0.network + /usr/lib/systemd/network/80-container-ve.network + /usr/lib/systemd/network/99-default.link + root@photon-rc [ ~ ]# + +As you can see, the /usr/lib/systemd/network directory contains several network configuration files. Photon OS applies the configuration files in the [lexicographical order](https://en.wikipedia.org/wiki/Lexicographical_order) specified by the file names without regard for the network configuration directory in which the file resides unless the file name is the same. Photon OS processes files with identical names by giving precedence to files in the /etc directory over the other directory. Thus, the settings in /etc/systemd/network override those in /usr/lib/systemd/network. Once Photon OS matches an interface in a file, Photon OS ignores the interface if it appears in files processed later in the lexicographical order. + +Each .network file contains a matching rule and a configuration that Photon OS applies when a device matches the rule. You set the matching rule and the configuration as sections containing vertical sets of key-value pairs according to the information at https://www.freedesktop.org/software/systemd/man/systemd.network.html. + +To configure Photon OS to handle a networking use case, such as setting a static IP address or adding a name server, you create a configuration file with a `.network` extension and place it in the /etc/systemd/network directory. For Photon OS to apply the new configuration, you must restart the `systemd-networkd` service by running the following command: + + systemctl restart systemd-networkd + +For information about network configuration files, their processing order, and their matching rules, sections, and keys, see https://www.freedesktop.org/software/systemd/man/systemd.network.html. + +For information about creating virtual network device files (`.netdev`), see https://www.freedesktop.org/software/systemd/man/systemd.netdev.html. + +### Setting a Static IP Address + +Before you set a static IP address, obtain the name of your Ethernet link by running the following command: + + networkctl + IDX LINK TYPE OPERATIONAL SETUP + 1 lo loopback carrier unmanaged + 2 eth0 ether routable configured + +In the results of the command, you can see the name of an Ethernet link, `eth0`. + +To create a network configuration file that systemd-networkd uses to establish a static IP address for the eth0 network interface, execute the following command as root: + + cat > /etc/systemd/network/10-static-en.network << "EOF" + + [Match] + Name=eth0 + + [Network] + Address=192.168.0.2/24 + Gateway=192.168.0.1 + EOF + +Apply the configuration by running the following command: + + systemctl restart systemd-networkd + +For more information, see the man page for systemd-networkd: `man systemd.network` + +### Turning Off DHCP + +By default, when Photon OS first starts, it creates a DHCP network configuration file, or rule, which appears in /etc/systemd/network, the highest priority directory for network configuration files: + + cat /etc/systemd/network/10-dhcp-en.network + [Match] + Name=e* + + [Network] + DHCP=yes + +To turn off DHCP for all Ethernet interfaces, change the value of `DHCP` from `yes` to `no`, save the changes, and then restart the `systemd-networkd` service: + + systemctl restart systemd-networkd + +### Adding a DNS Server + +Photon OS resolves domain names, IP addresses, and network names for local applications by using systemd-resolved. The systemd-resolved daemon automatically creates and maintains the /etc/resolv.conf file, into which systemd-resolved places the IP address of the DNS server. You should therefore never modify the /etc/resolv.conf file. + +(If you want to implement a local resolver like bind instead of systemd-resolved, stop the systemd-resolved service and disable it.) + +If you open the default /etc/resolv.conf file after you deploy Photon OS, it looks like this: + + root@photon-rc [ ~ ]# cat /etc/resolv.conf + # This file is managed by systemd-resolved(8). Do not edit. + # + # Third party programs must not access this file directly, but + # only through the symlink at /etc/resolv.conf. To manage + # resolv.conf(5) in a different way, replace the symlink by a + # static file or a different symlink. + + nameserver 192.168.137.2 + +To add a DNS server to your static network configuration file, insert a DNS key into the Network section of, in this example, /etc/systemd/network/10-eth0-static.network and set it to the IP address of your DNS server: + + [Match] + Name=e* + + [Network] + Address=192.168.0.2/24 + Gateway=192.168.0.1 + DNS=192.168.0.1 + +Another way of adding a DNS server is to modify /etc/systemd/resolved.conf --- a method that can be particularly useful when your machine is working with DHCP. For more information, see https://www.freedesktop.org/software/systemd/man/resolved.conf.html. + +You can optionally activate the local DNS stub resolver of systemd-resolved by adding `dns` and `resolve` to /etc/nsswitch.conf. To do so, make a backup copy of /etc/nsswitch.conf and then execute the following command as root: + + sed -i 's/^hosts.*$/hosts: files resolve dns/' /etc/nsswitch.conf + +For more information on the systemd-resolved service, see https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html. + + +### Setting Up Networking for Multiple NICs + +If your machine contains multiple NICs, you should, as a best practice, create a .network configuration file for each network interface. The following scenario demonstrates how to set one wired network interface to use a static IP address and another wired network interface to use a dynamic IP address obtained through DHCP. Keep in mind that the following configurations are examples: You must change the IP addresses and other information to match your network and requirements. + +First, create the .network file for the static Ethernet connection in /etc/systemd/network. A best practice is to match the exact name of the network interface, which is in this example eth0. This example file also includes a DNS server for the static IP address. As a result, the configuration sets the UseDNS key to false in the DHCP column so that Photon OS ignores the DHCP server for DNS for this interface. + + cat > /etc/systemd/network/10-eth0-static-en.network << "EOF" + [Match] + Name=eth0 + + [Network] + Address=10.137.20.11/19 + Gateway=10.137.23.253 + DNS=10.132.71.1 + + [DHCP] + UseDNS=false + EOF + +Second, create the .network file for the second network interface, which is named eth1 in this example. This configuration file sets the eth1 interface to an IP address from DHCP and sets DHCP as the source for DNS lookups. Setting the DHCP key to `yes` acquires an IP address for IPv4 and IPv6. To acquire an IP address for IPv4 only, set the DHCP key to ipv4. + + cat > /etc/systemd/network/50-eth1-dhcp-en.network << "EOF" + + [Match] + Name=eth1 + + [Network] + DHCP=yes + + [DHCP] + UseDNS=true + EOF + +### Combining DHCP and Static IP Addresses with IPv4 and IPv6 + +This section presents examples that demonstrate how to combine DHCP and static IP addresses with both IPv4 and IPv6. + +Here's how to use DHCP to allocate both IPv4 and IPv6 addresses: + + [Network] + DHCP=yes + +Here's how to use DHCP to allocate only IPv4 addresses: + + [Network] + DHCP=ipv4 + +Here's how to use DHCP to allocate only IPv6 addresses: + + [Network] + DHCP=ipv6 + +Here's how to use DHCP for IPv4 addresses and static IP addresses for IPv6 addresses: + + [Network] + DHCP=ipv4 + Address=fd00::1/48 + Gateway=fd00::252 + +Here's how to use DHCP for IPv6 addresses and static IP addresses for IPv4: + + [Network] + DHCP=ipv6 + Address=10.10.10.1/24 + Gateway=10.10.10.253 + +Here's how to use static IP addresses for both IPv4 and IPv6: + + [Network] + DHCP=ipv6 + Address=10.10.10.1/24 + Gateway=10.10.10.253 + Address=fd00::1/48 + Gateway=fd00::252 + +### Inspecting the Status of Network Links with `networkctl` + +The `networkctl` command shows information about network connections that helps you configure networking services and troubleshoot networking problems. You can, for example, progressively add options and arguments to the `networkctl` command to move from general information about network connections to specific information about a network connection. + +Running `networkctl` without options defaults to the list command: + + networkctl + IDX LINK TYPE OPERATIONAL SETUP + 1 lo loopback carrier unmanaged + 2 eth0 ether routable configured + 3 docker0 ether routable unmanaged + 11 vethb0aa7a6 ether degraded unmanaged + 4 links listed. + +Running `networkctl` with the status command displays information that looks like this; you can see that there are active network links with IP addresses for not only the Ethernet connection but also a Docker container. + + root@photon-rc [ ~ ]# networkctl status + * State: routable + Address: 192.168.137.131 on eth0 + 172.17.0.1 on docker0 + fe80::20c:29ff:fe55:3ca6 on eth0 + fe80::42:f0ff:fef7:bd81 on docker0 + fe80::4c84:caff:fe76:a23f on vethb0aa7a6 + Gateway: 192.168.137.2 on eth0 + DNS: 192.168.137.2 + +You can then add a network link, such as the Ethernet connection, as the argument of the status command to show specific information about the link: + + root@photon-rc [ ~ ]# networkctl status eth0 + * 2: eth0 + Link File: /usr/lib/systemd/network/99-default.link + Network File: /etc/systemd/network/10-dhcp-en.network + Type: ether + State: routable (configured) + Path: pci-0000:02:01.0 + Driver: e1000 + HW Address: 00:0c:29:55:3c:a6 (VMware, Inc.) + MTU: 1500 + Address: 192.168.137.131 + fe80::20c:29ff:fe55:3ca6 + Gateway: 192.168.137.2 + DNS: 192.168.137.2 + CLIENTID: ffb6220feb00020000ab116724f520a0a77337 + +And you can do the same thing with the Docker container: + + networkctl status docker0 + * 3: docker0 + Link File: /usr/lib/systemd/network/99-default.link + Network File: n/a + Type: ether + State: routable (unmanaged) + Driver: bridge + HW Address: 02:42:f0:f7:bd:81 + MTU: 1500 + Address: 172.17.0.1 + fe80::42:f0ff:fef7:bd81 + +In the example above, it is OK that the state of the Docker container is unmanaged; Docker handles managing the networking for the containers without using systemd-resolved or systemd-networkd. Instead, Docker manages the container's connection by using its bridge drive. + +For more information about `networkctl` commands and options, see https://www.freedesktop.org/software/systemd/man/networkctl.html. + +### Turning on Network Debugging + +You can set `systemd-networkd` to work in debug mode so that you can analyze log files with debugging information to help troubleshoot networking problems. The following procedure turns on network debugging by adding a drop-in file in /etc/systemd to customize the default systemd configuration in /usr/lib/systemd. + +First, run the following command as root to create a directory with this exact name, including the `.d` extension: + + mkdir -p /etc/systemd/system/systemd-networkd.service.d/ + +Second, run the following command as root to establish a systemd drop-in unit with a debugging configuration for the network service: + + cat > /etc/systemd/system/systemd-networkd.service.d/10-loglevel-debug.conf << "EOF" + [Service] + Environment=SYSTEMD_LOG_LEVEL=debug + EOF + +You must reload the systemctl daemon and restart the systemd-networkd service for the changes to take effect: + + systemctl daemon-reload + systemctl restart systemd-networkd + +Verify that your changes took effect: + + systemd-delta --type=extended + +View the log files by running this command: + + journalctl -u systemd-networkd + +When you are finished debugging the network connections, turn debugging off by deleting the drop-in file: + + rm /etc/systemd/system/systemd-networkd.service.d/10-loglevel-debug.conf + +### Mounting a Network File System + +To mount a network file system, Photon OS requires nfs-utils. The nfs-utils package contains the daemon, userspace server, and client tools for the kernel Network File System, or NFS. The tools include mount.nfs, umount.nfs, and showmount. + +The nfs-utils package is installed by default in the full version of Photon OS but not in the minimal version. To install nfs-utils in the minimal version, run the following command as root: + + tdnf install nfs-utils + +For instructions on how to use nfs-utils to share files over a network, see [Photon OS nfs-utils](https://github.com/vmware/photon/blob/master/docs/nfs-utils.md). + +### Installing the Packages for tcpdump and netcat with tdnf + +The minimal version of Photon OS leaves out several useful networking tools to keep the operating system lean. Tcpdump, for example, is absent in the minimal version but available in the repository. The minimal version does, however, include the iproute2 tools by default. + +Tcpdump captures and analyzes packets on a network interface. On Photon OS, you install tcpdump and its accompanying package libpcap, a C/C++ library for capturing network traffic, by using tdnf, Photon's command-line package manager: + + tdnf install tcpdump + +Netcat, a tool for sending data over network connections with TCP or UDP, appears in neither the minimal nor the full version of Photon OS. But since netcat furnishes powerful options for analyzing, troubleshooting, and debugging network connections, you might want to install it. To do so, run the following command: + + tdnf install netcat + +## Cloud-Init on Photon OS + +The minimal and full versions of Photon OS include the cloud-init service as a built-in component. Cloud-init is a set of Python scripts that initialize cloud instances of Linux machines. The cloud-init scripts configure SSH keys and run commands to customize the machine without user interaction. The commands can set the root password, create a hostname, configure networking, write files to disk, upgrade packages, run custom scripts, and restart the system. + +There are several ways in which you can deploy Photon OS with cloud-init, including the following: + +* As a stand-alone Photon machine +* In Amazon Elastic Compute Cloud, called EC2 +* In the Google cloud through the Google Compute Engine, or GCE +* In a VMware Vsphere private cloud + +When a cloud instance of Photon OS starts, cloud-init requires a data source. The data source can be an EC2 file for Amazon's cloud platform, a seed.iso for a stand-alone instance of Photon OS, or the internal capabilities of a system for managing virtual machines, such as VMware vSphere or vCenter. Cloud-init also includes data sources for OpenStack, Apache CloudStack, and OVF. The data source comprises two parts: + +1. Metadata +2. User data + +The metadata gives the cloud service provider instructions on how to implement the Photon OS machine in the cloud infrastructure. Metadata typically includes the instance ID and the local host name. + +The user data contains the commands and scripts that Photon OS executes when it starts in the cloud. The user data commonly takes the form of a shell script or a YAML file containing a cloud configuration. The [cloud-init documentation](https://launchpad.net/cloud-init and https://cloudinit.readthedocs.org/en/latest/) contains information about the types of data sources and the formats for metadata and user data. + +On Photon OS, cloud-init is enabled and running by default. You can check its status like this: + + systemctl status cloud-init + +The Photon OS directory that contains the local data and other resources for cloud-init is here: + + /var/lib/cloud + +Photon OS stores the logs for cloud-init in the following file: + + /var/log/cloud-init.log + +The following sections demonstrate how to use cloud-init to customize a stand-alone Photon OS machine, instantiate a Photon OS machine in the Amazon EC2 cloud, and deploy a virtual machine running Photon OS in vSphere. Each section uses a different combination of the available options for the metadata and the user data that make up the data source. Specifications, additional options, and examples appear in the cloud-init documentation. + +### Creating a Stand-Alone Photon Machine with cloud-init + +Cloud-init can customize a Photon OS virtual machine by using the `nocloud` data source. The nocloud data source bundles the cloud-init metadata and user data into a ISO that acts as a seed when you boot the machine. This seed.iso delivers the metadata and the user data without requiring a network connection. + +Here's how customize a Photon OS VM with a nocloud data source: + +First, create the metadata file with the following lines in the [YAML](http://www.yaml.org/start.html) format and name it `meta-data`: + + instance-id: iid-local01 + local-hostname: cloudimg + +Second, create the user data file with the following lines in YAML and name it user-data: + + #cloud-config + hostname: testhost + packages: + - vim + +Third, generate the ISO that will serve as the seed; the ISO must have the volume ID set to `cidata`. In this example, the ISO is generated on an Ubuntu 14.04 computer containing the files named `meta-data` and `user-data` in the local directory: + + genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data + +The ISO now appears in the current directory: + + steve@ubuntu:~$ ls + meta-data seed.iso user-data + +Optionally, you can check the ISO that you generated on Ubuntu by transferring the ISO to the root directory of your Photon OS machine and then running the following command: + + cloud-init --file seed.iso --debug init + +After running the cloud-init command above, check the cloud-init log file: + + more /var/log/cloud-init.log + +Finally, attach the ISO to the Photon OS virtual machine as a CD-ROM and reboot it so that the changes specified by seed.iso take effect. In this case, cloud-init sets the hostname and adds the vim package. + +### Customizing a Photon OS Machine on EC2 + +This section shows you how to upload an `ami` image of Photon OS to Amazon Elastic Compute Cloud, or EC2, and customize the Photon OS machine by using cloud-init with an EC2 data source. The ami version of Photon OS is available as a free download on Bintray: + + https://bintray.com/vmware/photon/ + +The cloud-init service is commonly used on EC2 to configure the cloud instance of a Linux image. On EC2, for example, cloud-init typically sets the `.ssh/authorized_keys` file to let you log in with a private key. The cloud-config user-data file that appears in the following example contains abridged SSH authorized keys to show you how to set them for an instance of Photon OS in the Amazon cloud. + +Working with EC2 requires Amazon accounts for both AWS and EC2 with valid payment information. If you execute the following examples, you will be charged by Amazon. You will need to replace the placeholders for access keys and other account information in the examples with your account information. + +The following code assumes you have installed and set up the Amazon AWS CLI and the EC2 CLI tools. See [Installing the AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/installing.html) and [Setting Up the Amazon EC2 Command Line Interface Tools on Linux](http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/set-up-ec2-cli-linux.html). + + $ mkdir bundled + $ tar -zxvf ./photon-ami.tar.gz + $ ec2-bundle-image -c ec2-cert.pem -k ec2-pk.pem -u --arch x86_64 --image photon-ami.raw --destination ./bundled/ + $ aws s3 mb s3:// + $ ec2-upload-bundle --manifest ./bundled/photon-ami.manifest.xml --bucket --access-key --secret-key + $ ec2-register /photon-ami.manifest.xml --name photon-ami --architecture x86_64 --virtualization-type hvm + +In the following command, the `--user-data-file` option instructs cloud-init to import the cloud-config data in `user-data.txt`. The next command assumes you have created the keypair aws.pem and the group ami-validation as well as uploaded the user-data.txt file to the right place in the Amazon cloud; see the EC2 documentation. + + $ ec2-run-instances $AMI_ID -t m3.medium -k aws -g ami-validation --user-data-file user-data.txt + $ ec2-describe-instances + $ aws ec2 describe-instances --instance-ids "+instance_id+" --query \"Reservations[*].Instances[*].PublicIpAddress\" --output=text + $ ec2-describe-images + +**Important**: When you are done, run the following commands to terminate the machine. Because Amazon charges you while the host is running, make sure to shut it down, replacing the example instance ID in the second command with the ID of your instance: + + $ ec2-deregister ami-18956278 + $ ec2-terminate-instances i-0920384095842eccf + +Here is the contents of the user-data.txt file that cloud-init applies to the machine the first time that it boots up in the cloud: + + /#cloud-config + hostname: photon-on-01 + groups: + - cloud-admins + - cloud-users + users: + - default + - name: photonadmin + gecos: photon test admin user + primary-group: cloud-admins + groups: cloud-users + lock-passwd: false + passwd: vmware + - name: photonuser + gecos: photon test user + primary-group: cloud-users + groups: users + passwd: vmware + packages: + - vim + ssh_authorized_keys: + - ssh-rsa MIIEogIBAAKCAQEAuvHKAjBhpwuomcUTpIzJWRJAe71JyBgAWrwqyN1Mk5N+c9X5 + Ru2fazFA7WxQSD1KyTEvcuf8JzdBfrEJ0v3/nT2x63pvJ8fCl6HRkZtHo8zRu8vY + KYTZS/sdvM/ruubHfq1ldRpgtYSqbkykoe6PCQIDAQABAoIBAEgveQtjVzHDhLTr + rmwJmO316ERfkQ/chLaElhi9qwYJG/jqlNIISWFyztqD1b3fxU6m5MOBIujh7Xpg + ... ec3test@example.com + +Now check the cloud-init output log file on EC2 at `/var/log/cloud-init-output.log`. + +For more information on using cloud-init user data on EC2, see [Running Commands on Your Linux Instance at Launch](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html). + +With Photon OS, you can also build cloud images on Google Compute Engine and other cloud providers; for more information, see [Compatible Cloud Images](https://github.com/vmware/photon/blob/master/docs/cloud-images.md). + +### Running a Photon OS Machine on GCE + +Photon OS comes in a preconfigured image ready for Google Cloud Engine. This section demonstrates how to create a Photon OS instance on Google Cloud Engine with and without cloud-init user data. + +This section assumes that you have set up a GCE account and, if you try the examples, are ready to pay Google for its cloud services. The GCE-ready version of Photon OS, however, comes for free. It is, in the parlance of Google cloud services, a private image. You can freely download it without registration from Bintray: + + https://bintray.com/vmware/photon/gce/view + +The GCE-ready image of Photon OS contains packages and scripts that prepare it for the Google cloud to save you time as you implement a compute cluster or develop cloud applications. The GCE-ready version of Photon OS adds the following packages to the [packages installed with the minimal version](https://github.com/vmware/photon/blob/master/common/data/packages_minimal.json): + + sudo, tar, which, google-daemon, google-startup-scripts, + kubernetes, perl-DBD-SQLite, perl-DBIx-Simple, perl, ntp + +In addition to a GCE account, the following examples require the gcloud command-line tool; see [https://cloud.google.com/compute/docs/gcloud-compute](https://cloud.google.com/compute/docs/gcloud-compute). + +Here are the commands to create an instance of Photon OS from the Photon GCE image without using cloud-init. In the following commands, you must replace `` with the name of your bucket. You also need to replace the path to the Photon GCE tar file. + + $ gcloud compute instances list + $ gcloud compute images list + $ gcloud config list + $ gsutil mb gs:// + $ gsutil cp gs:///photon-gce.tar.gz + $ gcloud compute images create photon-gce-image --source-uri gs:///photon-gce.tar.gz + $ gcloud compute instances create photon-gce-vm --machine-type "n1-standard-1" --image photon-gce-image + $ gcloud compute instances describe photon-gce-vm + + +Now, to create a new instance of a Photon OS machine and configure it with a cloud-init user data file, replace the `gcloud compute instances create` command in the example above with the following command. Before running this command, you must upload your user-data file to Google's cloud infrastructure and replace `` with its path and file name. + + gcloud compute instances create photon-gce-vm --machine-type "n1-standard-1" --image photon-gce-vm --metadata-from-file=user-data= + +You can also add a cloud-init user-data file to an existing instance of a Photon OS machine on GCE: + + gcloud compute instances add-metadata photon-gce-vm --metadata-from-file=user-data= + +## Docker Containers + +Photon OS includes the open source version of Docker. With Docker, Photon OS becomes a Linux run-time host for containers---that is, a Linux cloud container. A container is a process that runs on the Photon OS host with its own isolated application, file system, and networking. + +On Photon OS, the Docker daemon is enabled by default. To view the status of the daemon, run this command: + + systemctl status docker + +Docker is loaded and running by default on the full version of Photon OS. On the minimal version, it is loaded but not running by default, so you have to start it: + + systemctl start docker + +To obtain information about Docker, run this command as root: + + docker info + +After you make sure that docker is enabled and started, you can, for example, run the following docker command as root to create a container running Ubuntu 14.04 with an interactive terminal shell: + + docker run -i -t ubuntu:14.04 /bin/bash + +Photon OS also enables you to run a docker container that, in turn, runs Photon OS: + + docker run -i -t photon /bin/bash + +## Kubernetes + +The full version of Photon OS includes Kubernetes so you can manage clusters of containers. For more information, see [Running Kubernetes on Photon OS](https://github.com/vmware/photon/blob/master/docs/kubernetes.md). + +## RPM-OSTree + +RPM-OSTree is a package-aware file tree replication system that can keep Linux machines synchronized with the latest bits in a predictable and reliable way. To maintain consistency across file systems, RPM-OSTree uses a git-like repository that records the changes to any file and replicates them to any subscriber. + +RPM-OSTree lets you compose packages and other configuration options into a file tree on a server. The hosts download the file tree from the server and incrementally upgrade when the file tree changes. In this way, RPM-OSTree delivers identical, predicatable installed systems to solve the problems that commonly plague system administrators as they struggle to maintain a farm of computers with different packages, files, and configurations installed in different order. + +When you install Photon OS from its ISO, it offers two installation options to take advantage of OSTree, a server and a host. The OSTree Host installation option creates a Photon OS instance that obtains its packages from an RPM-OSTree server. The host instance's packages and library are then centrally managed by the server. + +The OSTree Server installation option creates an instance of a server that manages the file system tree of the OSTree hosts. Creating a Photon OSTree Server establishes a new repository and management node for the Photon OS OSTree hosts. The Photon OS OSTree Server then manages the hosts as versioned, atomic entities to simply lifecycle management and security on an enterprise scale. + +For more information, see the extensive sections on RPM-OSTree in the [Photon OS wiki](https://github.com/vmware/photon/wiki). + +## Disabling TLS 1.0 to Improve Transport Layer Security + +Photon OS includes GnuTLS to help secure the transport layer. [GnuTLS](http://www.gnutls.org/) is a library that implements the SSL and TLS protocols to secure communications. + +On Photon OS, SSL 3.0, which contains a known vulnerability, is disabled by default. + +However, TLS 1.0, which also contains known vulnerabilities, is enabled by default. + +To turn off TLS 1.0, make a directory named `/etc/gnutls` and then in `/etc/gnutls` create a file named `default-priorities`. In the `default-priorities` file, specify GnuTLS priority strings that remove TLS 1.0 and SSL 3.0 but retain TLS 1.1 and TLS 1.2. + +After adding a new `default-priorities` file or after modifying it, you must restart all applications, including SSH, with an open TLS session for the changes to take effect. + +Here is an example of a `default-priorities` file that contains GnuTLS priorities to disable TLS 1.0 and SSL 3.0: + + cat /etc/gnutls/default-priorities + SYSTEM=NONE:!VERS-SSL3.0:!VERS-TLS1.0:+VERS-TLS1.1:+VERS-TLS1.2:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL + +This example priority string imposes system-specific policies. The NONE keyword means that no algorithms, protocols, or compression methods are enabled, so that you can enable specific versions individually later in the string. The example priority string then specifies that SSL version 3.0 and TLS version 1.0 be removed, as marked by the exclamation point. The priority string then enables, as marked by the plus sign, versions 1.1 and 1.2 of TLS. The cypher is AES-128-CBC. The key exchange is RSA. The MAC is SHA1. And the compression algorithm is COMP-NULL. + +On Photon OS, you can verify the system-specific policies in the `default-priorities` file as follows. + +Concatenate the `default-priorities` file to check its contents: + + root@photon-rc [ ~ ]# cat /etc/gnutls/default-priorities + SYSTEM=NONE:!VERS-SSL3.0:!VERS-TLS1.0:+VERS-TLS1.1:+VERS-TLS1.2:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL + +Run the following command to check the protocols that are enabled for the system: + + root@photon-rc [ /etc/gnutls ]# gnutls-cli --priority @SYSTEM -l + Cipher suites for @SYSTEM + TLS_RSA_AES_128_CBC_SHA1 0x00, 0x2f SSL3.0 + + Certificate types: none + Protocols: VERS-TLS1.1, VERS-TLS1.2 + Compression: COMP-NULL + Elliptic curves: none + PK-signatures: none + +For information about the GnuTLS priority strings, see [https://gnutls.org/manual/html_node/Priority-Strings.html](https://gnutls.org/manual/html_node/Priority-Strings.html). + +For information about the vulnerability in SSL 3.0, see [SSL 3.0 Protocol Vulnerability and POODLE Attack](https://www.us-cert.gov/ncas/alerts/TA14-290A). + +For information about the vulnerabilities in TLS 1.0, see [Guidelines for the Selection, Configuration, and Use of Transport Layer Security (TLS) Implementations](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-52r1.pdf). + +## Building a Package from a Source RPM + +This section describes how to install and build a package on the full version of Photon OS from the package's source RPM. You obtain the source RPMs that Photon OS uses from Bintray: + +[https://bintray.com/vmware/photon](https://bintray.com/vmware/photon) + +To build a package from its source RPM, or SRPM, Photon OS requires the following packages: + +* rpmbuild. This package is installed by default on the full version of Photon OS, so you should not have to install it. +* gcc. This package is also installed by default on the full version of Photon OS, so you should not have to install it. +* make, Cmake, automake, or another make package, depending on the package you are trying to install and build from its source RPM. Cmake is installed by default on Photon OS. You can install other make packages if need be by using tdnf or yum. + +Another requirement is a local unprivileged user account other than the root account. You should build RPMs as an unprivileged user. Do not build a package as root---building an RPM with the root account might damage your system. + +If you are building a package on a virtual machine running Photon OS in VMware vSphere, VMware Workstation, or VMware Fusion, take a snapshot of your virtual machine before building the package. + +VMware recommends that you install and build packages from their source RPMs on the full version of Photon OS. Do not use the minimal version to work with source RPMs. + +Here's how to install and build an example package--sed, in this case--from its source RPM on Photon OS with an unprivileged account. + +First, check whether rpmbuild is installed by running the following command: + + rpmbuild --version + +If it is not installed, install it by running the following command as root: + + tdnf install rpm-build + +Second, create the directories for building RPMs under your local user account's home directory (not under root): + + mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} + +Next, create a .rpmmacros file under your home directory and override the default location of the RPM building tree with the new one. This command overwrites an existing .rpmmacros file. Before running the following command, make sure you do not already have a .rpmmacros file; if a .rpmmacros file exists, back it up under a new name in case you want to restore it later. + + echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros + +Now place the source RPM file that you want to install and build in the /tmp directory. + +To install the source file, run the following command with your unprivileged user account, replacing the sed example source RPM with the name of the one that you want to install: + + rpm -i /tmp/sed-4.2.2-2.ph1.src.rpm + +The above command unpacks the source RPM and places its .spec file in your ~/rpmbuild/SPECS directory. In the next step, the rpmbuild tool uses the .spec file to build the RPM. + +To build the RPM, run the following commands with your unprivileged user account. Again, replace the sed.spec example file with the name of the .spec file that you want to build. + + cd ~/rpmbuild/SPECS + rpmbuild -ba sed.spec + +If successful, the rpmbuild -ba command builds the RPM and generates an RPM package file in your ~/rpmbuild/RPMS/x86_64 directory. Example: + + ls RPMS/x86_64/ + sed-4.2.2-2.x86_64.rpm sed-debuginfo-4.2.2-2.x86_64.rpm sed-lang-4.2.2-2.x86_64.rpm + +The rpmbuild command also generates a new SRPM file and saves it in your ~/rpmbuild/SRPMS directory. Example: + + ls SRPMS/ + sed-4.2.2-2.src.rpm + +If the rpmbuild command is unsuccessful with an error that it cannot find a library, you must install the RPMs for the library that your source RPM depends on before you can successfully build your source RPM. Iterate through installing the libraries that your source RPM relies on until you can successfully build it. + +To install the RPM, run the following command with your unprivileged user account: + + rpm -i RPMS/x86_64/sed-4.2.2-2.x86_64.rpm + +## References + +The following technical articles and guides appear in the [Photon OS wiki](https://github.com/vmware/photon/wiki): + +* FAQ +* Running Photon OS on vSphere +* Running Photon OS on Fusion +* Running Photon OS on vCloud Air +* Install and Configure a Swarm Cluster with DNS Service on Photon OS +* Install and Configure a Production Ready Mesos Cluster on Photon OS +* Install and Configure Marathon for Mesos Cluster on Photon OS +* Install and Configure DCOS CLI for Mesos +* Install and Configure Mesos DNS on a Mesos Cluster +* RPM OSTree Documentation + + +