There was drama right from the first play. Melbourne's Nelson Asofa-Solomona ran the ball back at fellow prop Siosiua Taukeiaho, the pair traded blows and both were sin-binned just 19 seconds into the game.
Latrell Mitchell kicked the resultant penalty and also another around the half hour mark.
Those sandwiched the only try of the first half, scored by Roosters second rower Boyd Cordner in the 14th minute.
Cordner was again prominent last night but had only to catch and ground the ball after Daniel Tupou did all the hard work. The wing caught a bomb and then somehow got his pass away surrounded by three Storm tacklers.
Scoring opportunities were limited but the feisty exchanges continued when Roosters five-eighth Luke Keary copped a strong fend in the face from Storm second rower Felise Kaufusi. Keary responded by grabbing a handful of Kaufusi's hair and catching him with a swinging arm. That forced Kaufusi off and an earlier rib injury kept him off.
The Roosters led 8-0 at the break, with the Storm held scoreless in the first half for just the second time this season.
Kiwis prop Asofa-Solomona finally got the Storm on the board 10 minutes into the second half, stretching out to plant the ball on the tryline barely 90 seconds after replacing HIA-bound Jesse Bromwich.
The Roosters thought they'd restored their eight-point advantage heading into the final quarter when Joseph Manu ripped a bomb out of Cameron Munster's arms. But the bunker ruled a hard-to-spot knock-on from fullback James Tedesco while contesting the kick.
There was no denying Tedesco with 12 minutes remaining as he found a gap close to the tryline between Kenny Bromwich and Ryan Papenhuyzen, who clashed heads in their failed attempt to stop him.
Mitchell kicked the conversion to give the Roosters a decisive lead, while Papenhuyzen was forced off in a match littered with head knocks.
Sydney Roosters 14 (Boyd Cordner, James Tedesco tries; Latrell Mitchell con, 2 pens)
Melbourne Storm 6 (Nelson Asofa-Solomona try; Cameron Smith con)
Halftime: 8-0