Okej, dagens projekt blir att sätta upp en steamcache vm. <br />Till att börja med behöver vi ett dataset att lagra vår cache på.<br />[code]<br />greven@mainframe01:~$ pfexec zfs create -o mountpoint=/export/steamcache zdata/steamcache<br />[/code] <br />Det var enkelt! men att bara ha diskyta tar oss ingen vart.. Härnäst behöver vi sätta upp en VM som kör servern.<br />Så jag kommer introducera er till den magi som kallas lx zones, men innan dess behöver vår vm ett NIC.<br />Lyckligtvis är det barnsligt enkelt att sätta upp det på solarisliknande system<br />[code]<br />greven@mainframe01:~$ pfexec dladm create-vnic sc0 -l ixgbe3<br />[/code]<br />Sådär, då har vi skapat ett virtuellt nätverkskort som heter sc0 som är baserat på ixgbe3 (det fjärde 10GB nic:et på min server).<br />Men nu är det dags att skapa zonen. Vi börjar med att ställa in dess properties med zonecfg.<br />[code]<br />greven@mainframe01:~$ pfexec zonecfg -z steamcache<br />steamcache: No such zone configured<br />Use &#039;create&#039; to begin configuring a new zone.<br />zonecfg:steamcache&gt; create -b<br />zonecfg:steamcache&gt; set zonepath=/zones/steamcache<br />zonecfg:steamcache&gt; set brand=lx<br />zonecfg:steamcache&gt; set limitpriv=default<br />zonecfg:steamcache&gt; set ip-type=exclusive<br />zonecfg:steamcache&gt; add fs<br />zonecfg:steamcache:fs&gt; set dir=/srv/steamcache<br />zonecfg:steamcache:fs&gt; set special=/export/steamcache<br />zonecfg:steamcache:fs&gt; set type=lofs<br />zonecfg:steamcache:fs&gt; end<br />zonecfg:steamcache&gt; add net<br />zonecfg:steamcache:net&gt; set physical=sc0<br />zonecfg:steamcache:net&gt; add property (name=ips,value=&quot;192.168.0.16/24&quot;)<br />zonecfg:steamcache:net&gt; add property (name=primary,value=&quot;true&quot;)<br />zonecfg:steamcache:net&gt; add property (name=gateway,value=&quot;192.168.0.1&quot;)<br />zonecfg:steamcache:net&gt; end<br />zonecfg:steamcache&gt; add attr<br />zonecfg:steamcache:attr&gt; set name=dns-domain<br />zonecfg:steamcache:attr&gt; set type=string<br />zonecfg:steamcache:attr&gt; set value=grevennet.org<br />zonecfg:steamcache:attr&gt; end<br />zonecfg:steamcache&gt; add attr<br />zonecfg:steamcache:attr&gt; set name=resolvers<br />zonecfg:steamcache:attr&gt; set type=string<br />zonecfg:steamcache:attr&gt; set value=192.168.0.1<br />zonecfg:steamcache:attr&gt; end<br />zonecfg:steamcache&gt; add attr<br />zonecfg:steamcache:attr&gt; set name=kernel-version<br />zonecfg:steamcache:attr&gt; set type=string<br />zonecfg:steamcache:attr&gt; set value=4.3.0<br />zonecfg:steamcache:attr&gt; end<br />zonecfg:steamcache&gt; exit<br />[/code]<br />Oj, det hände en hel massa där! Men jag ska försöka förklara lite vad som pågår.<br /><br />vi börjar med<br />[code]<br />set zonepath=/zones/steamcache<br />set brand=lx<br />set autoboot=true<br />set limitpriv=default<br />set ip-type=exclusive<br />[/code]<br />Ganska simpelt, vi vill skapa en zon, och -b betyder att det kommer vara en branded zone. Vad det innebär är lite på den tekniska sidan, men vi kan bara säga att 90% av allt man vill göra med zones kommer ske i en branded zone. Därefter säger vi vart zonen kommer på på vårat filsystem, i mitt fall under /zones/steamcache. Men, säger ni, du har ju inte visat oss att du har satt upp någonting där! Har du inte glömt något nu? Åh nej kära läsare, här glöms inget bort. Vi kommer till det senare! Efter det så säger vi att zonen är av typen (branden) lx, dvs att den kommer emulera en linuxkernel.<br />Därefter sätter vi att zonen skall boota automatiskt när servern startas, inget speciellt där. Vi sätter default limitprivs, det vill säga att zonen inte kan påverka andra zoner. Och att den har exklusiv ip typ, alltså att den inte kan dela ip med någon annan maskin.<br />Därefter kommer <br /><br />[code]<br />add fs<br />set dir=/srv/steamcache<br />set special=/export/steamcache<br />set type=lofs<br />end<br />[/code]<br /><br />Här så lägger vi till ett filsystem i vår nya vm, vi sätter vart det skall monteras in, och vartifrån. Sedan sätter vi vilken sorts filsystem det är.<br />Easy stuff.<br /><br />[code]<br />add net<br />set physical=sc0<br />add property (name=ips,value=&quot;192.168.0.16/24&quot;)<br />add property (name=primary,value=&quot;true&quot;)<br />add property (name=gateway,value=&quot;192.168.0.1&quot;)<br />end<br />add attr<br />set name=dns-domain<br />set type=string<br />set value=grevennet.org<br />end<br />add attr<br />set name=resolvers<br />set type=string<br />set value=192.168.0.1<br />end<br />[/code]<br /><br />Här så lägger vi till nätverket, vi bestämmer ett nic och sätter ip.. Ganska självförklarande saker. <br />Därefter så lägger vi till lite hushållnings inställningar, som domännamn och resolver servern kommer använda. Inget speciellt där.<br />och slutligen<br />[code]<br />add attr<br />set name=kernel-version<br />set type=string<br />set value=4.3.0<br />end<br />[/code]<br />Det vi gör här är rätt och slätt bestämmer hur vi kommer ljuga för vår zon. Vi väljer en sträng som vår kernel (illumos) kommer svara med som versionsnummer när vår zon frågar vilken linuxversion den kör. Såklart så kör den inte linux egentligen, utan vi bara översätter dess abi:er och api:er till illumos calls. <br />Hänger alla med än så länge? <br />Men vänta lite nu... vi ställer in massa inställningar, men.. vi har ju inte installerat något? Det får vi råda bot på. <br />Härnäst så använder vi zoneadm för att skapa vår nya zon. <br />[code]<br />greven@mainframe01:~$ pfexec zoneadm -z steamcache clone ubuntu_base<br />Cloning snapshot zdata/zones/ubuntu_base@SUNWzone3<br />Instead of copying, a ZFS clone has been created for this zone.<br />[/code]<br /><br />Vad är detta för häxkonst? <br />Nu fuskar jag lite här, för jag har redan satt upp en bas zon sen innan som jag baserar mina zoner på. En uppdaterad version av ubuntu_server med några baspaket och lite inställningar jag tycker om att ha på en server. Och nu har vi en fullt fungerande ubuntu server. <br />Såklart, vi behöver boota upp den. <br />[code]<br />greven@mainframe01:~$ pfexec zoneadm -z steamcache boot<br />[/code]<br />Sådär, nu kör den<br />låt oss logga in och se att den fungerar som den ska.<br />[code]<br />greven@mainframe01:~$ pfexec zlogin steamcache<br />[Connected to zone &#039;steamcache&#039; pts/2]<br />Last login: Tue Mar&nbsp; 5 21:30:30 UTC 2019 from zone:global on pts/2<br />Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.3.0 x86_64)<br /><br /> * Documentation:&nbsp; https://help.ubuntu.com<br /> * Management:&nbsp; &nbsp;  https://landscape.canonical.com<br /> * Support:&nbsp; &nbsp; &nbsp; &nbsp; https://ubuntu.com/advantage<br />root@ubuntu:~# <br />[/code]<br />woop woop! allt ser bra ut!<br />Men.. vi kan ju inte låta servern heta ubuntu... <br />[code]<br />root@ubuntu:~# sed -i &#039;s/ubuntu/steamcache/g&#039; /etc/hostname <br />[/code]<br />sådärja, nu har vi bytt namnet ubuntu till steamcache. Bara att boota om och se ändringen.<br />[code]<br />root@ubuntu:~# reboot<br />[Connection to zone &#039;steamcache&#039; pts/2 closed]<br />greven@mainframe01:~$ pfexec zlogin steamcache<br />[Connected to zone &#039;steamcache&#039; pts/2]<br />Last login: Mon Mar 11 18:57:33 UTC 2019 from zone:global on pts/2<br />Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.3.0 x86_64)<br /><br /> * Documentation:&nbsp; https://help.ubuntu.com<br /> * Management:&nbsp; &nbsp;  https://landscape.canonical.com<br /> * Support:&nbsp; &nbsp; &nbsp; &nbsp; https://ubuntu.com/advantage<br />root@steamcache:~# <br />[/code]<br /> Bootade om på typ 6 sekunder.. inte illa!<br />nåväl.. i vår nya zon så redigerar vi /etc/nginx/nginx.conf till att innehålla följande<br /><br />[code]<br />user www-data;<br />worker_processes auto;<br />pid /run/nginx.pid;<br /><br />events {<br />&nbsp; &nbsp; worker_connections 4096;<br />&nbsp; &nbsp; multi_accept on;<br />&nbsp; &nbsp; use epoll;<br />}<br /><br />http {<br />&nbsp; &nbsp; sendfile on;<br />&nbsp; &nbsp; tcp_nopush on;<br />&nbsp; &nbsp; tcp_nodelay on;<br />&nbsp; &nbsp; keepalive_timeout 65;<br />&nbsp; &nbsp; types_hash_max_size 2048;<br /><br />&nbsp; &nbsp; include /etc/nginx/mime.types;<br />&nbsp; &nbsp; default_type application/octet-stream;<br /><br />&nbsp; &nbsp; access_log /var/log/nginx/access.log;<br />&nbsp; &nbsp; error_log /var/log/nginx/error.log;<br /><br />&nbsp; &nbsp; gzip on;<br /><br /># Steam cache log format changes<br />log_format steamcache-default &#039;$remote_addr - $remote_user [$time_local] &quot;$request&quot; $status $body_bytes_sent &quot;$http_referer&quot; &quot;$http_user_agent&quot; DEFAULT&#039;;<br />log_format steamcache-other &#039;$remote_addr - $remote_user [$time_local] &quot;$request&quot; $status $body_bytes_sent &quot;$http_referer&quot; &quot;$http_user_agent&quot; OTHER&#039;;<br />log_format steamcache-local &#039;$remote_addr - $remote_user [$time_local] &quot;$request&quot; $status $body_bytes_sent &quot;$http_referer&quot; &quot;$http_user_agent&quot; LOCAL&#039;;<br />log_format steamcache-remote &#039;$remote_addr - $remote_user [$time_local] &quot;$request&quot; $status $body_bytes_sent &quot;$http_referer&quot; &quot;$http_user_agent&quot; REMOTE&#039;;<br /><br />&nbsp; &nbsp; include /etc/nginx/sites-enabled/*;<br />}<br />[/code]<br />Jag har redan Nginx installerat på min basimage, men om ni gör det här själva lär ni behöva installera Nginx. en enkel apt-get är allt som behövs på ubuntu. Men vi är långt ifrån klara med nginx.. härnäst behöver vi redigera /etc/nginx/sites-available/default till<br /><br />[code]<br />server {<br />&nbsp; listen *:80 default;<br /><br />&nbsp; location / {<br />&nbsp; &nbsp;  root /var/www/;<br />&nbsp; &nbsp;  add_header Host $host;<br />&nbsp; }<br />}<br />[/code]<br />sedan skapar vi filen /etc/nginx/sites-available/steamcache och ger den innehållet<br />[code]<br />server {<br />&nbsp; &nbsp; &nbsp; listen 80;<br />&nbsp; server_name *.cs.steampowered.com content1.steampowered.com content2.steampowered.com content3.steampowered.com content4.steampowered.com content5.steampowered.com content6.steampowered.com content7.steampowered.com content8.steampowered.com *.steamcontent.com *.steampipe.steamcontent.com;<br />&nbsp; &nbsp; &nbsp; root /srv/steamcache/data;<br />&nbsp; index index.html index.htm;<br />&nbsp; access_log /srv/steamcache/logs/access.log steamcache-default;<br />&nbsp; error_log /srv/steamcache/logs/error.log;<br />&nbsp; proxy_temp_path /tmp/nginx/ 1 2;<br /><br />&nbsp; resolver 8.8.8.8;<br /><br />&nbsp; location /depot/ {<br />&nbsp; &nbsp;  try_files $uri @mirror;<br />&nbsp; &nbsp;  access_log /srv/steamcache/logs/access.log steamcache-local;<br />&nbsp; }<br /><br />&nbsp; location / {<br />&nbsp; &nbsp;  proxy_next_upstream error timeout http_404;<br />&nbsp; &nbsp;  proxy_pass http://$host$request_uri;<br />&nbsp; &nbsp;  proxy_redirect off;<br />&nbsp; &nbsp;  proxy_set_header Host $host;<br />&nbsp; &nbsp;  proxy_set_header X-Real-IP $remote_addr;<br />&nbsp; &nbsp;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />&nbsp; &nbsp;  add_header X-Mirror-Upstream-Status $upstream_status;<br />&nbsp; &nbsp;  add_header X-Mirror-Upstream-Response-Time $upstream_response_time;<br />&nbsp; &nbsp;  add_header X-Mirror-Status $upstream_cache_status;<br />&nbsp; &nbsp;  add_header Host $host;<br />&nbsp; &nbsp;  access_log /srv/steamcache/logs/access.log steamcache-other;<br />&nbsp; }<br /><br />&nbsp; location @mirror {<br />&nbsp; &nbsp;  proxy_store on;<br />&nbsp; &nbsp;  proxy_store_access user:rw group:rw all:r;<br />&nbsp; &nbsp;  proxy_next_upstream error timeout http_404;<br />&nbsp; &nbsp;  proxy_pass http://$host$request_uri;<br />&nbsp; &nbsp;  proxy_redirect off;<br />&nbsp; &nbsp;  proxy_set_header Host $host;<br />&nbsp; &nbsp;  proxy_set_header X-Real-IP $remote_addr;<br />&nbsp; &nbsp;  proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;<br />&nbsp; &nbsp;  add_header X-Mirror-Upstream-Status $upstream_status;<br />&nbsp; &nbsp;  add_header X-Mirror-Upstream-Response-Time&nbsp; $upstream_response_time;<br />&nbsp; &nbsp;  add_header X-Mirror-Status $upstream_cache_status;<br />&nbsp; &nbsp;  access_log /srv/steamcache/logs/access.log steamcache-remote;<br />&nbsp; }<br />}<br />[/code]<br />och sen skapar vi en symbolisk länk från den filen till /etc/nginx/sites-enabled<br />[code]<br />root@steamcache:~# ln -s /etc/nginx/sites-available/steamcache /etc/nginx/sites-enabled/steamcache<br />[/code]<br />sen sätter vi upp de direktorns vi kommer behöva<br />[code]<br />root@steamcache:~# mkdir /srv/steamcache/logs /srv/steamcache/info<br />root@steamcache:~# chmod -R 777 /srv/steamcache<br />root@steamcache:~# chown -R www-data:www-data /srv/steamcache<br />[/code]<br /> och till sist så startar vi upp nginx<br />[code]root@steamcache:~# systemctl enable nginx<br />root@steamcache:~# systemet start nginx[/code]<br /> <br />Nu borde jobbet på cacheservern vara klart. Så med ett enkelt exit loggar vi ut från den.<br />Bara för kul så kan vi se hur mycket plats vår nya zon tar, så vi kör en zfs list på vår zonepath<br />[code]greven@mainframe01:~$ zfs list zdata/zones/steamcache<br />NAME&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; USED&nbsp; AVAIL&nbsp;  REFER&nbsp; MOUNTPOINT<br />zdata/zones/steamcache&nbsp; 1,04M&nbsp; 11,7T&nbsp;  422M&nbsp;  /zones/steamcache<br />[/code]<br />Inte illa! vår zon har refererat 422 megabyte, men faktisk plats den tar på filsystemet är bara 1meg, det är för att vi kunde basera den på vår basimage, så det enda som tar plats är de filer som skiljer sig från vad basimagen innehöll.<br />Men, härnäst så är det dags att hacka lite med dns-servern så vi forwardar våra steam-requests till vår nya cache server.<br />Så vi loggar kvickt in på min router<br />[code]<br />greven@mainframe01:~$ ssh root@router01.grevennet.org<br /><br />BusyBox v1.19.4 (2017-04-28 11:46:54 UTC) built-in shell (ash)<br />Enter &#039;help&#039; for a list of built-in commands.<br /><br />&nbsp; _______&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; __&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  __&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; __&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br /> |_&nbsp; &nbsp;  _|.-----.----.|&nbsp; |--.-----.|__|.----.-----.|&nbsp; |.-----.----.<br />&nbsp;  |&nbsp;  |&nbsp; |&nbsp; -__|&nbsp; __||&nbsp; &nbsp;  |&nbsp; &nbsp;  ||&nbsp; ||&nbsp; __|&nbsp; _&nbsp; ||&nbsp; ||&nbsp; _&nbsp; |&nbsp;  _|<br />&nbsp;  |___|&nbsp; |_____|____||__|__|__|__||__||____|_____||__||_____|__|&nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  N E X T&nbsp;  G E N E R A T I O N&nbsp;  G A T E W A Y<br /> --------------------------------------------------------------------<br /> NG GATEWAY SIGNATURE DRINK<br /> --------------------------------------------------------------------<br />&nbsp; * 1 oz Vodka&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Pour all ingredients into mixing<br />&nbsp; * 1 oz Triple Sec&nbsp; &nbsp;  tin with ice, strain into glass.<br />&nbsp; * 1 oz Orange juice<br /> --------------------------------------------------------------------<br /><br />Product: vbnt-h_telia_r16-2<br />Release: Jade (16.2)<br />Version: 16.2.7732-2221002-20170502175933-dc9dfe4b113edc29fd43209a51f43c09c374d83a<br /><br /><br />Hash config:&nbsp; &nbsp; &nbsp; &nbsp;  dc9dfe4b113edc29fd43209a51f43c09c374d83a<br />Hash openwrt:&nbsp; &nbsp; &nbsp; &nbsp; d659214855ec19a25cc6583cab1b44c3c5fd6fdf<br />Hash kernel:&nbsp; &nbsp; &nbsp; &nbsp;  9b34f64f1ba4c707c8336179bcbc1c92ecfcc612<br />Hash packages:&nbsp; &nbsp; &nbsp;  c795539c113f5101949cad831db0f13f4ab4b0d5<br />Hash mindspeed:&nbsp; &nbsp; &nbsp; 91b6a7a4d703268d6023c3a58da3d33fc62e7ed8<br />Hash technicolor:&nbsp; &nbsp; 169a139e8f47ff993e30ff15cbbc8df3d8b7ba24<br />Hash lte:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a10557d19242f01ed4c3a80d7c4117c90372a112<br />Hash custo:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5390b85cb3f6915956bfa50a7f5f970339a42da3<br /><br />Bootloader: 16.08.1012-0000000-20160223092730-b1e3a8bf47e1a71b98a3833ba22607458f03b06b<br /><br />root@OpenWrt:~# <br />[/code] <br />och lägger till följande rad i /etc/host<br />[code]192.168.0.16 cs.steampowered.com content1.steampowered.com content2.steampowered.com content3.steampowered.com content4.steampowered.com content5.steampowered.com content6.steampowered.com content7.steamp<br />[/code]<br /><br />Därefter startar vi om dnsmasq<br />[code]root@OpenWrt:~# /etc/init.d/dnsmasq restart[/code]<br /><br />Och nu testar vi och ser om allt fungerar<br />[code]<br />MacBook-Pro-2:~ fadb$ nslookup steamcontent.com<br />Server:		192.168.0.1<br />Address:	192.168.0.1#53<br /><br />Name:	steamcontent.com<br />Address: 192.168.0.16<br />[/code] <br />Success! Nu återstår bara att testa med den faktiska steamclienten!<br />[img]https://i.imgur.com/rRwbBRE.png[/img]<br />Yes! det fungerar!<br /><br />Det var allt för mig för denna gång!