The attack took place in the early hours of Saturday, with victims shot inside and outside the London Pub, a longstanding hub of Oslo's LGBTQ scene, as well as in the surrounding streets and at one other bar in the centre of the Norwegian capital.
Bili Blum-Jansen, who was in the London Pub, said he fled to the basement to escape the hail of bullets and hid there along with 80 to 100 other people.
"Many called their partners and family, it felt almost as if they were saying goodbye. Others helped calm down those who were extremely terrified," he told TV2.
"I had a bit of panic and thought that if the shooter or shooters were to arrive, we'd all be dead. There was no way out."
A suspect, a 42-year-old Norwegian citizen of Iranian origin, was detained minutes after embarking on the shooting spree, according to police who said they believed he acted alone. Two weapons, including a fully automatic gun, were retrieved from the crime scene, they added.
"There is reason to think that this may be a hate crime," police said. "We are investigating whether the Pride was a target in itself or whether there are other motives."
Other witnesses described the chaos that erupted inside and outside the London Bar, which has been open since 1979.
"Many people were crying and screaming, the injured were screaming, people were distressed and scared - very, very scared," said Marcus Nybakken, 46, who had left the bar shortly before the shooting and returned later to help.
"My first thought was that Pride was the target, so that's frightening."
Journalist Olav Roenneberg of public broadcaster NRK said he was in the area at the time and saw a man arrive with a bag, take out a gun and start to shoot: "Then I saw windows breaking and understood that I had to take cover."
Authorities said that the attack was also being investigated as a possible act of terrorism. It was not clear exactly where the two people were killed in the area of the London Bar.
NORWAY POLICE TO CARRY GUNS
Norwegian police, who are not normally armed, will now carry guns until further notice as a precaution, national chief Benedicte Bjoernland said. Norway's PST intelligence service added that it was investigating whether there could be further attacks. "For now we have no indication of that," PST said.
The organisers of Oslo Pride cancelled Saturday's parade, citing police advice. "We will soon be proud and visible again, but today we will mark Pride celebrations at home," they said.
King Harald of Norway said he and the royal family were devastated by the attack, which police said also left 10 people seriously wounded and 11 with minor injuries.
"We must stand together and defend our values: freedom, diversity and respect for each other," the 85-year-old monarch added.
The shooting took place just months after Norway marked 50 years since the abolition of a law that criminalised gay sex. The suspect was known to authorities, including for violence of a less severe nature, police said.
The Nordic nation of 5.4 million has lower crime rates than many Western countries, though it has experienced hate-motivated shootings, including when far-right extremist Anders Behring Breivik killed 77 people in 2011.