The Dutch five-times world champion beat off competition from Giacomo Nizzolo (RadioShack) and Bruno Matos Sancho (Carmim-Tavira) after a 195km run beginning and ending in Lagoa.
Bos leads team-mate and stage one winner Paul Martens by four seconds on GC with Nizzolo another four seconds back. Martens was unable to finish in the lead group.
Italian Saxo-Tinkoff rider Manuele Boaro secured the mountain jersey by leading a 10-man breakaway - including Dmitry Kozontchuk (Katusha), Sep Vanmarcke (Blanco), Ricardo Garcia (Euskaltel-Euskadi), Bertjan Lindeman (Vacansoleil-DCM Pro Cycling Team), Omar Fraile (Caja Rural), Dalivier Ospina (Colombia), Tomas Metcalfe (Carmim-Tavira), Hugo Sabido (La Aluminios-Antarte) and Alejandro Marque Porto (OFM-Quinta Da Lixa) - which stayed out for most of a stage featuring two categorised climbs.
They built a lead of eight minutes after 82km but with Omega-Pharma then taking control of the peloton, the riders were gradually sucked back in.
Ten became six - Kozontchuk, Vanmarcke, Garcia, Boaro, Marque and Lindeman - and their lead was down to 30 seconds with 10km left to race.
Vanmacke attacked with Marque and Boaro but they were swallowed up with 4km remaining ahead of the final sprint.
1 Theo Bos (Ned) Blanco Pro Cycling Team 4:50:15
2 Giacomo Nizzolo (Ita) RadioShack Leopard
3 Bruno Matos Sancho (Por) Carmim-Tavira
4 Jesus Herrada Lopez (Spa) Movistar Team
5 Kris Boeckmans (Bel) Vacansoleil-DCM Pro Cycling Team
6 Thomas Leezer (Ned) Blanco Pro Cycling Team
7 Alessandro Bazzana (Ita) UnitedHealthcare Pro Cycling Team
8 Pieter Vanspeybrouck (Bel) Topsport Vlaanderen-Baloise
9 Edwin Alcibiades Avila Vanegas (Col) Colombia
10 Michael Morkov (Den) Team Saxo-Tinkoff
11 Samuel José Rodrigues Caldeira (Por) OFM-Quinta Da Lixa
12 Kiel Reijnen (USA) UnitedHealthcare Pro Cycling Team
13 Thomas Sprengers (Bel) Topsport Vlaanderen-Baloise
14 Steffen Radochla (Ger) Euskaltel-Euskadi
15 Jeffry Johan Romero Corredor (Col) Colombia
1 Theo Bos (Ned) Blanco Pro Cycling Team 9:57:30
2 Paul Martens (Ger) Blanco Pro Cycling Team +4
3 Giacomo Nizzolo (Ita) RadioShack Leopard +8
4 Tiago Machado (Por) RadioShack Leopard +8
5 Hugo Sabido (Por) La Aluminios-Antarte +9
6 Eduard Vorganov (Rus) Katusha +9
7 Bruno Matos Sancho (Por) Carmim-Tavira +10
8 Amets Txurruka (Spa) Caja Rural +11
9 Sergio Miguel Moreira Paulinho (Por) Team Saxo-Tinkoff +12
10 Bertjan Lindeman (Ned) Vacansoleil-DCM Pro Cycling Team +12
11 Kris Boeckmans (Bel) Vacansoleil-DCM Pro Cycling Team +14
12 Alessandro Bazzana (Ita) UnitedHealthcare Pro Cycling Team +14
13 Thomas Sprengers (Bel) Topsport Vlaanderen-Baloise +14
14 Samuel José Rodrigues Caldeira (Por) OFM-Quinta Da Lixa +14
15 Thomas Leezer (Ned) Blanco Pro Cycling Team +14