{"id":51,"date":"2016-05-01T11:01:43","date_gmt":"2016-05-01T15:01:43","guid":{"rendered":"http:\/\/www.hackspot.net\/CircleBlog\/?p=51"},"modified":"2016-05-01T11:11:32","modified_gmt":"2016-05-01T15:11:32","slug":"filesystems-and-startup","status":"publish","type":"post","link":"http:\/\/www.hackspot.net\/CircleBlog\/2016\/05\/01\/filesystems-and-startup\/","title":{"rendered":"Filesystems and startup"},"content":{"rendered":"<p>The Circle kernel is based on a standard openwrt build, using the Atheros AP123\/TP-Link TL-MR3420-v2 platform.<\/p>\n<p>The boot flash chip is 8 megabytes (SPI), and contains u-boot, the kernel, the startup root filesystem (read-only), and a read-write jffs2 rootfs overlay partition (which is mounted as an overlay on top of the startup root filesystem &#8211; effectively making &#8220;\/&#8221; read-write.<\/p>\n<p>In addition, there&#8217;s an embedded &#8220;eMMC&#8221; flash chip, which appears on the USB bus as &#8220;\/dev\/sda&#8221;. \u00a0The device claims to be 8 gigabytes, but I&#8217;ve found that it&#8217;s only 1 gigabyte on my particular Circle device (doing a &#8220;dd&#8221; after the 1 gigabyte mark results in the eMMC chip &#8220;resetting&#8221; and unplugging\/replugging on the USB bus.<\/p>\n<p>Here&#8217;s the kernel startup messages showing the SPI flash partitions:<\/p>\n<pre>[ 0.700000] 5 tp-link partitions found on MTD device spi0.0\r\n[ 0.700000] Creating 5 MTD partitions on \"spi0.0\":\r\n[ 0.710000] 0x000000000000-0x000000020000 : \"u-boot\"\r\n[ 0.720000] 0x000000020000-0x00000012e5fc : \"kernel\"\r\n[ 0.720000] mtd: partition \"kernel\" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only\r\n[ 0.740000] 0x00000012e5fc-0x0000007f0000 : \"rootfs\"\r\n[ 0.740000] mtd: partition \"rootfs\" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only\r\n[ 0.760000] mtd: device 2 (rootfs) set to be root filesystem\r\n[ 0.760000] 1 squashfs-split partitions found on MTD device rootfs\r\n[ 0.770000] 0x0000004d0000-0x0000007f0000 : \"rootfs_data\"\r\n[ 0.780000] 0x0000007f0000-0x000000800000 : \"art\"\r\n[ 0.780000] 0x000000020000-0x0000007f0000 : \"firmware\"<\/pre>\n<p>&#8220;rootfs&#8221; is the read-only startup root filesystem (initramfs, squashfs). \u00a0&#8220;rootfs_data&#8221; is the jffs2 read-write overlay. \u00a0&#8220;art&#8221; contains Atheros radio configuration data. \u00a0&#8220;firmware&#8221; is a pseudo-partition that maps to the entire 8-megabyte flash chip.<\/p>\n<p>Here&#8217;s the output of the &#8220;mount&#8221; command after startup:<\/p>\n<pre>rootfs on \/ type rootfs (rw)\r\n\/dev\/root on \/rom type squashfs (ro,relatime)\r\nsys on \/sys type sysfs (rw,relatime)\r\nproc on \/proc type proc (rw,noatime)\r\ntmpfs on \/tmp type tmpfs (rw,nosuid,nodev,noatime)\r\n\/dev\/mtdblock3 on \/overlay type jffs2 (rw,noatime)\r\noverlayfs:\/overlay on \/ type overlayfs (rw,noatime,lowerdir=\/,upperdir=\/overlay)\r\ntmpfs on \/dev type tmpfs (rw,relatime,size=512k,mode=755)\r\ndevpts on \/dev\/pts type devpts (rw,relatime,mode=600)\r\ndebugfs on \/sys\/kernel\/debug type debugfs (rw,noatime)\r\n\/dev\/sda3 on \/mnt type ext4 (rw,noatime,nodiratime)<\/pre>\n<p>As you can see, &#8220;\/dev\/sda3&#8221; (the eMMC flash) is mounted on &#8220;\/mnt&#8221; (ext4). \u00a0Not shown above: &#8220;\/dev\/sda1&#8221; is a swap filesystem, and &#8220;\/dev\/sda2&#8221; is also ext4 &#8211; seems to be used to store a firmware image for a firmware recovery mode (in case of problems in the future).<\/p>\n<h5>Modifying \/etc\/passwd and \/etc\/shadow:<\/h5>\n<p>As I said, the jffs2 &#8220;rootfs_data&#8221; partition is mounted as an overlay onto &#8220;\/&#8221;. \u00a0If you want to modify (for example) the &#8220;\/etc\/passwd&#8221; and &#8220;\/etc\/shadow&#8221; files, you can TFTP-boot an openwrt kernel (configured for the TP-Link TL-MR3420-v2), login, mount the jffs2 partition, then create \u00a0your own &#8220;\/etc\/passwd&#8221; and &#8220;\/etc\/shadow&#8221;.<\/p>\n<p>NOTE: there is another method (using a modified firmware update) to modifying the passwd\/shadow files (doesn&#8217;t require serial port or TFTP-booting a custom kernel). \u00a0I will document that in a separate post later.<\/p>\n<p>Here&#8217;s what I did (I added a &#8220;dummy&#8221; user (with password &#8220;dummy&#8221;) to the system. \u00a0<strong>WARNING<\/strong>: if you screw-up the \/etc\/passwd and shadow files, it could cause the Circle device to fail to boot-up. \u00a0I felt safe doing this because I could always TFTP-boot my openwrt kernel using u-boot (so I could always restore the original passwd\/shadow files.<\/p>\n<p>NOTE: I first created &#8220;passwd.txt&#8221; and &#8220;shadow.txt&#8221; (starting with the &#8220;passwd\/shadow&#8221; I had found in the main initramfs read-only rootfs), confirmed they were OK, then renamed them to &#8220;passwd&#8221; and &#8220;shadow&#8221;:<\/p>\n<pre>root@(none):\/# <strong>cat \/proc\/mtd<\/strong>\r\ndev: size erasesize name\r\nmtd0: 00020000 00010000 \"u-boot\"\r\nmtd1: 0010e5fc 00010000 \"kernel\"\r\nmtd2: 006c1a04 00010000 \"rootfs\"\r\nmtd3: 00320000 00010000 \"rootfs_data\"\r\nmtd4: 00010000 00010000 \"art\"\r\nmtd5: 007d0000 00010000 \"firmware\"\r\nroot@(none):\/# <strong>mount -t jffs2 \/dev\/mtdblock3 \/tmp\/mnt<\/strong>\r\n[ 28.240000] jffs2: notice: (324) jffs2_build_xattr_subsystem: complete building xattr subsystem, 1 of xdatum (1 unchecked, 0 orphan) and 19 of xref (0 dead, 8 orphan) found.\r\nroot@(none):\/# <strong>cd \/tmp\/mnt<\/strong>\r\nroot@(none):\/tmp\/mnt# <strong>ls<\/strong>\r\netc lib usr\r\nroot@(none):\/tmp\/mnt# <strong>cd etc<\/strong>\r\nroot@(none):\/tmp\/mnt\/etc# <strong>ls<\/strong>\r\ncircle config dropbear hosts modules.d uci-defaults\r\n# NOTE: I did this \"cat &gt; passwd.txt\", then pasted my modified data to the file\r\nroot@(none):\/tmp\/mnt\/etc# <strong>cat &gt; passwd.txt<\/strong>\r\nroot:x:0:0:root:\/root:\/bin\/ash\r\n<strong>dummy:x:0:0:root:\/root:\/bin\/ash<\/strong>\r\ndaemon:*:1:1:daemon:\/var:\/bin\/false\r\nftp:*:55:55:ftp:\/home\/ftp:\/bin\/false\r\nnetwork:*:101:101:network:\/var:\/bin\/false\r\nnobody:*:65534:65534:nobody:\/var:\/bin\/false\r\nroot@(none):\/tmp\/mnt\/etc# \r\n# NOTE: I did this \"cat &gt; shadow.txt\", then pasted my modified data to the file\r\nroot@(none):\/tmp\/mnt\/etc# <strong>cat &gt; shadow.txt<\/strong>\r\nroot:$1$WSc\/KLMf$20eCFNT1y3fDTuClxHHuq0:16578:0:99999:7:::\r\n<strong>dummy:$1$Iila3Ueg$4.Vzs4XROsrFuq2L1Zkpb.:16578:0:99999:7:::<\/strong>\r\ndaemon:*:0:0:99999:7:::\r\nftp:*:0:0:99999:7:::\r\nnetwork:*:0:0:99999:7:::\r\nnobody:*:0:0:99999:7:::\r\nroot@(none):\/tmp\/mnt\/etc# \r\nroot@(none):\/tmp\/mnt\/etc# <strong>chmod og-r shadow.txt<\/strong>\r\nroot@(none):\/tmp\/mnt\/etc# <strong>chmod a+rw passwd.txt<\/strong>\r\nroot@(none):\/tmp\/mnt\/etc# <strong>ls -la passwd.txt shadow.txt<\/strong>\r\n-rw-rw-rw- 1 root root 222 Jan 1 00:01 passwd.txt\r\n-rw------- 1 root root 213 Jan 1 00:01 shadow.txt\r\nroot@(none):\/tmp\/mnt\/etc# <strong>mv passwd.txt passwd<\/strong>\r\nroot@(none):\/tmp\/mnt\/etc# <strong>mv shadow.txt shadow<\/strong>\r\nroot@(none):\/tmp\/mnt\/etc# <strong>cd<\/strong>\r\nroot@(none):~# <strong>sync<\/strong>\r\nroot@(none):~# <strong>umount \/tmp\/mnt<\/strong>\r\nroot@(none):~# <strong>reboot<\/strong><\/pre>\n<p>&nbsp;<\/p>\n<h5>Starting Circle firmware:<\/h5>\n<p>As I said, there&#8217;s a read-only root filesystem used for startup, and the eMMC is mounted to &#8220;\/mnt&#8221;. \u00a0The eMMC contains the majority of the Circle firmware &#8211; where all of their applications\/etc reside.<\/p>\n<p>Here&#8217;s the &#8220;\/etc\/rc.local&#8221; (on the read-only root filesystem) showing where they mount the eMMC and start the Circle firmware:<\/p>\n<pre>#!\/bin\/sh\r\n\r\nfatalError() {\r\n echo \"Fatal Error: $1\"\r\n echo \"fastblink\" &gt; \/tmp\/blueled\r\n exit\r\n}\r\n\r\n#\r\n#Main Entry Point\r\n#\r\n\r\nexec 1&gt;\/dev\/console\r\nexec 2&gt;\/dev\/console\r\n\r\necho \"Starting rc.local\"\r\n\r\necho \"leds-gpio\" &gt; \/sys\/bus\/platform\/drivers\/leds-gpio\/unbind\r\necho \"slowblink\" &gt; \/tmp\/blueled\r\n\/usr\/bin\/ledd\r\n\r\nifconfig eth0 10.123.234.1\r\n\r\n#make sure SD card is detected\r\nif [ ! -e \/dev\/sda ] \r\nthen\r\n sleep 5;\r\n if [ ! -e \/dev\/sda ] \r\n then\r\n fatalError \"No SD card detected\".\r\n fi\r\nfi\r\n\r\n#check whether SD card is partitioned correctly\r\nsdready=\"no\";\r\n[ -e \/dev\/sda1 ] &amp;&amp; [ -e \/dev\/sda2 ] &amp;&amp; [ -e \/dev\/sda3 ] &amp;&amp; sdready=\"yes\"\r\n[ \"$sdready\" = \"yes\" ] || fatalError \"SD card not partitioned correctly\"\r\n\r\n#SD card is formatted properly, fsck it and mount it\r\ne2fsck -y \/dev\/sda3\r\n#sync\r\nmount -t ext4 -o rw,noatime,nodiratime \/dev\/sda3 \/mnt || fatalError \"Mounting SD card failed\"\r\n\r\nfailsafe | grep 'failsafe packet received' &amp;&amp; {\r\n echo \"Entering failsafe mode.\"\r\n exit;\r\n}\r\necho \"Done with rc.local\"\r\n\r\nif [ -f \/mnt\/shares\/usr\/bin\/startcircle ] \r\nthen\r\n source \/mnt\/shares\/usr\/bin\/startcircle\r\nelse\r\n fatalError \"Error: did not find startcircle file\"\r\nfi<\/pre>\n<p>And, here&#8217;s the &#8220;startcircle&#8221; script from the eMMC:<\/p>\n<pre>#!\/bin\/sh\r\n#final boot-up script to start circle functionality\r\n\r\nDIR=\/mnt\/shares\/usr\/bin\r\nexport PATH=$PATH:$DIR\r\necho 3 &gt; \/proc\/sys\/vm\/drop_caches\r\n\r\ncp $DIR\/myreboot \/tmp\/\r\n\r\n#hardcode timezone for now\r\necho PST8PDT,M3.2.0,M11.1.0 &gt; \/etc\/TZ\r\n\r\n#set date to 2000 so we can detect when we get ntp time\r\ndate -s 2015.09.11-00:00\r\n\r\niw dev wlan0 interface add apcli0 type station \r\niw dev wlan0 interface add ra0 type __ap\r\nexport WAN=\"eth0\"\r\nln -s \/sys\/class\/leds\/tp-link\\:green\\:3g\/brightness \/tmp\/blueled\r\nMAC=`ifconfig apcli0 | awk '\/HWaddr\/{print $5;exit;}'`\r\necho \"$MAC\" &gt; \/tmp\/MAC;\r\nETHMAC=`ifconfig eth0 | awk '\/HWaddr\/{print $5;exit;}'`\r\nip link set ra0 address $ETHMAC\r\ngrep \"^8C:E2:DA\" \/tmp\/MAC || {\r\n if [ -s \/etc\/MAC ] ; then\r\n cp -f \/etc\/MAC \/tmp\/MAC;\r\n MAC=`cat \/etc\/MAC`;\r\n ip link set apcli0 address $MAC\r\n else\r\n echo \"8C:E2:DA:F0:F0:01\" &gt; \/tmp\/MAC;\r\n ip link set apcli0 address 8C:E2:DA:F0:F0:01\r\n fi\r\n ip link set ra0 address 8C:E2:DA:F0:F0:00\r\n ifconfig eth0 down\r\n ip link set eth0 address 8C:E2:DA:F0:F0:00\r\n}\r\n\r\n#check base firmware files\r\n[ -f $DIR\/ledd ] &amp;&amp; { diff $DIR\/ledd \/usr\/bin\/ledd &gt; \/dev\/null || { cp -f $DIR\/ledd \/usr\/bin\/ledd; chmod +x \/usr\/bin\/ledd; killall ledd; sleep 1; ledd &amp; } }\r\n#the running ledd may be the ledd in the ROM, before JFFS2 was loaded\r\ndiff \/usr\/bin\/ledd \/rom\/usr\/bin\/ledd &gt; \/dev\/null || { killall ledd; sleep 1; ledd &amp; }\r\ndiff -r $DIR\/scripts\/circle \/etc\/circle &gt; \/dev\/null || { cp -f $DIR\/scripts\/circle\/* \/etc\/circle\/; chmod +x \/etc\/circle\/*; }\r\n\r\n#start mycircle AP\r\nifconfig eth0 0.0.0.0\r\nmacid=`awk -F: '{print $5 $6}' \/tmp\/MAC`\r\ncp -f $DIR\/scripts\/hostapd.conf \/tmp\/;\r\ngrep \"Circle-$macid\" \/tmp\/hostapd.conf &gt; \/dev\/null || sed -i \"s\/^ssid=.*\/ssid=Circle-$macid\/g\" \/tmp\/hostapd.conf\r\ngrep \"MyCircle-$macid\" \/tmp\/hostapd.conf &gt; \/dev\/null &amp;&amp; sed -i \"s\/^ssid=.*\/ssid=Circle-$macid\/g\" \/tmp\/hostapd.conf\r\nmkdir -p \/var\/lib\/misc\/\r\n$DIR\/scripts\/aplist_create.sh\r\n\r\n#PAUSE chain in iptables\r\niptables -N PAUSE\r\niptables -I FORWARD -j PAUSE\r\niptables -t raw -N RAWPAUSE\r\niptables -t raw -A PREROUTING -j RAWPAUSE\r\n#Minecraft Pocket Edition Chain\r\niptables -t raw -N MCPE\r\niptables -t raw -A PREROUTING -j MCPE\r\n\r\n#misc\r\nln -s \/usr\/bin\/wget \/tmp\/\r\n\r\nif [ ! -s $DIR\/configure.xml ]; then\r\n if [ -s $DIR\/configure.xml.backup ]; then\r\n cp $DIR\/configure.xml.backup $DIR\/configure.xml\r\n else\r\n cp $DIR\/configure-default.xml $DIR\/configure.xml\r\n fi\r\nfi\r\n\r\nifconfig apcli0 up\r\niptables -t nat -A PREROUTING -i apcli0 -p udp --dport 53 -j REDIRECT\r\n\r\n#start cron job\r\n$DIR\/tinycron 3600 $DIR\/start_updater.sh\r\n\r\n#install missing packages \r\nif [ ! -s \/usr\/sbin\/ipset ]; then\r\n opkg install $DIR\/pkgs\/libmnl_1.0.3-1_ar71xx.ipk\r\n opkg install $DIR\/pkgs\/kmod-nfnetlink_3.10.49-1_ar71xx.ipk\r\n opkg install $DIR\/pkgs\/kmod-ipt-ipset_3.10.49+6.20.1-1_ar71xx.ipk\r\n opkg install $DIR\/pkgs\/ipset_6.20.1-1_ar71xx.ipk\r\n modprobe ip_set\r\n modprobe ip_set_hash_ip\r\n modprobe ip_set_hash_net\r\n modprobe xt_set\r\nfi\r\n\r\n#ipset init\r\nipset create vpns hash:ip\r\nipset create minecraft hash:ip\r\nipset create games hash:ip\r\nipset create games_net hash:net\r\nwhile read p ; do \r\n if [ ${p:0:1} != \"#\" ]; then\r\n ipset add games_net $p; \r\n fi\r\ndone &lt; $DIR\/scripts\/iprange_games.txt\r\nipset -file $DIR\/scripts\/tor.save -exist restore\r\n\r\n#start services\r\ncp -a $DIR\/service \/var\r\nrunsvdir \/var\/service &gt;\/dev\/null 2&gt;\/dev\/null &amp;\r\n\r\n#dhcp client script will start the rest of the processes\r\n\r\necho 0 &gt; \/proc\/sys\/net\/ipv4\/conf\/all\/send_redirects\r\necho 0 &gt; \/proc\/sys\/net\/ipv4\/conf\/apcli0\/send_redirects\r\necho 0 &gt; \/proc\/sys\/net\/ipv4\/conf\/$WAN\/send_redirects\r\n\r\necho 1 &gt; \/proc\/sys\/net\/ipv4\/conf\/apcli0\/arp_ignore\r\necho 2 &gt; \/proc\/sys\/net\/ipv4\/conf\/apcli0\/arp_announce\r\necho 1 &gt; \/proc\/sys\/net\/ipv4\/conf\/$WAN\/arp_ignore\r\necho 2 &gt; \/proc\/sys\/net\/ipv4\/conf\/$WAN\/arp_announce\r\n\r\necho 8 &gt; \/proc\/sys\/net\/ipv4\/tcp_retries2\r\n\r\nsysctl -w net.ipv4.conf.apcli0.send_redirects=0\r\nsysctl -w net.ipv4.conf.all.send_redirects=0<\/pre>\n<p>Finally, here&#8217;s the output of &#8220;find&#8221; showing all of the files on the eMMC \/dev\/sda3 partition:<\/p>\n<pre>.\r\n.\/shares\r\n.\/shares\/usr\r\n.\/shares\/usr\/bin\r\n.\/shares\/usr\/bin\/sitedbd\r\n.\/shares\/usr\/bin\/pkgs\r\n.\/shares\/usr\/bin\/pkgs\/libmnl_1.0.3-1_ar71xx.ipk\r\n.\/shares\/usr\/bin\/pkgs\/kmod-ipt-ipset_3.10.49+6.20.1-1_ar71xx.ipk\r\n.\/shares\/usr\/bin\/pkgs\/ipset_6.20.1-1_ar71xx.ipk\r\n.\/shares\/usr\/bin\/pkgs\/kmod-nfnetlink_3.10.49-1_ar71xx.ipk\r\n.\/shares\/usr\/bin\/dhcpsniff\r\n.\/shares\/usr\/bin\/startcircle\r\n.\/shares\/usr\/bin\/tracking\r\n.\/shares\/usr\/bin\/tracking\/go\r\n.\/shares\/usr\/bin\/configure.xml.backup\r\n.\/shares\/usr\/bin\/runit\r\n.\/shares\/usr\/bin\/dnsmasq\r\n.\/shares\/usr\/bin\/service\r\n.\/shares\/usr\/bin\/service\/sitedbd\r\n.\/shares\/usr\/bin\/service\/sitedbd\/run\r\n.\/shares\/usr\/bin\/service\/dhcpsniff\r\n.\/shares\/usr\/bin\/service\/dhcpsniff\/run\r\n.\/shares\/usr\/bin\/service\/dhcpsniff\/down\r\n.\/shares\/usr\/bin\/service\/dnsmasq\r\n.\/shares\/usr\/bin\/service\/dnsmasq\/run\r\n.\/shares\/usr\/bin\/service\/goclient\r\n.\/shares\/usr\/bin\/service\/goclient\/run\r\n.\/shares\/usr\/bin\/service\/goclient\/down\r\n.\/shares\/usr\/bin\/service\/pingpongd\r\n.\/shares\/usr\/bin\/service\/pingpongd\/run\r\n.\/shares\/usr\/bin\/service\/timetracker\r\n.\/shares\/usr\/bin\/service\/timetracker\/run\r\n.\/shares\/usr\/bin\/service\/timetracker\/down\r\n.\/shares\/usr\/bin\/service\/arp2\r\n.\/shares\/usr\/bin\/service\/arp2\/run\r\n.\/shares\/usr\/bin\/service\/arp2\/down\r\n.\/shares\/usr\/bin\/service\/abodedaemon\r\n.\/shares\/usr\/bin\/service\/abodedaemon\/run\r\n.\/shares\/usr\/bin\/service\/apid\r\n.\/shares\/usr\/bin\/service\/apid\/run\r\n.\/shares\/usr\/bin\/service\/rclient\r\n.\/shares\/usr\/bin\/service\/rclient\/run\r\n.\/shares\/usr\/bin\/service\/rclient\/down\r\n.\/shares\/usr\/bin\/service\/webd\r\n.\/shares\/usr\/bin\/service\/webd\/run\r\n.\/shares\/usr\/bin\/pingpongd\r\n.\/shares\/usr\/bin\/timetracker\r\n.\/shares\/usr\/bin\/category_data\r\n.\/shares\/usr\/bin\/category_data\/circle.db\r\n.\/shares\/usr\/bin\/arp2\r\n.\/shares\/usr\/bin\/msleep\r\n.\/shares\/usr\/bin\/firmware_updater.sh\r\n.\/shares\/usr\/bin\/dumpsm\r\n.\/shares\/usr\/bin\/photos\r\n.\/shares\/usr\/bin\/oui\r\n.\/shares\/usr\/bin\/oui\/oui.txt\r\n.\/shares\/usr\/bin\/configure-default.xml\r\n.\/shares\/usr\/bin\/mdnsd\r\n.\/shares\/usr\/bin\/wpa_passphrase\r\n.\/shares\/usr\/bin\/abodedaemon\r\n.\/shares\/usr\/bin\/start_updater.sh\r\n.\/shares\/usr\/bin\/notifications.txt\r\n.\/shares\/usr\/bin\/categories.txt\r\n.\/shares\/usr\/bin\/configure.xml\r\n.\/shares\/usr\/bin\/last_api\r\n.\/shares\/usr\/bin\/ledd\r\n.\/shares\/usr\/bin\/arpscan\r\n.\/shares\/usr\/bin\/apid\r\n.\/shares\/usr\/bin\/mini_httpd.pem\r\n.\/shares\/usr\/bin\/category_descriptions.txt\r\n.\/shares\/usr\/bin\/rclient\r\n.\/shares\/usr\/bin\/myreboot\r\n.\/shares\/usr\/bin\/preksites\r\n.\/shares\/usr\/bin\/mdns-scan\r\n.\/shares\/usr\/bin\/log.xml\r\n.\/shares\/usr\/bin\/timezones.txt\r\n.\/shares\/usr\/bin\/scripts\r\n.\/shares\/usr\/bin\/scripts\/update_4G_config.sh\r\n.\/shares\/usr\/bin\/scripts\/aplist_create.sh\r\n.\/shares\/usr\/bin\/scripts\/switch_to_ethernet.sh\r\n.\/shares\/usr\/bin\/scripts\/restart_wifi.sh\r\n.\/shares\/usr\/bin\/scripts\/reboot_circle.sh\r\n.\/shares\/usr\/bin\/scripts\/hostapd.conf\r\n.\/shares\/usr\/bin\/scripts\/tor.save\r\n.\/shares\/usr\/bin\/scripts\/install_firmware.sh\r\n.\/shares\/usr\/bin\/scripts\/reset_circle.sh\r\n.\/shares\/usr\/bin\/scripts\/refresh_hosts.sh\r\n.\/shares\/usr\/bin\/scripts\/circle\r\n.\/shares\/usr\/bin\/scripts\/circle\/program-sd.sh\r\n.\/shares\/usr\/bin\/scripts\/circle\/battery_changed.sh\r\n.\/shares\/usr\/bin\/scripts\/circle\/power_down.sh\r\n.\/shares\/usr\/bin\/scripts\/circle\/factory_default.sh\r\n.\/shares\/usr\/bin\/scripts\/circle\/killall.sh\r\n.\/shares\/usr\/bin\/scripts\/circle\/upgrade_firmware.sh\r\n.\/shares\/usr\/bin\/scripts\/get_hidden_ssid_freq.sh\r\n.\/shares\/usr\/bin\/scripts\/iprange_games.txt\r\n.\/shares\/usr\/bin\/scripts\/gw_ping.sh\r\n.\/shares\/usr\/bin\/scripts\/circle_ap.sh\r\n.\/shares\/usr\/bin\/scripts\/udhcpc.sh\r\n.\/shares\/usr\/bin\/notifications\r\n.\/shares\/usr\/bin\/notifications\/notifications.nextid\r\n.\/shares\/usr\/bin\/notifications\/notifications.tosend\r\n.\/shares\/usr\/bin\/webd\r\n.\/shares\/usr\/bin\/tinycron\r\n.\/shares\/UPDATER_VERSION\r\n.\/shares\/DATABASE_VERSION\r\n.\/shares\/VERSION\r\n.\/update_firmware.sh\r\n.\/update_database.sh<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Circle kernel is based on a standard openwrt build, using the Atheros AP123\/TP-Link TL-MR3420-v2 platform. The boot flash chip is 8 megabytes (SPI), and contains u-boot, the kernel, the startup root filesystem (read-only), and a read-write jffs2 rootfs overlay partition (which is mounted as an overlay on top of the startup root filesystem &#8211; &hellip; <a href=\"http:\/\/www.hackspot.net\/CircleBlog\/2016\/05\/01\/filesystems-and-startup\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Filesystems and startup&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/posts\/51"}],"collection":[{"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/comments?post=51"}],"version-history":[{"count":10,"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/posts\/51\/revisions"}],"predecessor-version":[{"id":61,"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/posts\/51\/revisions\/61"}],"wp:attachment":[{"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/media?parent=51"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/categories?post=51"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hackspot.net\/CircleBlog\/wp-json\/wp\/v2\/tags?post=51"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}