Wrote the installation chapter

Change-Id: Ib7792e26472116277c2e03395a2eda0ab326d499
diff --git a/installation.rst b/installation.rst
index 3d16a28..2edeecb 100644
--- a/installation.rst
+++ b/installation.rst
@@ -1,20 +1,570 @@
+.. |onos_version| replace:: 1.12.2
+
 Installation
 ************
 
-BOM
-===
+Topology
+========
+Trellis supports various topology, from a single switch to a full multi-stage leaf-spine fabric.
 
-Edgecore Switches
-=================
-
-
-QCT Switches
-============
-
-
-Delta Switches
-==============
+- **Single switch**: This is the minimum Trellis setup. In this setup, all servers are connected to a single switch.
+- **Paired switches**: Compared to single switch, it provides more redundancy in terms of server NIC failure and link failure.
+- **Single-stage leaf-spine**: Compared to single switch, it offers more redundancy in terms of switch failure and provides better scalability.
+- **Single-stage leaf-spine with paired switches**: It supports all the redundancy and scalability features mentioned above.
+- **Multi-stage leaf-spine**: Multi-stage is specifically designed for telco service providers.
+  The first stage can be installed in the central office, while the second stage can be installed in a field office that is closer to the subscribers.
+  Two stages are typically connected via long distance optical transport.
 
 
 Trellis in a Box (TiaB)
 =======================
+Trellis in a Box (TiaB) is a software emulated environment that allows people to run Trellis without hardware switches.
+It is the most convenient and **recommended option for beginners who would like to quickly get some hands on experience** of Trellis.
+It is also useful for developers who would like to easily verify their code in early development stages.
+
+TiaB is currently hosted in a GitHub repository separated from ONOS.
+The source code and user guide of TiaB can be found `here <https://github.com/opennetworkinglab/routing/tree/master/trellis>`_.
+
+
+Hardware Requirements
+=====================
+Following is a list of hardware that people from the ONF community have tested over time in lab trials.
+
+Switches
+--------
+
+1G/10G models (with 40G uplinks)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    - OCP Accepted™ EdgeCore AS5712-54X
+    - OCP Accepted™ EdgeCore AS5812-54X
+    - QCT QuantaMesh T3048-LY8
+    - Delta AG7648
+    - Inventec D6254 (verified by Inventec)
+
+25G models (with 100G uplinks)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    - QuantaMesh BMS T7032-IX1/IX1B (with 25G breakout cable)
+    - Inventec D7054Q28B (verified by Inventec)
+
+40G models
+^^^^^^^^^^
+    - OCP Accepted™ EdgeCore AS6712-32X
+
+100G models
+^^^^^^^^^^^
+    - OCP Accepted™ EdgeCore AS7712-32X
+    - QCT QuantaMesh BMS T7032-IX1/IX1B
+    - OCP Accepted™ Inventec D7032Q28B (verified by Inventec)
+
+Commercially supported models
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Models listed here are not supported by ONF community. You should contact switch vendor for commercial support.
+    - OCP Accepted™ EdgeCore AS5912-54X
+
+
+Servers
+-------
+ONOS can be run on any x86 servers, with the following notes on memory and CPU allocation:
+
+    - Memory
+        The memory requirement highly depends on the deployment scale.
+        In general, we suggest that each ONOS instance should get **at least 16G RAM**.
+        For production deployment at scale, we will definitely need not only more memory but also some fine tuning on JVM garbage collection mechanism.
+    - CPU
+        There are not much requirement on CPU.
+        In practice, we avoid running other CPU intensive processes/containers/VMs on the same physical machine where ONOS runs.
+
+
+Install Controller - ONOS
+=========================
+You could run Trellis with a `single instance of ONOS <https://wiki.onosproject.org/display/ONOS/Local+workflow>`_. But it is recommended to run ONOS as a cluster.
+
+The idea is to have a "build machine", where you host and build ONOS source code. But to launch it in operation you use other "target machines" (VMs, containers or servers).
+Typically we use `STC <https://wiki.onosproject.org/pages/viewpage.action?pageId=12421025>`_ to launch ONOS ins 3 target machines which form a ONOS cluster.
+
+
+Download ONOS |onos_version|
+---------------------------------
+Trellis currently is released as part of ONOS and therefore it follows ONOS version number.
+This document is written based on ONOS |onos_version|.
+
+You can find more information about how to setup build environment and fetch ONOS source code from `Development Environment Setup <https://wiki.onosproject.org/display/ONOS/Development+Environment+Setup>`_.
+
+
+Prepare Your Target Machine
+---------------------------
+Please refer to `target machines requirements <https://wiki.onosproject.org/display/ONOS/Cells+and+ONOS+test+scripts#CellsandONOStestscripts-Targetmachinesrequirements>`_ for details (you only have to do this once).
+
+You do not need to follow the directions for the "Mininet Target Machine" if you are using hardware switches.
+
+
+Create a Cell File
+--------------------
+We need to compose a cell file in order to give the information about target machines to the build machine. Please refer to `test cells <https://wiki.onosproject.org/display/ONOS/Cells+and+ONOS+test+scripts#CellsandONOStestscripts-TestCells>`_ for details. For example:
+
+.. code-block:: bash
+
+    export ONOS_CELL=menlo
+    export OC1=10.128.0.216
+    export OC2=10.128.0.217
+    export OC3=10.128.0.218
+    export ONOS_APPS=drivers,gui,openflow,segmentrouting,fpm,dhcprelay,routeradvertisement,hostprobingprovider,t3
+    export ONOS_USER=admin
+    export ONOS_GROUP=admin
+    export ONOS_USE_SSH=true
+    export ONOS_WEB_USER=onos
+    export ONOS_WEB_PASS=rocks
+
+- ``OC1, OC2, OC3`` are the IP addresses of the 3 target machines where the ONOS cluster will be deployed.
+- ``ONOS_APPS`` are the apps you want to automatically deploy at launch.
+
+    - ``drivers`` includes drivers for various devices and pipelines. Always required.
+    - ``gui`` enables graphic user interface. Highly recommended.
+    - ``openflow`` is a meta app that loads ``openflow-base``, ``lldpprovider`` and ``hostprovider``. Always required.
+    - ``segmentrouting`` controls forwarding in the fabric. Always required.
+    - ``fpm`` (Forwarding Plane Manager) exchanges forwarding information with Quagga. Required if connecting to external router.
+    - ``dhcprelay`` relays DHCP packets between clients and servers. Required if using DHCP to configure IP addresses for hosts
+    - ``routeradvertisement`` periodically sends IPv6 router advertisement packets on configured interfaces. Required if using IPv6
+    - ``hostprobingprovider`` probes and verifies locations of dual-homed hosts. Required if using dual-homing feature with paired switches
+    - ``t3`` (Trellis Troubleshooting Tool) is very useful for debugging. Highly recommended.
+
+- ``ONOS_USER`` is used to login to the target machines,
+  and the password is not required as you have setup the target machines for password-less access over ssh.
+
+Once that's done, you can use the ``cell`` command to load the cell file.
+
+.. code-block:: console
+
+    $ source onos/tools/dev/bash_profile
+    $ cell menlo
+
+
+Check Your Target Environment
+-----------------------------
+Check if your environment is OK with ``stc prerequisites`` (you only have to do this once).
+
+.. code-block:: console
+
+    $ stc prerequisites
+    2017-02-07 12:10:23  Prerequisites started
+    2017-02-07 12:10:23  Check-Passwordless-Login-1 started -- ssh -n -o ConnectTimeout=3 -o PasswordAuthentication=no admin@10.128.0.216 date
+    2017-02-07 12:10:23  Check-ONOS-Bits started -- onos-check-bits
+    2017-02-07 12:10:23  Check-Passwordless-Login-3 started -- ssh -n -o ConnectTimeout=3 -o PasswordAuthentication=no admin@10.128.0.218 date
+    2017-02-07 12:10:23  Check-Passwordless-Login-2 started -- ssh -n -o ConnectTimeout=3 -o PasswordAuthentication=no admin@10.128.0.217 date
+    2017-02-07 12:10:23  Check-Environment started -- test -n /Users/sauravdas/onos -a -n 10.128.0.* -a -n 10.128.0.216
+    2017-02-07 12:10:23  Check-Environment completed
+    2017-02-07 12:10:23  Check-Passwordless-Login-1 completed
+    2017-02-07 12:10:23  Check-Passwordless-Login-2 completed
+    2017-02-07 12:10:23  Check-Passwordless-Login-3 completed
+    2017-02-07 12:10:25  Check-ONOS-Bits completed
+    2017-02-07 12:10:25  Prerequisites completed
+    0:01 Passed! 6 steps succeeded
+
+
+Launch STC Command
+------------------
+Finally launch with ``stc setup`` once you have built ONOS. Here is what it looks like when I launch
+
+.. code-block:: console
+
+    $ stc setup
+    2016-12-23 12:26:44  Setup started
+    2016-12-23 12:26:44  Uninstall-3 started -- onos-uninstall 10.128.0.218
+    2016-12-23 12:26:44  Uninstall-2 started -- onos-uninstall 10.128.0.217
+    2016-12-23 12:26:44  Uninstall-1 started -- onos-uninstall 10.128.0.216
+    2016-12-23 12:26:44  Push-Bits-2 started -- onos-push-bits 10.128.0.217
+    2016-12-23 12:26:44  Push-Bits-3 started -- onos-push-bits 10.128.0.218
+    2016-12-23 12:26:44  Push-Bits-1 started -- onos-push-bits 10.128.0.216
+    2016-12-23 12:26:45  Push-Bits-1 completed
+    2016-12-23 12:26:46  Push-Bits-2 completed
+    2016-12-23 12:26:46  Push-Bits-3 completed
+    2016-12-23 12:26:46  Uninstall-3 completed
+    2016-12-23 12:26:46  Kill-3 started -- onos-kill 10.128.0.218
+    2016-12-23 12:26:46  Uninstall-2 completed
+    2016-12-23 12:26:46  Kill-2 started -- onos-kill 10.128.0.217
+    2016-12-23 12:26:46  Uninstall-1 completed
+    2016-12-23 12:26:46  Kill-1 started -- onos-kill 10.128.0.216
+    2016-12-23 12:26:46  Kill-3 completed
+    2016-12-23 12:26:46  Install-3 started -- onos-install 10.128.0.218
+    2016-12-23 12:26:46  Kill-1 completed
+    2016-12-23 12:26:46  Install-1 started -- onos-install 10.128.0.216
+    2016-12-23 12:26:46  Kill-2 completed
+    2016-12-23 12:26:46  Install-2 started -- onos-install 10.128.0.217
+    2016-12-23 12:26:52  Install-2 completed
+    2016-12-23 12:26:52  Secure-SSH-2 started -- onos-secure-ssh -u onos -p rocks 10.128.0.217
+    2016-12-23 12:26:52  Install-1 completed
+    2016-12-23 12:26:52  Secure-SSH-1 started -- onos-secure-ssh -u onos -p rocks 10.128.0.216
+    2016-12-23 12:26:52  Install-3 completed
+    2016-12-23 12:26:52  Secure-SSH-3 started -- onos-secure-ssh -u onos -p rocks 10.128.0.218
+    2016-12-23 12:27:07  Secure-SSH-1 completed
+    2016-12-23 12:27:07  Wait-for-Start-1 started -- onos-wait-for-start 10.128.0.216
+    2016-12-23 12:27:09  Secure-SSH-3 completed
+    2016-12-23 12:27:09  Wait-for-Start-3 started -- onos-wait-for-start 10.128.0.218
+    2016-12-23 12:27:13  Secure-SSH-2 completed
+    2016-12-23 12:27:13  Wait-for-Start-2 started -- onos-wait-for-start 10.128.0.217
+    2016-12-23 12:27:14  Wait-for-Start-1 completed
+    2016-12-23 12:27:14  Check-Components-1 started -- onos-check-components 10.128.0.216
+    2016-12-23 12:27:14  Check-Nodes-1 started -- onos-check-nodes 10.128.0.216
+    2016-12-23 12:27:14  Wait-for-Start-3 completed
+    2016-12-23 12:27:14  Check-Nodes-3 started -- onos-check-nodes 10.128.0.218
+    2016-12-23 12:27:14  Check-Components-3 started -- onos-check-components 10.128.0.218
+    2016-12-23 12:27:16  Wait-for-Start-2 completed
+    2016-12-23 12:27:16  Check-Nodes-2 started -- onos-check-nodes 10.128.0.217
+    2016-12-23 12:27:16  Check-Components-2 started -- onos-check-components 10.128.0.217
+    2016-12-23 12:27:18  Check-Nodes-1 completed
+    2016-12-23 12:27:18  Check-Nodes-3 completed
+    2016-12-23 12:27:19  Check-Nodes-2 completed
+    2016-12-23 12:27:20  Check-Components-1 completed
+    2016-12-23 12:27:20  Check-Apps-1 started -- onos-check-apps 10.128.0.216 drivers,gui,openflow,segmentrouting,fpm,dhcprelay,routeradvertisement,t3,hostprobingprovider includes
+    2016-12-23 12:27:20  Check-Logs-1 started -- onos-check-logs 10.128.0.216
+    2016-12-23 12:27:20  Check-Components-3 completed
+    2016-12-23 12:27:20  Check-Apps-3 started -- onos-check-apps 10.128.0.218 drivers,gui,openflow,segmentrouting,fpm,dhcprelay,routeradvertisement,t3,hostprobingprovider includes
+    2016-12-23 12:27:20  Check-Logs-3 started -- onos-check-logs 10.128.0.218
+    2016-12-23 12:27:20  Check-Apps-1 completed
+    2016-12-23 12:27:20  Check-Apps-3 completed
+    2016-12-23 12:27:20  Check-Logs-1 completed
+    2016-12-23 12:27:20  Check-Logs-3 completed
+    2016-12-23 12:27:21  Check-Components-2 completed
+    2016-12-23 12:27:21  Check-Logs-2 started -- onos-check-logs 10.128.0.217
+    2016-12-23 12:27:21  Check-Apps-2 started -- onos-check-apps 10.128.0.217 drivers,gui,openflow,segmentrouting,fpm,dhcprelay,routeradvertisement,t3,hostprobingprovider includes
+    2016-12-23 12:27:21  Check-Apps-2 completed
+    2016-12-23 12:27:21  Check-Logs-2 completed
+    2016-12-23 12:27:21  Setup completed
+    0:36 Passed! 31 steps succeeded
+
+
+Useful Utilities
+----------------
+- Push network configuration to one particular instance of ONOS (all instances will automatically get the same configuration)
+
+    .. code-block:: console
+
+        $ onos-netcfg $OC1 network-cfg.json
+
+- Remotely log in to CLI of one particular ONOS instance
+
+    .. code-block:: console
+
+        $ onos $OC1
+
+- Remotely access the log of one particular ONOS instance
+
+    .. code-block:: console
+
+        $ onos-log $OC1
+
+
+Install Switch OS - ONL
+=======================
+The switches listed in the `Hardware Requirements`_ section are shipped with Open Networking Install Environment (ONIE) boot loader.
+After booting up, we should see the ONIE prompt from console.
+Here we assume that the management port on the switch already has Internet access. (via DHCP)
+
+
+Enter ONIE
+----------
+
+
+Has no ONL or Has ONL 1.x previously installed
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The way to install ONL 2.x is the same as ONL 1.x.
+However, if you have no ONL installed or have older version of ONL, you might find it tricky to (re)install a newer version.
+Here's the instruction:
+
+    1. Plug in the console cable and reboot the switch
+    2. (If your boot loader is grub) When you see the boot menu, select **ONIE -> ONIE: Rescue**
+    3. (If your boot loader is uboot) When you see **Hit any key to stop autoboot** instead of the boot menu,
+       press any key and then enter ``run onie_rescue`` to enter ONIE rescue mode.
+
+Has ONL 2.x previously installed
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+It would be much more easier to reboot into ONIE if you have a previously installed ONL 2. Simply run:
+
+
+.. code-block:: console
+
+    # onl-onie-boot-mode rescue
+    # reboot
+
+Available ONIE modes are: *install, rescue, uninstall, update, embed, diag, none*.
+This can be helpful when you are in a normal ONL and want to upgrade your system.
+
+
+Install ONL
+-----------
+At the ONIE prompt, we need to download and install ONL. To fetch and install the latest compatible ONL, run:
+
+.. code-block:: console
+
+    ONIE:/ # wget https://github.com/opencord/OpenNetworkLinux/releases/download/2017-10-19.2200-1211610/ONL-2.0.0_ONL-OS_2017-10-19.2200-1211610_AMD64_INSTALLED_INSTALLER
+    ONIE:/ # sh ONL-2.0.0_ONL-OS_2017-10-19.2200-1211610_AMD64_INSTALLED_INSTALLER
+
+**Checksum**: *sha256:2db316ea83f5dc761b9b11cc8542f153f092f3b49d82ffc0a36a2c41290f5421*
+
+The switch will automatically reboot into ONL after installation. Default login credential of ONL is: ``root/onl``
+
+We might want to configure a fixed IP address for the management interface.
+First edit ``/etc/network/interfaces`` and configure ``ma1``, which is the management interface.
+
+.. code-block:: text
+
+    auto ma1
+    iface ma1 inet static
+    address 10.128.10.128
+    netmask 255.255.0.0
+    gateway 10.128.0.1
+    dns-nameservers 192.168.1.1 8.8.8.8
+
+
+Install Switch Agent - OF-DPA
+=============================
+
+
+Community vs. Premium Version
+-----------------------------
+The OF-DPA image we distribute for free with Trellis is a community version.
+This documentation is also written based on the community version.
+The community version has most of the features available and therefore it is good for small scale deployments such as lab trials.
+However, we highly recommend you to get the premium version from Broadcom if you are aiming for production deployments at scale.
+
+
+Install OF-DPA
+--------------
+We need to use different OF-DPA images depending on the switch model you are using.
+Please find the installer URL corresponding to each switch model in the `Vendor Specific Information`_ section.
+
+Copy the image to the switch and start the installation process by running:
+
+.. code-block:: console
+
+    $ scp ${OFDPA_DEB} ${SWITCH_IP}:/root
+    $ dpkg -i --force-overwrite /root/${OFDPA_DEB}
+
+For example, assuming the OF-DPA image is ``ofdpa_3.0.5.5+accton1.7-1_amd64.deb`` and the switch management IP is ``10.128.0.201``, you should run:
+
+.. code-block:: console
+
+    $ scp ofdpa_3.0.5.5+accton1.7-1_amd64.deb 10.128.0.201:/root
+    $ dpkg -i --force-overwrite /root/ofdpa_3.0.5.5+accton1.7-1_amd64.deb
+
+
+Connect Switch to Controller
+============================
+
+
+Start OF-DPA and OpenFlow Agent
+-------------------------------
+The OFDPA software and the Indigo agent are now a single process launched by Linux service. First of all, we need to configure **/etc/ofagent/ofagent.conf**.
+Uncomment and edit the following line. Make sure all other lines stay commented.
+
+.. code-block:: bash
+
+    OPT_ARGS="-t <controller_ip_1> -t <controller_ip_2> -t <controller_ip_3> -i <dpid>"
+
+We can choose to run OF-DPA in **debug mode**
+
+.. code-block:: bash
+
+    OPT_ARGS="-d 2 -c 2 -c 4 -t <controller_ip_1> -t <controller_ip_2> -t <controller_ip_3> -i <dpid>"
+
+- To start the ofagent, run ``service ofagentd start``
+- To stop the agent, run ``service ofagentd stop``
+- More ``ofagentapp`` options can be found by running ``ofagentapp --help``
+
+
+Start OF-DPA and OpenFlow Agent with listen option
+--------------------------------------------------
+An optional ``-l`` parameter can be added for switch to listen on specific **IP:port**.
+This allows us to use tools like **ovs-ofctl** or **dpctl** to connect and control the switch.
+
+.. code-block:: bash
+
+    OPT_ARGS="-t <controller_ip_1> -t <controller_ip_2> -t <controller_ip_3> -i <dpid> -l <ip>:<port>"
+
+To connect to the switch using **ovs-ofctl**, you can use commands such as
+
+.. code-block:: console
+
+    $ ovs-ofctl -O OpenFlow13 show tcp:<ip>:<port>
+    $ ovs-ofctl -O OpenFlow13 dump-flows tcp:<ip>:<port>
+    $ ovs-ofctl -O OpenFlow13 dump-groups tcp:<ip>:<port>
+    $ ovs-ofctl -O OpenFlow13 add-flow tcp:<ip>:<port> table=60,priority=40000,eth_type=0x0800,ip_dst=55.55.55.55,actions=controller
+
+For more command, please see ``ovs-ofctl --help`` or the post `OpenvSwitch ovs-ofctl and OF-DPA <https://blog.pichuang.com.tw/20170106-ovs-ofctl-and-ofdpa/>`_.
+
+
+Vendor Specific Information
+===========================
+
+
+Edgecore
+--------
+
+- OF-DPA Image
+    - `EdgeCore 5712-54X / 5812-54X / 6712-32X / 7712-32X <https://raw.githubusercontent.com/onfsdn/atrium-docs/master/16A/ONOS/builds/ofdpa_3.0.5.5%2Baccton1.7-1_amd64.deb>`_ - **Checksum**: *sha256:db228b6e79fb15f77497b59689235606b60abc157e72fc3356071bcc8dc4c01f*
+
+- Configure Port Speed and Breakout
+    - By default all the switch ports are running at maximum speed. The port speed can be modified in **/etc/accton/ofdpa.conf**
+
+      .. code-block:: text
+
+          port_speed_1=1000   # configure front port 1 to run at 1G
+
+    - We can also configure the same file to use break out cables on certain ports.
+
+      .. code-block:: text
+
+          port_mode_1=4x10g    # configure front port 1 to break out from 40G to 4x10G
+
+    OF-DPA service needs to be restarted after modifying this configuration.
+
+
+QCT
+---
+
+- OF-DPA Image
+    - `QuantaMesh T3048-LY8 <https://raw.githubusercontent.com/onfsdn/atrium-docs/master/16A/ONOS/builds/ofdpa-ag7648_0.3.0.5.6_amd64.deb>`_ - **Checksum**: *sha256:f8201530b1452145c1a0956ea1d3c0402c3568d090553d0d7b3c91a79137da9e*
+    - `QuantaMesh T7032-IX1 / IX1B <https://raw.githubusercontent.com/onfsdn/atrium-docs/master/16A/ONOS/builds/ofdpa-ix1_0.3.0.5.0-EA5-qct-01.00_amd64.deb>`_ **Checksum**: *sha256:278b8ffed8a8fc705a1b60d16f8e70377e78342a27a11568a1d80b1efd706a46*
+
+
+Delta
+-----
+
+- OF-DPA Image
+    - `Delta AG7648 <https://raw.githubusercontent.com/onfsdn/atrium-docs/master/16A/ONOS/builds/ofdpa-ly8_0.3.0.5.0-EA5-qct-01.01_amd64.deb>`_ - **Checksum**: *sha256:ddfc13cb98ca47291dce5e6938b1d65f0b99bbe77f0585e36ac0007017397f23*
+
+- Special instructions to install ONL
+    Make sure ``/etc/machine.conf`` looks like the following in ONIE before running ONL installation script:
+
+    .. code-block:: text
+
+        onie_platform=x86_64-delta_<platform name>-r0
+        onie_machine=delta_<platform name>
+
+    After the installation of ONL, if you don't see '/usr/bin' in your PATH variable, please run the following command:
+
+    .. code-block:: console
+
+        # export PATH=$PATH:/usr/bin
+
+- Special instructions to use optical SFP cables
+    If optical SFP cables are not coming up, please use the following command to launch OF-DPA:
+
+    .. code-block:: console
+
+        # ./launcher ofagentapp -t <controller_ip_1> -t <controller_ip_2> -t <controller_ip_3> -i <dpid>
+
+Useful Information
+==================
+
+
+OF-DPA Commands
+---------------
+There are some useful OF-DPA commands under ``/usr/bin/``
+
+.. code-block:: text
+
+    client_cfg_purge
+    client_debugcomp
+    client_drivshell
+    client_flowtable_dump
+    client_meter_dump
+    client_port_table_dump
+    client_tunnel_dump
+    client_classcolortable_dump
+    client_debuglvl
+    client_event
+    client_grouptable_dump
+    client_oam_dump
+    client_queue_config
+
+
+ONL Boot Mode
+-------------
+OFDPA offers two boot mode: **INSTALLED** and **SWI**.
+
+- In **INSTALLED** mode, ONL mounts the root filesystem from /dev/sdb7 which is a flash drive that persists everything even during a power cycle.
+- In **SWI** mode, ONL will load the root filesystem from a read-only image (\*.swi) and put the modified files in an copy-on-write overlay filesystem.
+  The change will not be persisted during a power cycle.
+  The pros and cons are obvious. INSTALLED mode is more convenient while SWI mode is more error-safe.
+
+The boot mode will be determined by which image we used install ONL. We use the **INSTALLED** mode in this instruction for simplicity.
+But we can still change it after the installation. Here's the instruction:
+
+.. code-block:: console
+
+    # mount /mnt/onl/boot -o remount,rw
+    # sed -i 's/BOOTMODE=INSTALLED/BOOTMODE=SWI/g' /mnt/onl/boot/boot-config
+    # reboot
+
+
+Persistence Mechanism
+---------------------
+INSTALLED mode already persists everything for you. This section is mainly for SWI mode.
+
+The mechanism to persist files on the switch is different from ONL 1.x to ONL 2.x.
+Following are the steps required to persist a file (e.g. OFDPA package) in ONL 2.x.
+
+- Files put in **/mnt/onl/data** will be persisted automatically.
+- To install a deb package during start-up, put the deb file under **/mnt/onl/data/install-debs** folder and
+  create a plain text file **/mnt/onl/data/install-debs/list** with all the filename of the deb (e.g. ofdpa_3.0.5.5+accton1.7-1_amd64.deb)
+- To execute some command during start-up, put the command in **/mnt/onl/data/rc.boot**
+
+  .. code-block:: bash
+
+      # set static ip and route (dhcp by default)
+      echo 'ip addr add 10.128.0.203/16 dev ma1' >> /mnt/onl/data/rc.boot
+      echo 'ip route add default via 10.128.0.1' >> /mnt/onl/data/rc.boot
+      # grant executable permission
+      chmod a+x /mnt/onl/data/rc.boot
+
+See `PersistWorkflow.md <https://github.com/opencomputeproject/OpenNetworkLinux/blob/master/docs/PersistWorkflow.md>`_ for more detail.
+
+
+Build a Customized ONL Image
+----------------------------
+Sometimes we need to build our own ONL image from source to include some extra files. (The most common case is a modified /etc/network/interfaces).
+The instruction of build process has already been well-documented in ONL repo `Building.md <https://github.com/opencomputeproject/OpenNetworkLinux/blob/master/docs/Building.md>`_.
+But you might find it a little bit tricky to inject some extra files.
+To do that, you need to put the files under **$ONL_ROOT/builds/any/rootfs/jessie/common/overlay/** and then run the make command again.
+
+
+Recovery from a Faulty ONL Install
+----------------------------------
+If, for some reason, the ONL install process fails, you may be brought to the grub rescue prompt upon reboot.
+You may or may not find system files, or even basic grub rescue commands (i.e. 'help').
+There are two options for returning to a (known working) ONIE prompt.
+
+1. **Reinstaller** - You should be able to acquire an ISO image for resetting the firmware to factory default from your switch vendor.
+   Once you have the ISO, you can either use PXE or a live USB to boot the switch into the image.
+2. **Manually boot to ONIE** - If the files are there, you can manually configure GRUB to load the necessary modules to boot back into ONIE.
+
+   .. code-block:: console
+
+       # This should be the partition on the ONIE partition on the AS6712.
+       # It might be hd1 or hd0. Change appropriately.
+       grub rescue> ls (hd0,gpt2)/
+       ./ ../ lost+found/ onie/ grub/ grubenv
+
+       # These instructions will load the kernel and ONIE initrd.
+       grub rescue> set prefix=(hd0,gpt2)/grub
+       grub rescue> set root=(hd0,gpt2)
+       grub rescue> insmod normal
+       grub rescue> insmod linux
+       grub rescue> ls /onie
+       ./ ../ vmlinuz-3.2.35-onie initrd.img-3.2.35-onie tools/ grub/ grub.d/ config/
+
+       # if the ",115200n8" is omitted, baud rate defaults to 9600.
+       grub rescue> linux /onie/vmlinuz-3.2.35-onie console=tty0 console=ttyS1,115200n8
+       grub rescue> initrd /onie/initrd.img-3.2.35-onie
+
+       # The system will not boot into ONIE and you can recover or re-install from there.
+       grub rescue> boot
+
+Once back at the ONIE prompt, you can try to install ONL by following the same steps again.
+
+
+Reference
+---------
+- `ONL/OF-DPA installation guide by Edgecore Networks <https://www.youtube.com/watch?v=mCUtkIc_hVI>`_
+- `ONL/OF-DPA cheat sheet by Phil Huang <https://blog.pichuang.com.tw/20170104-ofdpa-with-onl-cheat-sheet/>`_